#!/usr/bin/perl use strict; use warnings; use Algorithm::Loops qw{NestedLoops MapCar}; my $year = $ARGV[0] || 2006; my @digit = reverse 1..9; my $next = NestedLoops( [ ['+', '-'], ([qw{+ - / *}, '']) x $#digit ] ); while ( my @perm = $next->() ) { my @expr = split m|([/*+-])|, join '', MapCar { @_ } \@perm, \@digit; print "@expr\n" if evaluate(@expr) == $year; } sub evaluate { my @expr = @_; splice @expr, 0, 3, $expr[2] * ($expr[1] eq '-' ? -1 : 1); for (1 .. 2) { my $op = $_ % 2 ? qr|([*/])| : qr|([+-])|; for (my $i = 1; $i < $#expr;) { my ($x, $y) = ($expr[$i - 1], $expr[$i + 1]); if ($expr[$i] =~ /$op/) { my $val = $1 eq '*' ? $x * $y : $1 eq '/' ? $x / $y : $1 eq '+' ? $x + $y : $x - $y; splice @expr, $i - 1, 3, $val; } else {$i += 2} } } return $expr[0]; }