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

Haskell で Project Euler を解く素人遊び

Problem 8

次の1000個の数字の中からひと続きの13個の数字の積を取る。積の最大値はいくらか。

f:id:mitstream:20200404151825p:plain

プログラマーの自分としては、 IO アクションにはどうも苦手意識がある。do構文も苦手である。だからこの問題は1000桁の数字をコピペして最初から[Int]型として扱うことも考えた。だけどそれではスキルアップにつながらないよね、ということであえて問題の数字列をテキストファイルにして、readFileを使う形式にした。


その結果というべきか、この問題で最も苦戦したのは、文字列 String を [Int] に変換する工程である。String は [Char] と同等だから、Char -> Int 型のつもりで read による変換を試みるも、コンパイルが通らない。実際readは

*Main> :t read
read :: Read a => String -> a

なのでこれは後から考えれば当然なのだが、じゃあどないすんねん!というのが分からず大苦戦。結果的には (read. return) に辿り着いたが、理屈は今ひとつよく分かっていない。結果うまく行きましたというだけ。


本論の計算の方は簡単で、単純に13個の積を走査的に取っていくだけなので、特別な工夫をしなくても線形時間で終わる作業である。


do構文使ったど☆