Problem 15
http://projecteuler.net/index.php?section=problems&id=15
大文字のCを使ったら怒られた。
c n 0 = 1
c n m = ( (c n (m - 1)) * (n - m + 1)) `div` mn = 20
main = print(c (n * 2) n)
Problem 16
http://projecteuler.net/index.php?section=problems&id=16
最初割り算しながら足していくコードを書いたが、まず割り算して各桁の数字のリストを作ったほうが分離していていいと思ったので書き直した。
digits 0 = []
digits n = (digits (div n 10)) ++ [ mod n 10 ]n = 1000
main = print(sum(digits (2^n)))
Problem 17
http://projecteuler.net/index.php?section=problems&id=17
リストの要素をインデックスで参照するのは、!!でいちおうできる。
最初は各単語の長さをその場で計算していた。長さのリストも求めておいたほうがコードがすっきりすると思ってそうしたが、あまりすっきりしなかった。
words1 = [ "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine" ]
words10 = [ "ten", "eleven", "twelve", "thirteen", "fourteen",
"fifteen", "sixteen", "seventeen", "eighteen", "nineteen" ]
words20 = [ "twelve", "thirty", "forty", "fifty",
"sixty", "seventy", "eighty", "ninety" ]
word100 = "hundred"
word1000 = "thousand"length1 = map length words1
length10 = map length words10
length20 = map length words20
length100 = length word100
length1000 = length word1000num_length 0 = 0
num_length n | n < 10 = length1!!(n-1)
| n < 20 = length10!!(n-10)
| n < 100 = length20!!((div n 10) - 2)
+ (num_length (mod n 10))
| n == 1000 = (length1!!0) + length1000
| (mod n 100) == 0 = (num_length (div n 100)) + length100
| n < 1000 = num_length ((div n 100) * 100)
+ 3 + (num_length (mod n 100))main = print(sum (map num_length [1..1000]))