パズルを機械に解かせる

id:inocchichichi さんに触発されて、久しぶりにプログラムを書いてみる。
実は、95 年に、人間が考えるような方法(2 で割ったり 3 で割ったりしてみるというような)で解答を見つけるというプログラムを作っていたのだ。HyperCard (懐かしいな) で、9999 までの数字が [10] 以内であらわすことができるかを順番に調べていくというもの。動作速度の関係もあってあまりいろいろなパターンを組み込めなかったのだけど、それでも多くの数字の解答を得ることができた。
現在のパスルは、このプログラムでは解答が得られなかったものから出題している。だから、単純に 3 で割ったらいきなり答えが出てしまった、というようなものは基本的に出題されない(はず)。たまに簡単に解けてしまう問題があるのは、当時作ったプログラムが手抜きだったのが原因なわけだ。
ということで、当時とは違うアプローチ(おそらく inocchichichi さんがやられているのと同じ方法)で解答作成に挑戦してみたのだが、考え方が悪いのか、異様に時間がかかる。プログラムを Perl で書いていることや、マシンスペック(iBook Dual USB 初代)の問題もあるのかもしれないけど……。
今のところ、なんとか [5] を調べ終わった(0 から 9999 までの間で、852 個解けた)ところで、[6] に至ってはいつ終わるとも知れない状態(つい先ほど 1901 個目の解答を見つけたところ)。現在やっている方法では、[5] を調べるのに 27869184 回というとんでもない回数の計算が必要。このペースで [9] までいくと、[5] のときの 3000 万倍以上の計算が必要になる模様。[5] でさえ数時間かかったから、[9] となると、2 万年もかかるのか!(苦笑) もっと効率のいい方法を見つけないとまったく歯が立たないようだ。うーむ。