Haskell

Project Euler 21

http://projecteuler.net/index.php?section=problems&id=21 約数を求めるために、エラトステネスのふるい的に素因数分解する。 その前に配列の更新方法。 import Data.Arraya = array (1, 5) [ (n, 1) | n update a = a // [(2, 2)] main = print(update a)…

Project Euler 18-20

Problem 18 http://projecteuler.net/index.php?section=problems&id=18 あえて全てのパスで和を求める。 三角形の数の並びは横のリストのリストにする。 まず、0〜16383の数を用意する。上から始めて、2で割って余りが0なら左下に進み、1なら右下に進んで2…

Project Euler 15-17

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=…

Project Euler 14

http://projecteuler.net/index.php?section=problems&id=14 コラッツ問題。単に1から100万までの長さを求める。 next_collatz n | (mod n 2) == 1 = 3 * n + 1 | otherwise = div n 2collatz_length 1 = 1 collatz_length n = 1 + (collatz_length (next_co…

Project Euler 12,13

Problem 12 http://projecteuler.net/index.php?section=problems&id=12 素直にn(n + 1) / 2を素因数分解する。 m = 500 primes = 2:[3,5..]div_pow n p | mod n p /= 0 = (n, 0) | otherwise = (\(n, e) -> (n, e + 1)) (div_pow (div n p) p)factorize n (…

Project Euler 12,13

Problem 12 http://projecteuler.net/index.php?section=problems&id=12 素直にn(n + 1) / 2を素因数分解する。 m = 500 primes = 2:[3,5..]div_pow n p | mod n p /= 0 = (n, 0) | otherwise = (\(n, e) -> (n, e + 1)) (div_pow (div n p) p)factorize n (…

Project Euler 10,11

Problem 10 http://projecteuler.net/index.php?section=problems&id=10 200万までの素数を出さなければならない。 n = 2000000 is_prime n = all (\p -> mod n p /= 0) (takeWhile (\p -> p * p main = print(sum (filter is_prime [2..n-1]))ここでは素数…

Project Euler 9

素直に書くととても遅い。 n = 1000 m = div n 2 is_right_angle (a, b, c) = a * a + b * b == c * c product_t (a, b, c) = a * b * c triplets = [ (a, b, c) | a a + b + c == n && a main = print(map product_t (filter is_right_angle triplets))直積…

Project Euler 8

はじめて文字列が出てきた。文字列は文字のリストである。だから++で結合できる。 Prelude> "a" ++ "b" "ab"文字列を数に変えるには read を使う。ただし、 s = "12" main = print(read s)とするとエラーが出る。どうやらreadは返す値の型が決まっていないら…

Project Euler 5 - 7

Problem 5 http://projecteuler.net/index.php?section=problems&id=5最大公約数を求める。Haskellには最初からlcmが用意されている。 main = print(foldl lcm 1 [ 1..20 ]) Problem 6 http://projecteuler.net/index.php?section=problems&id=6特に難しいこ…

Project Euler 4

http://projecteuler.net/index.php?section=problems&id=4 回文数の判定は、各桁に分解してリストをひっくり返して数に戻して元通りになっているかどうかを調べる。各桁に分解するのは再帰で。 リストを数に戻すには次のようにする。 numerize a = foldr (\…

Project Euler 3

http://projecteuler.net/index.php?section=problems&id=3 素因数分解するので、まず素数列を出さなければならない、ということはもちろんなくて、ここでは2, 3, 5, 7, 9, …と割っていくことにする。 prime_candidates = 2:[ 3, 5.. ]これで、所望の無限リ…

Project Euler 2

フィボナッチ数列を作らなければならない。Haskellではどのように作ればいいか検索していたら、次のようなものが出てきた。 fib = 1 : 1 : [ a + b | (a, b) http://www.sampou.org/haskell/tutorial-j/functions.html さっぱり意味がわからないが、一つずつ…

Project Euler 1

急にHaskellをやってみようと思い、インストールして、少し調べて、Project EulerのProblem 1を書いてみた。2時間かかった。 まず、 http://haskell.org/ からダウンロードして、デフォルトでインストール。 そして、適当なサイトを見て、こう書いて、test.h…