のてすきあ − 完全独習非プログラマー −

Haskell で Project Euler を解く素人遊び

Problem 32

39 × 186 = 7254は1から9までの全ての数字が1回ずつ出てくる。このように積の形で書ける数(この例では7254)を1から9のPandigitalと呼ぶ。全ての1から9のPandigitalな数の和を求めよ。

素直に問題をコードに書き下すだけで答えが出る。計算が重たいので、効率化できないか考えたが、検索対象を絞り込むくらいしか思いつかなかった。まず0が含まれてはいけない。そして数字に重複があってはいけない。そして a × b = c において(aの桁数)+(bの桁数)+(cの桁数) = 9 でなくてはいけない。特に最後は log a + log b = log c であることとあわせて考えると、(a,b,c) の桁数は (1,4,4) または (2,3,4) である。

以上を踏まえて取り組んだ。途中に出てくるarrangeなる関数は、例えば問題の39 × 186 = 7254 を登場人物のリスト[3,9,1,8,6,7,2,5,4] にまとめるための関数である。この方が何かと扱い易いと考えてのことだがどうなのだろう?

まっすぐ、まっすぐ☆