wvogel日記

自分用の技術備忘録が多めです.

Project Euler 53

main =getLine >>= \n-> (print $ sum $ map euler53 [1.. read n])

euler53 :: Integer -> Integer
euler53 n = euler53' n n

euler53' :: Integer -> Integer -> Integer
euler53' n 0 = 0
euler53' n r = check53 (combinate n r) + euler53' n (r-1)

kaijo :: Integer -> Integer
kaijo k = foldr (*) 1 [1..k]

check53 :: Integer -> Integer
check53 n = if n > 1000000 then 1 else 0

combinate :: Integer -> Integer -> Integer
combinate n r = (kaijo n)`div`((kaijo r)*(kaijo (n-r)))

n=23 ---> 4
n=24 ---> 11
n=100 ---> 4075
と出ました。


euler53関数が美しくない。
てか要らない。
カリー化使ったりして消せないかな。でもnを変更できないからなー
あ、これを、mainからの入力指定ではなく、固定にしたらいいのか。確かに
問題解くだけだしね。
しかし外部入力できた方が検査もしやすい遊びやすい笑