Skip to content

Instantly share code, notes, and snippets.

@lolicsystem
Created November 12, 2010 09:09
Show Gist options
  • Save lolicsystem/673892 to your computer and use it in GitHub Desktop.
Save lolicsystem/673892 to your computer and use it in GitHub Desktop.
0000~9999 までの1万個の数字のうち、「各桁の数字と四則演算を使って 10 を作れるもの」 をリストアップする。引数を与えると、10 以外の数を指定できる、みたいな。
#!/usr/bin/perl
use strict;
use warnings;
use Math::BaseCalc;
use Math::RPN;
use 5.010;
my $target = shift;
$target //= 10;
my $bc = new Math::BaseCalc(digits => ['+', '-', '*', '/']);
my @rpn_tmpls = (
[qw/d d o d o d o/],
[qw/d d o d d o o/],
[qw/d d d o o d o/],
[qw/d d d o d o o/],
[qw/d d d d o o o/],
);
for my $n (0..9999) { # digits
my @digits = map {$_ - ord('0')} unpack "C*", sprintf("%04d", $n);
OPE: for my $o (0..63) { # operator
my @op = split //, substr('++' . $bc->to_base($o), -3);
for my $tmpl (@rpn_tmpls) {
my @formula;
my $di = 0;
my $oi = 0;
for my $i (0..6) {
if ($tmpl->[$i] eq 'd') {
push @formula, $digits[$di++];
} else {
push @formula, $op[$oi++];
}
}
my $r;
eval {
$r = rpn(@formula);
};
unless ($@) {
if ($r == $target) {
printf "%s = %d\n", join(" ", @formula), $r;
last OPE;
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment