challenge 小町算

古典的なパズルである小町算を解くプログラムを作成してください。

小町算とは:

1□2□3□4□5□6□7□8□9=100

四角の中に、空白、+、-、×、÷のいずれかを一つ入れ、等式が成り立つようにするパズルです。

解答例:

1-2-3+4×56÷7+8×9=100

1+234×5÷6-7-89=100

参考: http://ja.wikipedia.org/wiki/%E5%B0%8F%E7%94%BA%E7%AE%97

  • evalやそれに類するものを使うか否かは自由です。
  • 割り算の際には小数点以下の切捨てが起こらないのが望ましいです。(必須ではない)
    • 切捨てが起こる場合の解答例:1÷2÷3+4+5÷6+7+89=100
  • 余裕があれば括弧を含むようにしてもいいかもしれません。

手元で20数行ほどのPythonスクリプトを書いてみたところ、101個の解答が得られました。

Posted feedbacks - PHP

式をすべて生成して演算する方法。
が、メモリエラーが発生(memory_limit = 32Mの設定)したため、
とりあえず8を追加するときに、9を加減する場合のみ前計算して不要なものを排除。
101件取得(33.56秒)
 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
$operators = array( '+', '-', '*', '/', '' );

for ( $i = 1; $i <= 9; $i ++ ) {
    $h = 1;
    if ( $i == 1 ) {
        foreach ( $operators as $row ) {
            $temp[$h] = $i . $row;
            $h++;
        }
    } elseif ( $i == 9 ) {
        foreach ( $temp as $row ) {
            $expression = $row . $i;
            eval("\$ans = $expression;");
            if ( $ans == 100 ) {
                $expressions[] = $expression;
            }
            $h++;
        }
    } else {
        if ( $i == 8 ) {
            foreach ( $temp as $row ) {
                foreach ( $operators as $key => $val ) {
                    $expression_temp = $row . $i;
                    eval("\$ans = $expression_temp;");
                    if ( $key === 0 ) {
                        if ( $ans == 91 ) {
                            $temp[$h] = $row . $i . $val;
                            $h++;
                        }
                    } elseif ( $key == 1 ) {
                        if ( $ans == 109 ) {
                            $temp[$h] = $row . $i . $val;
                            $h++;
                        }
                    } else {
                        $temp[$h] = $row . $i . $val;
                        $h++;
                    }
                }
            }
        } else {
            foreach ( $temp as $row ) {
                foreach ( $operators as $row2 ) {
                    $temp[$h] = $row . $i . $row2;
                    $h++;
                }
            }
        }
    }
}
print_r($expressions);

Index

Feed

Other

Link

Pathtraq

loading...