読者です 読者をやめる 読者になる 読者になる

morris555's diary

高校生のブログです。

Project Euler

Problem 22

Problem 22です。 import Data.List import Data.Maybe import Control.Applicative score = sum . map (fromMaybe 0 . flip lookup (zip ['A'..'Z'] [1..26])) main = do names <- (sort . list) <$> getContents print . (foldr (\(x, y) s -> s + x * y) …

Problem 21

Problem 21です。 import Data.List main = print . sum . filter isAmicable $ [1..10000] isAmicable n = n == (sumDivisors . sumDivisors $ n) && n /= sumDivisors n sumDivisors n = sum . filter (\x -> (n `mod` x) == 0) $ [1..n-1] 遅いです。

Problem 20

Problem 20です。 import Data.Char (digitToInt) main = print . sum . map digitToInt $ show . product $ [1..100] シンプルに計算するだけで簡単に出来ました。

Problem 19

今回は、Problem 19です。 import Data.Time.Calendar import Data.Time.Calendar.WeekDate main = print . length $ [d | d <- [fromGregorian y m 1 | y <- [1901..2000], m <- [1..12]], let (_, _, w) = toWeekDate d, w == 7] Haskellなら簡単でした。

Problem 18

Problem 18です。 import Control.Applicative group _ [] = [] group n xs = let (xs1, xs2) = splitAt n xs in xs1 : group (n+1) xs2 main = do input <- map read <$> (words <$> getContents) :: IO [Int] print . head . foldr1 max' $ group 1 input …

Problem 17

Problem 17は「1から1000までの数字をすべて英単語で書けば、全部で何文字になるか」という問題です。 nums1 = ["", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fiftee…

Problem 16

ploblem 16は、「2^1000」の全ての桁の総和を求める問題です import Data.Char (digitToInt) main = print . sum . map digitToInt . show $ 2 ^ 1000 こんな感じ。簡単すぎてちょっと面白くなかった。

Problem 15

Problem 15です。20 × 20 のマス目の左上から右下までの最短ルートの数を求める問題です。 main = print $ product [21..40] `div` product [1..20] 高1の数学で習ったような気がしたので、記憶を頼りにやってみました。

Problem 14

Problem 14はいわゆる「コラッツの問題」ってやつです。 import Data.List (maximumBy) import Data.Ord (comparing) collatz 1 a = a collatz n a | even n = collatz (n `div` 2) (a + 1) | otherwise = collatz (3*n + 1) (a + 1) main = print $ maximum…

Problem 13

今回はProblem 13です。50桁の数字100個の総和の上10桁を求める問題ですね。 main = putStrLn . take 10 . show . sum $ num num = [ -- ここに50桁の数字100個 ] 見難くなるので数字は省略しましたが、100個のリストを作れば簡単でした。

Problem 12

Problem 12は500個以上の約数を持つ最小の三角数を求める問題です。 import Data.List (group) factorize 1 = [(1, 0)] factorize n = format . factorize' n $ 2:3:[x + y | x <- [6, 12 ..], y <- [-1, 1]] where factorize' n xs'@(x : xs) | n < x * x =…

Problem 11

Ploblem 11はタテ・ヨコ・ナナメの4つの連続する数字の積で最大のものを求める問題です。 main = print . maximum $ width ++ height ++ obil1 ++ obil2 calc xs ys = product $ zipWith ref xs ys where ref x y = nums !! y !! x width = [calc [x + n | n…

Problem 10

Ploblem 10です。200万以下の全ての素数の和を求める問題です。 primes = 2:primes' where primes' = 3:sieve 0 5 sieve i x = filter isPrime [x, x+2..p*p-2] ++ sieve (i+1) (p*p+2) where (ps,p:_) = splitAt i primes' isPrime x = all ((/=0).rem x) p…

Problem 8

今回こそProblem 8です。1000桁の数字から5つの連続する数字を取り出して その積を計算したときの最大の値を求める問題です。 main = print . getMax 0 $ getNum input getNum "" = [] getNum (c:cs) | c `elem` ['0'..'9'] = (read :: String -> Int) [c] :…

Problem 9

Problem 9です。「a + b + c = 1000となるピタゴラスの三つ組が一つだけ存在する. このa,b,cの積を計算しなさい」こんな問題ですね。 pythaNums n = [a * b * c | a <- [1 .. n `div` 3], b <- [a+1 .. n `div` 2], c <- [n - a - b], a * a + b * b == c * …

Problem 7

Problem 7は10001 番目の素数を求める問題です。 primes = 2:f [3,5..] where f (x:xs) = x:f [y | y <- xs, y `mod` x /= 0] main = print $ primes !! 10000 遅いです。素数を求めるのにもっと速い方法があるはずですが…まあ、色々な方法を探してみようか…

Problem 6

六日目でもう更新忘れるところでした(汗今回はProblem 6です。1~100の和の二乗と二乗の和の差を求める問題です。 main = print $ (sum [1..100]) ^ 2 - sum [x * x | x <- [1..100]] 和の二乗から二乗の和をひくだけです。ただの計算でした。

Problem 5

Problem 5は、最小公倍数を求める問題ですね。 main = print $ foldl1 lcm [2..20] 標準ライブラリにlcmがあるので簡単に求められますね。ちょっとつまらない気もしますが…まあいいでしょう。

Problem 4

4日目です。今回はProblem 4を…「3桁の数の積で表される回文数のうち最大のものはいくらになるか。」って問題ですね。 isPalindromic n = (show n) == reverse (show n) main = print . maximum $ [x | x <- [y * z | y <- [100..999], z <- [y..999]], isPa…

Problem 3

今回はProblem 3を…素因数分解の問題ですね。どこかでunfoldrを使った素因数分解を見た記憶があったので再現(?)してみました。 import Data.List fac x = case [y | y <- [2..x], x `mod` y == 0] of [] -> Nothing [t] -> Just (t, 0) (t:_) -> Just (t, x …

Problem 2

それでは今日はProblem 2を…400万までのフィボナッチ数列の偶数を足していく問題です。 main = print . sum . takeWhile (<=4000000) $ [x | x <- fb, even x] ] where fb = 1:2:[x + y | (x, y) <- zip fb (tail fb)] こんな感じかな?フィボナッチ数列も意…

Problem 1

はじめに 最近はネタがなく一ヶ月以上更新してなかったのでProject EulerをHaskellでやっていこうかと思います。 本題 今回はProblem 1なのでここに書くほどのものでもないですが… main = print . sum $ [x | x <- [1..999], x `rem` 3 == 0 || x `rem` 5 ==…