use List::Util qw(sum);
use List::MoreUtils qw(first_index);
#my @numbers = map { rand() * 100 } 1 .. 5;
#my @numbers = (8,14,32,29);
my @numbers = @ARGV;
my @b = split_evenly( \@numbers );
sub say { print @_,"\n" }
say "First container: sum(@{$b[0]}) = ", sum @{$b[0]};
say "Second container: sum(@{$b[1]}) = ", sum @{$b[1]};
sub split_evenly {
my @numbers = reverse sort { $a <=> $b } @{+shift};
my $target = sum(@numbers) / 2;
say "Target is $target";
my @b;
while ( 1 ) {
my $index = first_index { $_ <= $target } @numbers;
last if $index < 0;
$target -= $numbers[$index];
push @b, splice @numbers, $index, 1;
}
return \@b, \@numbers;
}
####
perl funky.pl 400 402 521 735 758 191 307 679 776 877
Target is 2823
First container: sum(877 776 758 402) = 2813
Second container: sum(735 679 521 400 307 191) = 2833
####
First container: sum(400 402 521 735 758) = 2816
Second container: sum(191 307 679 776 877) = 2830