Problem 43 (Project Euler) [原文]
数1406357289は0から9のPandigital数である (0から9が1度ずつ現れるので). この数は部分語が面白い性質を持っている.
d1を1桁目, d2を2桁目の数とし, 以下順にdnを定義する. この記法を用いると次のことが分かる.
- d2d3d4 = 406は2で割り切れる
- d3d4d5 = 063は3で割り切れる
- d4d5d6 = 635は5で割り切れる
- d5d6d7 = 357は7で割り切れる
- d6d7d8 = 572は11で割り切れる
- d7d8d9 = 728は13で割り切れる
- d8d9d10 = 289は17で割り切れる
このような性質をもつ0から9のPandigital数の総和を求めよ
取りかかったのは昨日でしたが、いろいろやっているうちについ時間を過ごしてしまいました。
最初、事前の枝刈りでもしようと、ナンクロ(数独)気分で紙と鉛筆で解き始めました。すぐに d6が5であることがすぐにわかり、なんとなく正解にたどり着きました。
さすがにこれはなかろう…とコードを書きました。まず、上の各条件を単純に満たす3桁の数をそれぞれ配列に格納した後、最後の条件に合致する配列から前に向かって各要素をつなぎ合わるような操作を行いました。
各配列の様子を適宜表示させてみると、徐々に解答候補が絞り込まれていく様子がよくわかり、いかにも「プログラムが考えている」ようでした。
もっと効率のよい方法はあるのでしょうが、人間と似たような手順でありながらスタートレックNGのデータ君みたいにPCが高速に解いていくのを観察するのはなかなか楽しいものです。