Created
November 12, 2010 09:09
-
-
Save lolicsystem/673892 to your computer and use it in GitHub Desktop.
0000~9999 までの1万個の数字のうち、「各桁の数字と四則演算を使って 10 を作れるもの」 をリストアップする。引数を与えると、10 以外の数を指定できる、みたいな。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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