Life Goes On

まあまあだけど楽しんでる方です

2008-03-01から1ヶ月間の記事一覧

23問目

http://projecteuler.net/index.php?section=problems&id=23 約数の和が元の数より大きいものを過剰数と呼ぶ。28123より大きい数は必ず二つの過剰数の和として表現できるが、二つの過剰数の和として表現できない全ての数の和を求める。 問題自体はそれほど難…

22問目

http://projecteuler.net/index.php?section=problems&id=22 名前のリストに対して、それぞれの名前に対応する得点を計算してそれを足し合わせる。 42問目に合わせて修正しました。 import Data.Char import Data.List main = do names <- readFile "names…

21問目

http://projecteuler.net/index.php?section=problems&id=21 一万未満の友愛数の合計を求める。 友愛数というのはそれぞれの約数の和が相手と等しい数同士のことだそうですが、約数の和が自分自身と等しい数は除いています。 今回は平方数の約数もきちんと求…

20問目

http://projecteuler.net/index.php?section=problems&id=20 100の階乗の、各桁の数字を足し合わせる。 import Data.Char main = print $ euler020 100 euler020 :: Integer -> Int euler020 n = sum $ map digitToInt $ show $ fact n fact :: Integer -> I…

19問目

http://projecteuler.net/index.php?section=problems&id=19 20世紀で月初が日曜となる回数を求める。 main = print $ euler019 1901 2000 euler019 :: Int -> Int -> Int euler019 begin end = length $ filter (== 0) [dayOfWeek year month | year <- [be…

サービス停止

止まってしまいました。 残念ですが、おとなしく再開を待ちたいと思います。最近ハマってしまって仕事にならなかったので、むしろちょうどよかったかも。 作り貯めたプログラムがあるので、しばらくは更新を続けます。

18問目

http://projecteuler.net/index.php?section=problems&id=18 三角形に配置された数字を頂点から反対側の辺まで辿るときに、数字の和が最大となるような経路を求める。 67問目が同じ問題で、より大量のデータを対象としているということで、そちらも解ける…

15問目

http://projecteuler.net/index.php?section=problems&id=15 20×20の格子を通る経路の場合の数を求める。 40C20です。 main = print $ combination 40 20 combination :: Integer -> Integer -> Integer combination m n = div (fact m) (fact n * fact (m -…

16問目

http://projecteuler.net/index.php?section=problems&id=16 あまり簡単なのでもう1問。 21000の各桁の数字の和を求める。 import Data.Char main = print $ euler016 2 1000 euler016 :: Integer -> Integer -> Int euler016 a n = sum $ map digitToInt $…

17問目

http://projecteuler.net/index.php?section=problems&id=17 せっかくなので、さらにもう1問。 1から1000までの数を英語で表記して、その文字数を足し合わせる。 main = print $ euler017 1000 euler017 :: Int -> Int euler017 n = sum $ map (length . wo…

14問目

http://projecteuler.net/index.php?section=problems&id=14 以下の式で定義される数列(コラッツ予想によれば必ず1で終わる)があったとき、数列の長さを最大にする百万未満のnを求める。 n → n/2 (nが偶数のとき) n → 3n + 1 (nが奇数のとき) 数列の長さを…

13問目

http://projecteuler.net/index.php?section=problems&id=13 50桁の数100個を足して最初の10桁を求める。 簡単。 main = do cs <- readFile "euler013.txt" print $ euler013 $ lines cs euler013 :: [String] -> String euler013 ss = take 10 $ show $ sum…

12問目

http://projecteuler.net/index.php?section=problems&id=12 501個以上の約数をもつ最初の三角数を求める。 nの約数の個数は√n以下の約数の個数を2倍しています。 厳密には、nが平方数のときは1少ない数になりますが、大勢に影響ないので無視しています。 ma…

11問目

http://projecteuler.net/index.php?section=problems&id=11 20×20に並んだ数字の中から、縦、横、斜めいずれか一直線に並んだ4つの数字を選び、積が最大となるものを求める。 2次元のリストに格納して、後はとにかく調べます。(ずいぶん適当だったので修…

10問目

http://projecteuler.net/index.php?section=problems&id=10 2百万未満の素数の和を求める。 7問目で書いたように、なかなか時間を短縮できず苦しんでいたのですが、何とか実用に耐えるレベルになりました。(コンパイル済みのコードで数秒) 素数の配列の…

9問目

http://projecteuler.net/index.php?section=problems&id=9 a^2 + b^2 = c^2, a + b + c = 1000, a 自然数を求める。 (250,251,499) → (249,252,499) → .. → (3,498,499) → (249,251,498) → .. と順に調べていきます。 main = print $ euler009 250 251 499 …

8問目

http://projecteuler.net/index.php?section=problems&id=8 1000個の数字の中から連続する5つの数字を選んで、積が最大となるものを求める。 だいぶHaskellっぽいプログラムが書けました。 import Data.Char import Data.List main = print $ euler008 5 "7…

7問目

http://projecteuler.net/index.php?section=problems&id=7 10001番目の素数を求める。 素数を求めるアルゴリズムは色々あるみたいですが、とりあえず、既に分かっている素数で順に割って行ってどれでも割り切れなければ素数と判定する方法を採りました。 け…

6問目

http://projecteuler.net/index.php?section=problems&id=6 1から100の和の二乗と二乗の和の差を求める。 それだけ。 mapのところはもう少し簡潔に書けないのかなぁ。(←コメントを頂いて修正しました) main = print $ euler006 [1 ..100] euler006 :: [Int…

5問目

http://projecteuler.net/index.php?section=problems&id=5 1から20の最小公倍数を求める。 最初、手計算で解いてしまって、どうプログラムしようかと思ったら、プログラムしても簡単でした。 main = print $ euler005 [1..20] euler005 :: [Int] -> Int eul…

4問目

昨日はチビが夜更かししたせいでUPできなかったので、2問まとめて。 まず4問目。 http://projecteuler.net/index.php?section=problems&id=4 999以下の2数の積で、回文になるような最大の数を求めろというもの。 以下のように順番に試して、回文になっ…

3問目

600851475143の素因数分解。 http://projecteuler.net/index.php?section=problems&id=3 淡々と。 main = print $ euler003 600851475143 2 euler003 :: Integer -> Integer -> Integer euler003 a p | (a == 1) = p | (mod a p == 0) = euler003 (div a p) …

2問目

フィボナッチ数列に含まれる4000000以下の偶数を足し合わせろという問題。 http://projecteuler.net/index.php?section=problems&id=2 main = print $ euler002 1 2 0 euler002 :: Int -> Int -> Int -> Int euler002 a b s | (b > 4000000) = s | (mod b 2 …

はじめました

Haskellの勉強も兼ねて、Project Euler はじめました。 解答をさらしていきます。 まずは1問目。 http://projecteuler.net/index.php?section=problems&id=1 FizzBuzzのバリエーションかな。 main = print $ euler001 [1..999] euler001 :: [Int] -> Int eu…