どうにかこうにか30問目まで辿り着いた。
今回は深く考えず問題の通り素直に実装すれば解けてしまったものが多かった気がするなぁ。
Problem 28. Number spiral diagonals(螺旋状に並んだ数の対角線)
パズル的な発想で考えてみた。
[1,2,3,4,5,6,7,8,9,10..25]という整数のリストがあったとして、中央の1を除いて対角線上に来る数字は、
最も内側の四角では1要素飛ばしで3,5,7,9、ひとつ外側の四角は3要素飛ばしで13,17,21,25…となるので、
これをそのままコードに落とし込んでみた。
stepが何要素飛ばしに値を取るか、
countが1~4まで同じ四角上の四隅を処理するか次の外側の四角に移るかを表している。
addDiagsは中央の1を除いて処理を行っているので、和に1を加えるのを忘れずに。
再帰でやってみたが工夫すれば畳み込み関数でもできただろうか…。まぁ今回はこれで。
Problem 29. Distinct powers(個別のべき乗)
リスト内包表記で値を作り、ソートして重複を除いて要素数を出す、と愚直なやり方で解けてしまった。
速度もそんなに悪くないので、これでいいか。
Problem 30. Digit fifth powers(各桁の5乗)
「各桁を5乗した数の和が元の数と一致する」かどうかを1から順に調べていっているが、上限を決めないといけない。
99と9^5+9^5では後者が大きく、
999と9^5+9^5+9^5でも9999と9^5+9^5+9^5+9^5でも99999と9^5+9^5+9^5+9^5+9^5でもそうだが、
999999と9^5+9^5+9^5+9^5+9^5+9^5では前者が大きいので、これを上限とすればよさそうだ。
この計算をlimitでやっている。
あとは、sum . map ((^n) . digitToInt) . showした値と元の値が一致するもののみフィルタし、
合計値を出している。
ghci上で実行すると少々処理に時間がかかるが、最適化オプションつきでコンパイルするとほぼ一瞬で終わる。

Copyright© 2011-2021 Shunsuke Otani All Right Reserved .