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;
}