#!/usr/bin/env perl -l
use strict;
use warnings;
use List::Util qw{sum};
my @test_arrays = (
[1, 3, 8, 4],
[1, 6, 2],
[1, 3, 5, 7],
[4, 3, 2, 2, 1],
[4, 3, 2, 2, 2, 2, 1],
[5, 5, 4, 6, 2, 8, 1, 9],
);
check_arrays($_) for @test_arrays;
sub check_arrays {
my @full_array = @{shift()};
print "Checking: (", join(", " => @full_array), ")";
my $sum = sum @full_array;
if ($sum % 2) {
print "\tSubsets not equal";
return;
}
my $half = $sum / 2;
my (@a1, @a2);
for (sort { $b <=> $a } @full_array) {
push @{(sum(@a1) || 0) + $_ <= $half ? \@a1 : \@a2} => $_;
}
print "\tSubsets: (", join(", " => sort { $a <=> $b } @a1),
") and (", join(", " => sort { $a <=> $b } @a2), ")";
print "\tSubset sum = $half";
}
####
$ pm_split_equal_sums.pl
Checking: (1, 3, 8, 4)
Subsets: (8) and (1, 3, 4)
Subset sum = 8
Checking: (1, 6, 2)
Subsets not equal
Checking: (1, 3, 5, 7)
Subsets: (1, 7) and (3, 5)
Subset sum = 8
Checking: (4, 3, 2, 2, 1)
Subsets: (2, 4) and (1, 2, 3)
Subset sum = 6
Checking: (4, 3, 2, 2, 2, 2, 1)
Subsets: (1, 3, 4) and (2, 2, 2, 2)
Subset sum = 8
Checking: (5, 5, 4, 6, 2, 8, 1, 9)
Subsets: (1, 2, 8, 9) and (4, 5, 5, 6)
Subset sum = 20
####
#!/usr/bin/env perl -l
use strict;
use warnings;
use List::Util qw{sum};
use Test::More;
my @test_equal_subsets = (
[1, 3, 8, 4],
[1, 3, 5, 7],
[4, 3, 2, 2, 1],
[4, 3, 2, 2, 2, 2, 1],
[5, 5, 4, 6, 2, 8, 1, 9],
[1, 1],
[2, 2],
[],
[0],
[0, 0],
[0, 0, 0],
[0, 0, 0, 0],
);
my @test_unequal_subsets = (
[1, 6, 2],
[7, 5, 3, 3],
[8, 4, 4, 7, 6, 3],
[0, 1],
[1, 2],
[1],
[2],
);
plan tests => scalar @test_equal_subsets + scalar @test_unequal_subsets;
for (@test_equal_subsets) {
is(check_arrays($_), 1, 'Expecting equal subsets.');
}
for (@test_unequal_subsets) {
is(check_arrays($_), 0, 'Not expecting equal subsets.');
}
sub check_arrays {
my $full_array = shift;
print "Checking: (", join(", " => @$full_array), ")";
if (! grep { $_ } @$full_array) {
print "\tSubsets: (", join(", " => @$full_array), ') and ()';
print "\tSubset sum = 0";
return 1;
}
my $full_sum = sum @$full_array;
if ($full_sum % 2) {
print "\tSubsets not equal.";
return 0;
}
my $half_sum = $full_sum / 2;
my (@a1, @a2);
my $a1_total = 0;
for (sort { $b <=> $a } @$full_array) {
if ($a1_total + $_ <= $half_sum) {
push @a1, $_;
$a1_total += $_;
}
else {
push @a2, $_;
}
}
if ($a1_total == $half_sum) {
print "\tSubsets: (", join(", " => sort { $a <=> $b } @a1),
") and (", join(", " => sort { $a <=> $b } @a2), ")";
print "\tSubset sum = $half_sum";
return 1;
}
else {
print "\tSubsets not equal.";
return 0
}
}
####
$ prove pm_split_equal_sums.pl
pm_split_equal_sums.pl .. ok
All tests successful.
Files=1, Tests=19, 0 wallclock secs ( 0.03 usr 0.01 sys + 0.02 cusr 0.00 csys = 0.06 CPU)
Result: PASS
####
$ pm_split_equal_sums.pl
1..19
Checking: (1, 3, 8, 4)
Subsets: (8) and (1, 3, 4)
Subset sum = 8
ok 1 - Expecting equal subsets.
Checking: (1, 3, 5, 7)
Subsets: (1, 7) and (3, 5)
Subset sum = 8
ok 2 - Expecting equal subsets.
Checking: (4, 3, 2, 2, 1)
Subsets: (2, 4) and (1, 2, 3)
Subset sum = 6
ok 3 - Expecting equal subsets.
Checking: (4, 3, 2, 2, 2, 2, 1)
Subsets: (1, 3, 4) and (2, 2, 2, 2)
Subset sum = 8
ok 4 - Expecting equal subsets.
Checking: (5, 5, 4, 6, 2, 8, 1, 9)
Subsets: (1, 2, 8, 9) and (4, 5, 5, 6)
Subset sum = 20
ok 5 - Expecting equal subsets.
Checking: (1, 1)
Subsets: (1) and (1)
Subset sum = 1
ok 6 - Expecting equal subsets.
Checking: (2, 2)
Subsets: (2) and (2)
Subset sum = 2
ok 7 - Expecting equal subsets.
Checking: ()
Subsets: () and ()
Subset sum = 0
ok 8 - Expecting equal subsets.
Checking: (0)
Subsets: (0) and ()
Subset sum = 0
ok 9 - Expecting equal subsets.
Checking: (0, 0)
Subsets: (0, 0) and ()
Subset sum = 0
ok 10 - Expecting equal subsets.
Checking: (0, 0, 0)
Subsets: (0, 0, 0) and ()
Subset sum = 0
ok 11 - Expecting equal subsets.
Checking: (0, 0, 0, 0)
Subsets: (0, 0, 0, 0) and ()
Subset sum = 0
ok 12 - Expecting equal subsets.
Checking: (1, 6, 2)
Subsets not equal.
ok 13 - Not expecting equal subsets.
Checking: (7, 5, 3, 3)
Subsets not equal.
ok 14 - Not expecting equal subsets.
Checking: (8, 4, 4, 7, 6, 3)
Subsets not equal.
ok 15 - Not expecting equal subsets.
Checking: (0, 1)
Subsets not equal.
ok 16 - Not expecting equal subsets.
Checking: (1, 2)
Subsets not equal.
ok 17 - Not expecting equal subsets.
Checking: (1)
Subsets not equal.
ok 18 - Not expecting equal subsets.
Checking: (2)
Subsets not equal.
ok 19 - Not expecting equal subsets.
####
#!/usr/bin/env perl -l
use strict;
use warnings;
use List::Util qw{sum};
use Test::More;
use Time::HiRes qw[ time ];
use Getopt::Long;
my %opt = (
test_more => 1,
time_hires => 1,
volume_tests => 0,
volume_power_max => 3,
array_limit => 3,
);
GetOptions(map {
join('|' => @{[join '' => /(?>^|_)([a-z])/gi]}, $_) . ':i' => \$opt{$_}
} keys %opt);
my $test_equal_subsets = [
[1, 3, 8, 4],
[1, 3, 5, 7],
[4, 3, 2, 2, 1],
[4, 3, 2, 2, 2, 2, 1],
[5, 5, 4, 6, 2, 8, 1, 9],
[8, 4, 4, 7, 6, 3],
[1, 1],
[2, 2],
[],
[0],
[0, 0],
[0, 0, 0],
[0, 0, 0, 0],
];
my $test_unequal_subsets = [
[1, 6, 2],
[7, 5, 3, 3],
[1, 2 ,3, 7],
[0, 1],
[1, 2],
[1],
[2],
[8, 1, 2, 3],
];
if ($opt{volume_tests}) {
for (1 .. $opt{volume_power_max}) {
my @volume = (1 .. 10**$_ / 2) x 2;
push @$test_equal_subsets, [@volume];
push @volume, 10**(2 * $_);
push @$test_unequal_subsets, [@volume];
}
}
if ($opt{test_more}) {
plan tests => scalar @$test_equal_subsets + scalar @$test_unequal_subsets;
}
my @expectations = ('Not expecting equal subsets.', 'Expecting equal subsets.');
my @subsets_data = ([$test_unequal_subsets, 0, 0], [$test_equal_subsets, 1, 1]);
for (@subsets_data) {
my ($subsets, $expect_code, $expect_name_index) = @$_;
my $expect_name = $expectations[$expect_name_index];
for (@$subsets) {
my $start = time if $opt{time_hires};
if ($opt{test_more}) {
is(check_arrays($_), $expect_code, $expect_name);
}
else {
check_arrays($_);
}
printf "Took %f seconds\n", time() - $start if $opt{time_hires};
}
}
sub check_arrays {
my $full_array = shift;
print 'Checking: (', array_string($full_array), ')';
if (! grep { $_ } @$full_array) {
print "\tSubsets: (", array_string($full_array), ') and ()';
print "\tSubset sum = 0";
return 1;
}
my $full_sum = sum @$full_array;
if ($full_sum % 2) {
print "\tSubsets not equal.";
return 0;
}
my $half_sum = $full_sum / 2;
my @sorted_array = sort { $b <=> $a } @$full_array;
if ($sorted_array[0] > $half_sum) {
print "\tSubsets not equal.";
return 0;
}
my (@a1, @a2);
my $total = 0;
while (@sorted_array) {
$total = 0;
for (@sorted_array) {
if ($total + $_ <= $half_sum) {
push @a1, $_;
$total += $_;
}
}
if ($total == $half_sum) {
push @a2, @sorted_array;
last;
}
else {
push @a2, shift @sorted_array or last;
$total = 0;
}
}
if ($total == $half_sum) {
print "\tSubsets: (", array_string([sort { $a <=> $b } @a2]), ')';
print "\t and (", array_string([sort { $a <=> $b } @a2]), ')';
print "\tSubset sum = $half_sum";
return 1;
}
else {
print "\tSubsets not equal.";
return 0
}
}
sub array_string {
my $array = shift;
return join(', ' => @$array > 3 * $opt{array_limit}
? ( @$array[0 .. $opt{array_limit} - 1],
" ... [snip: @{[@$array - 2 * $opt{array_limit}]} elements] ...",
@$array[@$array - $opt{array_limit} .. $#$array] )
: @$array);
}
####
$ pm_split_equal_sums.pl --tm=1 --th=1 --vt=1 --vpm=5 --al=3
1..31
Checking: (1, 6, 2)
Subsets not equal.
ok 1 - Not expecting equal subsets.
Took 0.000307 seconds
Checking: (7, 5, 3, 3)
Subsets not equal.
ok 2 - Not expecting equal subsets.
Took 0.000197 seconds
Checking: (1, 2, 3, 7)
Subsets not equal.
ok 3 - Not expecting equal subsets.
Took 0.000180 seconds
Checking: (0, 1)
Subsets not equal.
ok 4 - Not expecting equal subsets.
Took 0.000166 seconds
Checking: (1, 2)
Subsets not equal.
ok 5 - Not expecting equal subsets.
Took 0.000165 seconds
Checking: (1)
Subsets not equal.
ok 6 - Not expecting equal subsets.
Took 0.000164 seconds
Checking: (2)
Subsets not equal.
ok 7 - Not expecting equal subsets.
Took 0.000168 seconds
Checking: (8, 1, 2, 3)
Subsets not equal.
ok 8 - Not expecting equal subsets.
Took 0.000170 seconds
Checking: (1, 2, 3, ... [snip: 5 elements] ..., 4, 5, 100)
Subsets not equal.
ok 9 - Not expecting equal subsets.
Took 0.000183 seconds
Checking: (1, 2, 3, ... [snip: 95 elements] ..., 49, 50, 10000)
Subsets not equal.
ok 10 - Not expecting equal subsets.
Took 0.000191 seconds
Checking: (1, 2, 3, ... [snip: 995 elements] ..., 499, 500, 1000000)
Subsets not equal.
ok 11 - Not expecting equal subsets.
Took 0.000313 seconds
Checking: (1, 2, 3, ... [snip: 9995 elements] ..., 4999, 5000, 100000000)
Subsets not equal.
ok 12 - Not expecting equal subsets.
Took 0.001494 seconds
Checking: (1, 2, 3, ... [snip: 99995 elements] ..., 49999, 50000, 10000000000)
Subsets not equal.
ok 13 - Not expecting equal subsets.
Took 0.013494 seconds
Checking: (1, 3, 8, 4)
Subsets: (1, 3, 4, 8)
and (1, 3, 4, 8)
Subset sum = 8
ok 14 - Expecting equal subsets.
Took 0.000205 seconds
Checking: (1, 3, 5, 7)
Subsets: (1, 3, 5, 7)
and (1, 3, 5, 7)
Subset sum = 8
ok 15 - Expecting equal subsets.
Took 0.000195 seconds
Checking: (4, 3, 2, 2, 1)
Subsets: (1, 2, 2, 3, 4)
and (1, 2, 2, 3, 4)
Subset sum = 6
ok 16 - Expecting equal subsets.
Took 0.000205 seconds
Checking: (4, 3, 2, 2, 2, 2, 1)
Subsets: (1, 2, 2, 2, 2, 3, 4)
and (1, 2, 2, 2, 2, 3, 4)
Subset sum = 8
ok 17 - Expecting equal subsets.
Took 0.000201 seconds
Checking: (5, 5, 4, 6, 2, 8, 1, 9)
Subsets: (1, 2, 4, 5, 5, 6, 8, 9)
and (1, 2, 4, 5, 5, 6, 8, 9)
Subset sum = 20
ok 18 - Expecting equal subsets.
Took 0.000202 seconds
Checking: (8, 4, 4, 7, 6, 3)
Subsets: (3, 4, 4, 6, 7, 8)
and (3, 4, 4, 6, 7, 8)
Subset sum = 16
ok 19 - Expecting equal subsets.
Took 0.000199 seconds
Checking: (1, 1)
Subsets: (1, 1)
and (1, 1)
Subset sum = 1
ok 20 - Expecting equal subsets.
Took 0.000188 seconds
Checking: (2, 2)
Subsets: (2, 2)
and (2, 2)
Subset sum = 2
ok 21 - Expecting equal subsets.
Took 0.000186 seconds
Checking: ()
Subsets: () and ()
Subset sum = 0
ok 22 - Expecting equal subsets.
Took 0.000167 seconds
Checking: (0)
Subsets: (0) and ()
Subset sum = 0
ok 23 - Expecting equal subsets.
Took 0.000166 seconds
Checking: (0, 0)
Subsets: (0, 0) and ()
Subset sum = 0
ok 24 - Expecting equal subsets.
Took 0.000168 seconds
Checking: (0, 0, 0)
Subsets: (0, 0, 0) and ()
Subset sum = 0
ok 25 - Expecting equal subsets.
Took 0.000168 seconds
Checking: (0, 0, 0, 0)
Subsets: (0, 0, 0, 0) and ()
Subset sum = 0
ok 26 - Expecting equal subsets.
Took 0.000168 seconds
Checking: (1, 2, 3, ... [snip: 4 elements] ..., 3, 4, 5)
Subsets: (1, 1, 2, ... [snip: 4 elements] ..., 4, 5, 5)
and (1, 1, 2, ... [snip: 4 elements] ..., 4, 5, 5)
Subset sum = 15
ok 27 - Expecting equal subsets.
Took 0.000211 seconds
Checking: (1, 2, 3, ... [snip: 94 elements] ..., 48, 49, 50)
Subsets: (1, 1, 2, ... [snip: 94 elements] ..., 49, 50, 50)
and (1, 1, 2, ... [snip: 94 elements] ..., 49, 50, 50)
Subset sum = 1275
ok 28 - Expecting equal subsets.
Took 0.000269 seconds
Checking: (1, 2, 3, ... [snip: 994 elements] ..., 498, 499, 500)
Subsets: (1, 1, 2, ... [snip: 994 elements] ..., 499, 500, 500)
and (1, 1, 2, ... [snip: 994 elements] ..., 499, 500, 500)
Subset sum = 125250
ok 29 - Expecting equal subsets.
Took 0.000762 seconds
Checking: (1, 2, 3, ... [snip: 9994 elements] ..., 4998, 4999, 5000)
Subsets: (1, 1, 2, ... [snip: 9994 elements] ..., 4999, 5000, 5000)
and (1, 1, 2, ... [snip: 9994 elements] ..., 4999, 5000, 5000)
Subset sum = 12502500
ok 30 - Expecting equal subsets.
Took 0.005873 seconds
Checking: (1, 2, 3, ... [snip: 99994 elements] ..., 49998, 49999, 50000)
Subsets: (1, 1, 2, ... [snip: 99994 elements] ..., 49999, 50000, 50000)
and (1, 1, 2, ... [snip: 99994 elements] ..., 49999, 50000, 50000)
Subset sum = 1250025000
ok 31 - Expecting equal subsets.
Took 0.060788 seconds
####
$ pm_split_equal_sums.pl --tm=0 --th=1 --vt=1 --vpm=5 --al=3
Checking: (1, 6, 2)
Subsets not equal.
Took 0.000059 seconds
Checking: (7, 5, 3, 3)
Subsets not equal.
Took 0.000036 seconds
Checking: (1, 2, 3, 7)
Subsets not equal.
Took 0.000010 seconds
Checking: (0, 1)
Subsets not equal.
Took 0.000009 seconds
Checking: (1, 2)
Subsets not equal.
Took 0.000008 seconds
Checking: (1)
Subsets not equal.
Took 0.000008 seconds
Checking: (2)
Subsets not equal.
Took 0.000011 seconds
Checking: (8, 1, 2, 3)
Subsets not equal.
Took 0.000012 seconds
Checking: (1, 2, 3, ... [snip: 5 elements] ..., 4, 5, 100)
Subsets not equal.
Took 0.000026 seconds
Checking: (1, 2, 3, ... [snip: 95 elements] ..., 49, 50, 10000)
Subsets not equal.
Took 0.000031 seconds
Checking: (1, 2, 3, ... [snip: 995 elements] ..., 499, 500, 1000000)
Subsets not equal.
Took 0.000150 seconds
Checking: (1, 2, 3, ... [snip: 9995 elements] ..., 4999, 5000, 100000000)
Subsets not equal.
Took 0.001309 seconds
Checking: (1, 2, 3, ... [snip: 99995 elements] ..., 49999, 50000, 10000000000)
Subsets not equal.
Took 0.012939 seconds
Checking: (1, 3, 8, 4)
Subsets: (1, 3, 4, 8)
and (1, 3, 4, 8)
Subset sum = 8
Took 0.000054 seconds
Checking: (1, 3, 5, 7)
Subsets: (1, 3, 5, 7)
and (1, 3, 5, 7)
Subset sum = 8
Took 0.000029 seconds
Checking: (4, 3, 2, 2, 1)
Subsets: (1, 2, 2, 3, 4)
and (1, 2, 2, 3, 4)
Subset sum = 6
Took 0.000032 seconds
Checking: (4, 3, 2, 2, 2, 2, 1)
Subsets: (1, 2, 2, 2, 2, 3, 4)
and (1, 2, 2, 2, 2, 3, 4)
Subset sum = 8
Took 0.000035 seconds
Checking: (5, 5, 4, 6, 2, 8, 1, 9)
Subsets: (1, 2, 4, 5, 5, 6, 8, 9)
and (1, 2, 4, 5, 5, 6, 8, 9)
Subset sum = 20
Took 0.000038 seconds
Checking: (8, 4, 4, 7, 6, 3)
Subsets: (3, 4, 4, 6, 7, 8)
and (3, 4, 4, 6, 7, 8)
Subset sum = 16
Took 0.000036 seconds
Checking: (1, 1)
Subsets: (1, 1)
and (1, 1)
Subset sum = 1
Took 0.000024 seconds
Checking: (2, 2)
Subsets: (2, 2)
and (2, 2)
Subset sum = 2
Took 0.000025 seconds
Checking: ()
Subsets: () and ()
Subset sum = 0
Took 0.000011 seconds
Checking: (0)
Subsets: (0) and ()
Subset sum = 0
Took 0.000011 seconds
Checking: (0, 0)
Subsets: (0, 0) and ()
Subset sum = 0
Took 0.000011 seconds
Checking: (0, 0, 0)
Subsets: (0, 0, 0) and ()
Subset sum = 0
Took 0.000011 seconds
Checking: (0, 0, 0, 0)
Subsets: (0, 0, 0, 0) and ()
Subset sum = 0
Took 0.000011 seconds
Checking: (1, 2, 3, ... [snip: 4 elements] ..., 3, 4, 5)
Subsets: (1, 1, 2, ... [snip: 4 elements] ..., 4, 5, 5)
and (1, 1, 2, ... [snip: 4 elements] ..., 4, 5, 5)
Subset sum = 15
Took 0.000050 seconds
Checking: (1, 2, 3, ... [snip: 94 elements] ..., 48, 49, 50)
Subsets: (1, 1, 2, ... [snip: 94 elements] ..., 49, 50, 50)
and (1, 1, 2, ... [snip: 94 elements] ..., 49, 50, 50)
Subset sum = 1275
Took 0.000111 seconds
Checking: (1, 2, 3, ... [snip: 994 elements] ..., 498, 499, 500)
Subsets: (1, 1, 2, ... [snip: 994 elements] ..., 499, 500, 500)
and (1, 1, 2, ... [snip: 994 elements] ..., 499, 500, 500)
Subset sum = 125250
Took 0.000599 seconds
Checking: (1, 2, 3, ... [snip: 9994 elements] ..., 4998, 4999, 5000)
Subsets: (1, 1, 2, ... [snip: 9994 elements] ..., 4999, 5000, 5000)
and (1, 1, 2, ... [snip: 9994 elements] ..., 4999, 5000, 5000)
Subset sum = 12502500
Took 0.005701 seconds
Checking: (1, 2, 3, ... [snip: 99994 elements] ..., 49998, 49999, 50000)
Subsets: (1, 1, 2, ... [snip: 99994 elements] ..., 49999, 50000, 50000)
and (1, 1, 2, ... [snip: 99994 elements] ..., 49999, 50000, 50000)
Subset sum = 1250025000
Took 0.060971 seconds
####
#!/usr/bin/env perl -l
use strict;
use warnings;
use List::Util qw{first sum};
use Test::More;
use Time::HiRes qw{time};
use Getopt::Long;
my %opt = (
test_more => 1,
time_hires => 1,
volume_tests => 0,
volume_power_max => 3,
array_limit => 3,
);
GetOptions(map {
join('|' => @{[join '' => /(?>^|_)([a-z])/gi]}, $_) . ':i' => \$opt{$_}
} keys %opt);
my $test_equal_subsets = [
[1, 3, 8, 4],
[1, 3, 5, 7],
[4, 3, 2, 2, 1],
[4, 3, 2, 2, 2, 2, 1],
[5, 5, 4, 6, 2, 8, 1, 9],
[8, 4, 4, 7, 6, 3],
[1, 1],
[2, 2],
[],
[0],
[0, 0],
[0, 0, 0],
[0, 0, 0, 0],
[ (1) x 100 ],
[ 1 .. 1000 ],
];
my $test_unequal_subsets = [
[1, 6, 2],
[7, 5, 3, 3],
[1, 2 ,3, 7],
[0, 1],
[1, 2],
[1],
[2],
[8, 1, 2, 3],
[ 1 .. 10 ],
[ 1 .. 100 ],
];
if ($opt{volume_tests}) {
for (1 .. $opt{volume_power_max}) {
my @volume = map { (($_), ($_)) } 1 .. 8**$_ / 2;
push @$test_equal_subsets, [@volume];
push @$test_unequal_subsets, [@volume, 8**(2 * $_)];
}
}
if ($opt{test_more}) {
plan tests => scalar @$test_equal_subsets + scalar @$test_unequal_subsets;
}
my @expectations = ('Not expecting equal subsets.', 'Expecting equal subsets.');
my @subsets_data = ([$test_unequal_subsets, 0, 0], [$test_equal_subsets, 1, 1]);
for (@subsets_data) {
my ($subsets, $expect_code, $expect_name_index) = @$_;
my $expect_name = $expectations[$expect_name_index];
for (@$subsets) {
my $start = time if $opt{time_hires};
if ($opt{test_more}) {
is(check_arrays($_), $expect_code, $expect_name);
}
else {
check_arrays($_);
}
printf "Took %f seconds\n", time() - $start if $opt{time_hires};
}
}
sub check_arrays {
my $full_array = shift;
print 'Checking: (', array_string($full_array), ')';
if (! grep { $_ } @$full_array) {
print "\tSubsets: (", array_string($full_array), ') and ()';
print "\tSubset sum = 0";
return 1;
}
my $full_sum = sum @$full_array;
if ($full_sum % 2) {
print "\tSubsets not equal: sum of starting array is odd ($full_sum).";
return 0;
}
my $half_sum = $full_sum / 2;
my @sorted_array = sort { $b % 2 <=> $a % 2 || $b <=> $a } @$full_array;
if (my $big = first { $_ > $half_sum } @sorted_array) {
print "\tSubsets not equal: element ($big) larger than sum of rest.";
return 0;
}
my (@a1, @a2);
my $total = 0;
while (@sorted_array) {
push @a1, shift @sorted_array;
$total += $a1[$#a1];
@sorted_array = map { $total + $_ <= $half_sum
? do { push @a1, $_; $total += $_; () } : $_
} @sorted_array;
if ($total == $half_sum) {
(@a2, @sorted_array) = (@a2, @sorted_array);
}
else {
push @a2, pop @a1 if @a1;
}
}
if ($total == $half_sum) {
print "\tSubsets: (", array_string([sort { $a <=> $b } @a1]), ')';
print "\t and (", array_string([sort { $a <=> $b } @a2]), ')';
print "\tSubset sum = $half_sum";
return 1;
}
else {
print "\tSubsets not equal: no solution found.";
return 0
}
}
sub array_string {
my $array = shift;
return join(', ' => @$array > 3 * $opt{array_limit}
? ( @$array[0 .. $opt{array_limit} - 1],
" ... [snip: @{[@$array - 2 * $opt{array_limit}]} elements] ...",
@$array[@$array - $opt{array_limit} .. $#$array] )
: @$array);
}
####
$ pm_split_equal_sums.pl --tm=1 --th=1 --vt=1 --vpm=8 --al=3
1..41
Checking: (1, 6, 2)
Subsets not equal: sum of starting array is odd (9).
ok 1 - Not expecting equal subsets.
Took 0.000318 seconds
Checking: (7, 5, 3, 3)
Subsets not equal: no solution found.
ok 2 - Not expecting equal subsets.
Took 0.000233 seconds
Checking: (1, 2, 3, 7)
Subsets not equal: sum of starting array is odd (13).
ok 3 - Not expecting equal subsets.
Took 0.000169 seconds
Checking: (0, 1)
Subsets not equal: sum of starting array is odd (1).
ok 4 - Not expecting equal subsets.
Took 0.000165 seconds
Checking: (1, 2)
Subsets not equal: sum of starting array is odd (3).
ok 5 - Not expecting equal subsets.
Took 0.000167 seconds
Checking: (1)
Subsets not equal: sum of starting array is odd (1).
ok 6 - Not expecting equal subsets.
Took 0.000165 seconds
Checking: (2)
Subsets not equal: element (2) larger than sum of rest.
ok 7 - Not expecting equal subsets.
Took 0.000177 seconds
Checking: (8, 1, 2, 3)
Subsets not equal: element (8) larger than sum of rest.
ok 8 - Not expecting equal subsets.
Took 0.000179 seconds
Checking: (1, 2, 3, ... [snip: 4 elements] ..., 8, 9, 10)
Subsets not equal: sum of starting array is odd (55).
ok 9 - Not expecting equal subsets.
Took 0.000179 seconds
Checking: (1, 2, 3, ... [snip: 94 elements] ..., 98, 99, 100)
Subsets not equal: no solution found.
ok 10 - Not expecting equal subsets.
Took 0.000817 seconds
Checking: (1, 1, 2, 2, 3, 3, 4, 4, 64)
Subsets not equal: element (64) larger than sum of rest.
ok 11 - Not expecting equal subsets.
Took 0.000193 seconds
Checking: (1, 1, 2, ... [snip: 59 elements] ..., 32, 32, 4096)
Subsets not equal: element (4096) larger than sum of rest.
ok 12 - Not expecting equal subsets.
Took 0.000379 seconds
Checking: (1, 1, 2, ... [snip: 507 elements] ..., 256, 256, 262144)
Subsets not equal: element (262144) larger than sum of rest.
ok 13 - Not expecting equal subsets.
Took 0.000769 seconds
Checking: (1, 1, 2, ... [snip: 4091 elements] ..., 2048, 2048, 16777216)
Subsets not equal: element (16777216) larger than sum of rest.
ok 14 - Not expecting equal subsets.
Took 0.004773 seconds
Checking: (1, 1, 2, ... [snip: 32763 elements] ..., 16384, 16384, 1073741824)
Subsets not equal: element (1073741824) larger than sum of rest.
ok 15 - Not expecting equal subsets.
Took 0.035878 seconds
Checking: (1, 1, 2, ... [snip: 262139 elements] ..., 131072, 131072, 68719476736)
Subsets not equal: element (68719476736) larger than sum of rest.
ok 16 - Not expecting equal subsets.
Took 0.294454 seconds
Checking: (1, 1, 2, ... [snip: 2097147 elements] ..., 1048576, 1048576, 4398046511104)
Subsets not equal: element (4398046511104) larger than sum of rest.
ok 17 - Not expecting equal subsets.
Took 2.395664 seconds
Checking: (1, 1, 2, ... [snip: 16777211 elements] ..., 8388608, 8388608, 281474976710656)
Subsets not equal: element (281474976710656) larger than sum of rest.
ok 18 - Not expecting equal subsets.
Took 19.422507 seconds
Checking: (1, 3, 8, 4)
Subsets: (1, 3, 4)
and (8)
Subset sum = 8
ok 19 - Expecting equal subsets.
Took 0.000223 seconds
Checking: (1, 3, 5, 7)
Subsets: (1, 7)
and (3, 5)
Subset sum = 8
ok 20 - Expecting equal subsets.
Took 0.000201 seconds
Checking: (4, 3, 2, 2, 1)
Subsets: (1, 2, 3)
and (2, 4)
Subset sum = 6
ok 21 - Expecting equal subsets.
Took 0.000203 seconds
Checking: (4, 3, 2, 2, 2, 2, 1)
Subsets: (1, 3, 4)
and (2, 2, 2, 2)
Subset sum = 8
ok 22 - Expecting equal subsets.
Took 0.000208 seconds
Checking: (5, 5, 4, 6, 2, 8, 1, 9)
Subsets: (1, 5, 5, 9)
and (2, 4, 6, 8)
Subset sum = 20
ok 23 - Expecting equal subsets.
Took 0.000209 seconds
Checking: (8, 4, 4, 7, 6, 3)
Subsets: (3, 6, 7)
and (4, 4, 8)
Subset sum = 16
ok 24 - Expecting equal subsets.
Took 0.000206 seconds
Checking: (1, 1)
Subsets: (1)
and (1)
Subset sum = 1
ok 25 - Expecting equal subsets.
Took 0.000197 seconds
Checking: (2, 2)
Subsets: (2)
and (2)
Subset sum = 2
ok 26 - Expecting equal subsets.
Took 0.000195 seconds
Checking: ()
Subsets: () and ()
Subset sum = 0
ok 27 - Expecting equal subsets.
Took 0.000168 seconds
Checking: (0)
Subsets: (0) and ()
Subset sum = 0
ok 28 - Expecting equal subsets.
Took 0.000168 seconds
Checking: (0, 0)
Subsets: (0, 0) and ()
Subset sum = 0
ok 29 - Expecting equal subsets.
Took 0.000168 seconds
Checking: (0, 0, 0)
Subsets: (0, 0, 0) and ()
Subset sum = 0
ok 30 - Expecting equal subsets.
Took 0.000170 seconds
Checking: (0, 0, 0, 0)
Subsets: (0, 0, 0, 0) and ()
Subset sum = 0
ok 31 - Expecting equal subsets.
Took 0.000181 seconds
Checking: (1, 1, 1, ... [snip: 94 elements] ..., 1, 1, 1)
Subsets: (1, 1, 1, ... [snip: 44 elements] ..., 1, 1, 1)
and (1, 1, 1, ... [snip: 44 elements] ..., 1, 1, 1)
Subset sum = 50
ok 32 - Expecting equal subsets.
Took 0.000323 seconds
Checking: (1, 2, 3, ... [snip: 994 elements] ..., 998, 999, 1000)
Subsets: (1, 3, 5, ... [snip: 495 elements] ..., 995, 997, 999)
and (2, 4, 6, ... [snip: 493 elements] ..., 996, 998, 1000)
Subset sum = 250250
ok 33 - Expecting equal subsets.
Took 0.001866 seconds
Checking: (1, 1, 2, 2, 3, 3, 4, 4)
Subsets: (1, 1, 2, 3, 3)
and (2, 4, 4)
Subset sum = 10
ok 34 - Expecting equal subsets.
Took 0.000212 seconds
Checking: (1, 1, 2, ... [snip: 58 elements] ..., 31, 32, 32)
Subsets: (1, 1, 3, ... [snip: 27 elements] ..., 29, 31, 31)
and (2, 2, 4, ... [snip: 25 elements] ..., 30, 32, 32)
Subset sum = 528
ok 35 - Expecting equal subsets.
Took 0.000310 seconds
Checking: (1, 1, 2, ... [snip: 506 elements] ..., 255, 256, 256)
Subsets: (1, 1, 3, ... [snip: 251 elements] ..., 253, 255, 255)
and (2, 2, 4, ... [snip: 249 elements] ..., 254, 256, 256)
Subset sum = 32896
ok 36 - Expecting equal subsets.
Took 0.001029 seconds
Checking: (1, 1, 2, ... [snip: 4090 elements] ..., 2047, 2048, 2048)
Subsets: (1, 1, 3, ... [snip: 2043 elements] ..., 2045, 2047, 2047)
and (2, 2, 4, ... [snip: 2041 elements] ..., 2046, 2048, 2048)
Subset sum = 2098176
ok 37 - Expecting equal subsets.
Took 0.006883 seconds
Checking: (1, 1, 2, ... [snip: 32762 elements] ..., 16383, 16384, 16384)
Subsets: (1, 1, 3, ... [snip: 16379 elements] ..., 16381, 16383, 16383)
and (2, 2, 4, ... [snip: 16377 elements] ..., 16382, 16384, 16384)
Subset sum = 134225920
ok 38 - Expecting equal subsets.
Took 0.054265 seconds
Checking: (1, 1, 2, ... [snip: 262138 elements] ..., 131071, 131072, 131072)
Subsets: (1, 1, 3, ... [snip: 131067 elements] ..., 131069, 131071, 131071)
and (2, 2, 4, ... [snip: 131065 elements] ..., 131070, 131072, 131072)
Subset sum = 8590000128
ok 39 - Expecting equal subsets.
Took 0.449057 seconds
Checking: (1, 1, 2, ... [snip: 2097146 elements] ..., 1048575, 1048576, 1048576)
Subsets: (1, 1, 3, ... [snip: 1048571 elements] ..., 1048573, 1048575, 1048575)
and (2, 2, 4, ... [snip: 1048569 elements] ..., 1048574, 1048576, 1048576)
Subset sum = 549756338176
ok 40 - Expecting equal subsets.
Took 3.644046 seconds
Checking: (1, 1, 2, ... [snip: 16777210 elements] ..., 8388607, 8388608, 8388608)
Subsets: (1, 1, 3, ... [snip: 8388603 elements] ..., 8388605, 8388607, 8388607)
and (2, 2, 4, ... [snip: 8388601 elements] ..., 8388606, 8388608, 8388608)
Subset sum = 35184376283136
ok 41 - Expecting equal subsets.
Took 89.489836 seconds