54 lines
1.1 KiB
Perl
54 lines
1.1 KiB
Perl
# Fischer-Krause ordered permutation generator
|
|
# http://faq.perl.org/perlfaq4.html#How_do_I_permute_N_e
|
|
sub permute (&@) {
|
|
my $code = shift;
|
|
my @idx = 0..$#_;
|
|
while ( $code->(@_[@idx]) ) {
|
|
my $p = $#idx;
|
|
--$p while $idx[$p-1] > $idx[$p];
|
|
my $q = $p or return;
|
|
push @idx, reverse splice @idx, $p;
|
|
++$q while $idx[$p-1] > $idx[$q];
|
|
@idx[$p-1,$q]=@idx[$q,$p-1];
|
|
}
|
|
}
|
|
|
|
@formats = (
|
|
'((%d %s %d) %s %d) %s %d',
|
|
'(%d %s (%d %s %d)) %s %d',
|
|
'(%d %s %d) %s (%d %s %d)',
|
|
'%d %s ((%d %s %d) %s %d)',
|
|
'%d %s (%d %s (%d %s %d))',
|
|
);
|
|
|
|
# generate all possible combinations of operators
|
|
@op = qw( + - * / );
|
|
@operators = map{ $a=$_; map{ $b=$_; map{ "$a $b $_" }@op }@op }@op;
|
|
|
|
while(1)
|
|
{
|
|
print "Enter four integers or 'q' to exit: ";
|
|
chomp($ent = <>);
|
|
last if $ent eq 'q';
|
|
|
|
|
|
if($ent !~ /^[1-9] [1-9] [1-9] [1-9]$/){ print "invalid input\n"; next }
|
|
|
|
@n = split / /,$ent;
|
|
permute { push @numbers,join ' ',@_ }@n;
|
|
|
|
for $format (@formats)
|
|
{
|
|
for(@numbers)
|
|
{
|
|
@n = split;
|
|
for(@operators)
|
|
{
|
|
@o = split;
|
|
$str = sprintf $format,$n[0],$o[0],$n[1],$o[1],$n[2],$o[2],$n[3];
|
|
$r = eval($str);
|
|
print "$str\n" if $r == 24;
|
|
}
|
|
}
|
|
}
|
|
}
|