#! 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; #### P:\test>355455 30 1..18,31 1 trial of memoized (7.751s total) 12 18 13 17 14 16 1 11 18 1 12 17 1 13 16 1 14 15 2 10 18 2 11 17 2 12 16 2 13 15 3 9 18 3 10 17 3 11 16 3 12 15 3 13 14 4 8 18 4 9 17 4 10 16 4 11 15 4 12 14 5 7 18 5 8 17 5 9 16 5 10 15 5 11 14 5 12 13 6 7 17 6 8 16 6 9 15 6 10 14 6 11 13 7 8 15 7 9 14 7 10 13 7 11 12 8 9 13 8 10 12 9 10 11 1 2 9 18 1 2 10 17 1 2 11 16 1 2 12 15 1 2 13 14 1 3 8 18 1 3 9 17 1 3 10 16 1 3 11 15 1 3 12 14 1 4 7 18 1 4 8 17 1 4 9 16 1 4 10 15 1 4 11 14 1 4 12 13 1 5 6 18 1 5 7 17 1 5 8 16 1 5 9 15 1 5 10 14 1 5 11 13 1 6 7 16 1 6 8 15 1 6 9 14 1 6 10 13 1 6 11 12 1 7 8 14 1 7 9 13 1 7 10 12 1 8 9 12 1 8 10 11 2 3 7 18 2 3 8 17 2 3 9 16 2 3 10 15 2 3 11 14 2 3 12 13 2 4 6 18 2 4 7 17 2 4 8 16 2 4 9 15 2 4 10 14 2 4 11 13 2 5 6 17 2 5 7 16 2 5 8 15 2 5 9 14 2 5 10 13 2 5 11 12 2 6 7 15 2 6 8 14 2 6 9 13 2 6 10 12 2 7 8 13 2 7 9 12 2 7 10 11 2 8 9 11 3 4 5 18 3 4 6 17 3 4 7 16 3 4 8 15 3 4 9 14 3 4 10 13 3 4 11 12 3 5 6 16 3 5 7 15 3 5 8 14 3 5 9 13 3 5 10 12 3 6 7 14 3 6 8 13 3 6 9 12 3 6 10 11 3 7 8 12 3 7 9 11 3 8 9 10 4 5 6 15 4 5 7 14 4 5 8 13 4 5 9 12 4 5 10 11 4 6 7 13 4 6 8 12 4 6 9 11 4 7 8 11 4 7 9 10 5 6 7 12 5 6 8 11 5 6 9 10 5 7 8 10 6 7 8 9 1 2 3 6 18 1 2 3 7 17 1 2 3 8 16 1 2 3 9 15 1 2 3 10 14 1 2 3 11 13 1 2 4 5 18 1 2 4 6 17 1 2 4 7 16 1 2 4 8 15 1 2 4 9 14 1 2 4 10 13 1 2 4 11 12 1 2 5 6 16 1 2 5 7 15 1 2 5 8 14 1 2 5 9 13 1 2 5 10 12 1 2 6 7 14 1 2 6 8 13 1 2 6 9 12 1 2 6 10 11 1 2 7 8 12 1 2 7 9 11 1 2 8 9 10 1 3 4 5 17 1 3 4 6 16 1 3 4 7 15 1 3 4 8 14 1 3 4 9 13 1 3 4 10 12 1 3 5 6 15 1 3 5 7 14 1 3 5 8 13 1 3 5 9 12 1 3 5 10 11 1 3 6 7 13 1 3 6 8 12 1 3 6 9 11 1 3 7 8 11 1 3 7 9 10 1 4 5 6 14 1 4 5 7 13 1 4 5 8 12 1 4 5 9 11 1 4 6 7 12 1 4 6 8 11 1 4 6 9 10 1 4 7 8 10 1 5 6 7 11 1 5 6 8 10 1 5 7 8 9 2 3 4 5 16 2 3 4 6 15 2 3 4 7 14 2 3 4 8 13 2 3 4 9 12 2 3 4 10 11 2 3 5 6 14 2 3 5 7 13 2 3 5 8 12 2 3 5 9 11 2 3 6 7 12 2 3 6 8 11 2 3 6 9 10 2 3 7 8 10 2 4 5 6 13 2 4 5 7 12 2 4 5 8 11 2 4 5 9 10 2 4 6 7 11 2 4 6 8 10 2 4 7 8 9 2 5 6 7 10 2 5 6 8 9 3 4 5 6 12 3 4 5 7 11 3 4 5 8 10 3 4 6 7 10 3 4 6 8 9 3 5 6 7 9 4 5 6 7 8 1 2 3 4 5 15 1 2 3 4 6 14 1 2 3 4 7 13 1 2 3 4 8 12 1 2 3 4 9 11 1 2 3 5 6 13 1 2 3 5 7 12 1 2 3 5 8 11 1 2 3 5 9 10 1 2 3 6 7 11 1 2 3 6 8 10 1 2 3 7 8 9 1 2 4 5 6 12 1 2 4 5 7 11 1 2 4 5 8 10 1 2 4 6 7 10 1 2 4 6 8 9 1 2 5 6 7 9 1 3 4 5 6 11 1 3 4 5 7 10 1 3 4 5 8 9 1 3 4 6 7 9 1 3 5 6 7 8 2 3 4 5 6 10 2 3 4 5 7 9 2 3 4 6 7 8 1 2 3 4 5 6 9 1 2 3 4 5 7 8