キミならどう書く 2.0 - 2007 - その 2: 小町算 逐次計算バージョン
前回の続き。今回は逐次計算バージョンです。

Karetta|キミならどう書く 2.0 - 2007 - その 2
さらに計算を電卓のように左から逐次計算させた場合 (1 + 2 * 3 = 9 となるような計算順序) の場合には何通りの等式が存在するだろうか?


簡単かと思いきや、意外に難しかった。結果は 67 と出ました。
exciteブログに"eval"は使っちゃ駄目だと怒られたので、evalを使わないような形で書いてます。

use strict;
use warnings;

$\ = "\n";

sub add { $_[0] + $_[1] }
sub minus { $_[0] - $_[1] }
sub multi { $_[0] * $_[1] }
sub div { $_[0] / $_[1] }
sub conc { $_[0] . $_[1] }
my %operators = (
'+' => \&add,
'-' => \&minus,
'*' => \&multi,
'/' => \&div,
'' => \&conc,
);

my $TARGET_NUM = 100;
my @results = ();

sub make_expression($$$@) {
my ( $exp, $val, $prev_op, $prev_val, @nums ) = @_;

if (@nums) {
my $num = shift @nums;
for (keys %operators) {
my $tmp_exp = $exp . $_ . $num;
if ($_) {
make_expression( $tmp_exp,
$operators{$prev_op}->( $val, $prev_val ),
$_, $num, @nums );
}
else {
make_expression( $tmp_exp, $val, $prev_op, $prev_val . $num,
@nums );
}
}
}
else {
$val = $prev_val ? $operators{$prev_op}->( $val, $prev_val ) : $val;
my @tmp = ( $exp, $val );
push @results, \@tmp;
}
}

make_expression 1, 1, '', '', ( 2 .. 9 );

my $n = 0;
for (@results) {
next if ( $_->[1] != $TARGET_NUM );
print $_->[0];
$n++;
}
print "total $n expressions";


実行結果

% perl komachi2-1.pl
main::make_expression() called too early to check prototype at komachi2-1.pl line 30.
main::make_expression() called too early to check prototype at komachi2-1.pl line 35.
123-45-67+89
123-45/6+78+9
123-4-5-6-7+8-9
123+45-67+8-9
123+4-5+67-89
12-3-4*5+6+78-9
12-3-4+5-6+7+89
12-3*4+56+7-8+9
12-3+4+5*6-7+8-9
12/3*4+5+6*7-89
12/3+4-5*6-7+89
12*3-4+5-6+78-9
12+3-4+5+67+8+9
12+3*4-56+7+89
12+3*4/5+6-7+89
12+3+4+5-6-7+89
12+3+4+5/6+7+89
1-2/3-4+5*6+7+89
1-2/3+4*5*6+7-8-9
1-2*3-4+5+6+7+89
1-2+3-4+5*6-7+89
1-2+3*4-5*6-7+89
1/2-3*4/5+6+7+89
1/2/3*456+7+8+9
1/2*34-5+6-7+89
1/2+3-4+5*6*7-89
1/2+3*4*5+6+7+8+9
1/2+3*4+5-6+78+9
1*23-4+5-6-7+89
1*23-4+5/6+7+89
1*23+4+5+67-8+9
1*2-3+4-5+6+7+89
1*2-3+4*5*6-7+8+9
1*2/3/4+5*6+78-9
1*2*34+56-7-8-9
1*2*3-4*5-6+7+89
1*2*3-4+5/6*78+9
1*2*3-4+5+6+78+9
1*2*3*4-5-6+78+9
1*2*3+4*5+67-8-9
1*2*3+4+5*6-7+8+9
1*2+34+56+7-8+9
1*2+3*4-5*6-7+8+9
1*2+3*4*5-6+7+8-9
1*2+3*4*5+6-7-8+9
1*2+3*4+56+7+8+9
1*2+3*4+5+6+78-9
1*2+3+45+67-8-9
1+23-4-5*6-7+8+9
1+23-4*5-6+7+8-9
1+23-4*5+6-7-8+9
1+23-4+56+7+8+9
1+23-4+5+6+78-9
1+23+4+5-6*7-89
1+2/3+4*5+6+78-9
1+2/3+4+5-6+7+89
1+2*3-4*5+6+78-9
1+2*3-4+5-6+7+89
1+2*3*4+56+7-8+9
1+2*3+4+5*6-7+8-9
1+2+34-5+67-8+9
1+2+3-4*5-6+7+89
1+2+3-4+5/6*78+9
1+2+3-4+5+6+78+9
1+2+3*4-5-6+78+9
1+2+3+4*5+67-8-9
1+2+3+4+5*6-7+8+9
total 67 expressions

[PR]
by fkmn | 2007-07-16 23:59 | IT
<< 【感想】コピー用紙の裏は使うな! キミならどう書く 2.0 - ... >>


とあるWebアプリケーションエンジニアの日記
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
カテゴリ
以前の記事
ブログパーツ
リンク
検索
タグ
最新のトラックバック
プログラミングが「出来る..
from とりあえず9JP?
Genographic ..
from ナンジャモンジャ
ジュセリーノ
from ありの出来事
くちこみブログ集(ライフ..
from くちこみブログ集(ライフ)(..
以降、丁寧語で行こう!
from エッセイ的な何か
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧

fkmnの最近読んだ本 フィードメーター - フッ君の日常 あわせて読みたい AX