#! perl -slw use strict; use Memoize; use Benchmark::Timer; use List::Util qw[ sum ]; BEGIN{ @ARGV = map{ eval }@ARGV } sub Cnr{ my( $n, @r ) = shift; return [] unless $n--; for my $x ( 0 .. ($#_ - $n) ) { push @r, map{ [ $_[$x], @$_ ] } Cnr( $n, @_[ ($x + 1) .. $#_ ] ); } return @r; } sub sums{ my( $required, @values ) = @_; return grep{ sum( @$_ ) == $required ? $_ : () } map{ Cnr( $_, grep $_ < $required, @values ) } 1 .. $#values; } my $T = new Benchmark::Timer; #$T->start( 'raw' ); #my @sums = sums( @ARGV ); #$T->stop( 'raw' ); $T->start( 'memoized' ); memoize( 'Cnr' ); my @sums2 = sums( @ARGV ); $T->stop( 'memoized' ); $T->report; print "@$_" for @sums2;