my %h; for my $x ( 1..9 ) { for my $y ( $x+1..9 ) { for my $z ( $y+1..9 ) { my @a= ( $x, $y, $z ); my @p; do { push @p, join "", @a; } while( nextPermute(@a) ); for my $i ( 0..$#p ) { for my $j ( $i+1..$#p ) { for my $k ( $j+1..$#p ) { $h{$p[$i]+$p[$j]+$p[$k]} .= "=$p[$i]+$p[$j]+$p[$k]"; } } } } } } for my $k ( 1990 .. 2010 ) { print "$k=$h{$k}\n" if exists $h{$k}; } #### 1998=189+891+918=198+819+981=279+792+927=... 2004=149+914+941=617+671+716=527+725+752 2007=198+891+918=387+783+837=459+594+954=... #### 2003=089+098+908+908=368+386+386+863=485+485+485+548 #### for my $i ( 0..$#p ) { for my $j ( $i+1..$#p ) { $h{$p[$i]+$p[$j]} .= "=$p[$i]+$p[$j]"; for my $k ( $j+1..$#p ) { $h{$p[$i]+$p[$j]+$p[$k]} .= "=$p[$i]+$p[$j]+$p[$k]"; for my $l ( $k+1..$#p ) { $h{$p[$i]+$p[$j]+$p[$k]+$p[$l]} .= "=$p[$i]+$p[$j]+$p[$k]+$p[$l]"; for my $m ( $l+1..$#p ) { $h{$p[$i]+$p[$j]+$p[$k]+$p[$l]+$p[$m]} .= "=$p[$i]+$p[$j]+$p[$k]+$p[$l]+$p[$m]"; for my $n ( $m+1..$#p ) { $h{$p[$i]+$p[$j]+$p[$k]+$p[$l]+$p[$m]+$p[$n]} .= "=$p[$i]+$p[$j]+$p[$k]+$p[$l]+$p[$m]+$p[$n]"; } } } } } } #### sub nestedLoops { my( $loops, $params )= @_; my $code= $params && $params->{Code}; my @list; my $when= $params && $params->{OnlyWhen} || sub { @_ == @$loops }; my $i= -1; my @idx; my @vals= @$loops; my $iter= sub { while( 1 ) { # Prepare to append one more value: if( $i < $#$loops ) { $idx[++$i]= -1; $vals[$i]= $loops->[$i]->(@list) if 'CODE' eq ref $loops->[$i]; } # Increment furthest value, chopping if done there: while( @{$vals[$i]} <= ++$idx[$i] ) { # Return if all done: return if --$i < 0; pop @list; } $list[$i]= $vals[$i][$idx[$i]]; if( ! ref $when || $when->( @list ) ) { return @list; } } }; return $iter if ! $code; while( $iter->() ) { $code->( @list ); } } #### my $digs= 3; my $fact= 1; $fact *= $_ for 2..$digs; my %h; my $getDigits= nestedLoops( [ [0..9], ##[1..9], ( sub { [ $_[-1] .. 9 ] } ) x ($digs-1), ##( sub { [ $_[-1]+1 .. 9 ] } ) x ($digs-1), ] ); my @list; while( @list= $getDigits->() ) { my @p; do { push @p, join "", @list; } while( nextPermute( @list ) ); nestedLoops( [ [0..$#p], ( sub { [ $_[-1]+1 .. $#p ] } ) x ($fact-1), ], { OnlyWhen => 1, Code => sub { my $expr= join "+", @p[@_]; my $noOct= $expr; $noOct =~ s/(? length($h{$b}) ## || $a <=> $b } keys %h ) { for my $k ( sort { $a <=> $b } keys %h ) { print "$k$h{$k}\n" if 1990 < $k and $k < 2010; ##if $h{$k} =~ /\d/ && index($h{$k},"()") < 0; }