haskell

Project Euler Problem 22

http://projecteuler.net/index.php?section=problems&id=22(和訳) readFile関数を探すのに手間取ってしまった。 import Data.List import Data.Char main = do names <- readFile "names.txt" print $ euler22 $ (read ("[" ++ names ++ "]") :: [String]) …

Project Euler Problem 21

http://projecteuler.net/index.php?section=problems&id=21 10000未満の友愛数の合計 数学的にうまい方法はあるんだろうけど、定義のまんまごり押しで main = print $ sum $ filter isAmicable [1..10000] isAmicable :: Int -> Bool isAmicable n = let d …

Project Euler Problem 20

http://projecteuler.net/index.php?section=problems&id=20 100!各桁の和 import Char main = print $ sumOfDigits $ product [1..100] --Problem16より sumOfDigits :: Integer -> Int sumOfDigits = sum . map digitToInt . show

Project Euler Problem 19

http://projecteuler.net/index.php?section=problems&id=19 20世紀の月初めの日曜日の数を求める。0を日曜、6を土曜とする。 main = print $ euler19 euler19 :: Int euler19 = euler19' 1900 1 1 where euler19' y m w = if y == 2001 then 0 else let w' …

Project Euler Problem 18

http://projecteuler.net/index.php?section=problems&id=18 以下の三角形の頂点から底辺までの和の最大値(移動ルートは直下の左右のみ) 75 95 64 17 47 82 18 35 87 10 20 04 82 47 65 19 01 23 75 03 34 88 02 77 73 07 63 67 99 65 04 28 06 16 70 92 41 …

Project Euler Problem 17

http://projecteuler.net/index.php?section=problems&id=17 1から1000を英語で書いた場合の文字数 main = print $ length $ foldl1 (++) $ map toWords [1..1000] toWords :: Int -> String toWords 1000 = "one" ++ "thousand" toWords n = let h = n `div…

Project Euler Problem 16

http://projecteuler.net/index.php?section=problems&id=16 21000の各桁の和 import Char main = print $ sumOfDigits $ 2 ^ 1000 sumOfDigits :: Integer -> Int sumOfDigits = sum . map digitToInt . show

Project Euler Problem 15

http://projecteuler.net/index.php?section=problems&id=15 20×20のマス目の左上から右下へのルートは何通りか。 高校の順列・組み合わせ分野であったなこーゆーの。 40C20でおk。 main = print $ conbination 40 20 conbination :: Integer -> Integer -> …

Project Euler Problem 14

http://projecteuler.net/index.php?section=problems&id=14 100万未満の数字で、その数字から始まるコラッツ数列が最長になる数。 main = print $ euler14 999999 euler14 :: Integer -> Integer euler14 n = toInteger $ (+1) $ length $ takeWhile (< (ma…

Project Euler Problem 13

http://projecteuler.net/index.php?section=problems&id=13 50桁の数字100個の総和の上位100桁 nums = [37107287533902102798797998220837590246510135740250, 46376937677490009712648124896970078050417018260538, 7432498619952474105947423330951305812…

Project Euler Problem 12

http://projecteuler.net/index.php?section=problems&id=12 501個以上の約数を持つ最初の三角数 main = print $ fst $ head $ filter (\x -> (snd x) > 500) (map (\n -> (n, factorsNumber n)) triangleNumbers) --約数チェックは平方根未満まで(ペアの約…

Project Euler Problem 11

http://projecteuler.net/index.php?section=problems&id=11 与えられた行列の上下左右斜めいずれかで連続する4つの数字の積のうち最大のもの nums = [[08,02,22,97,38,15,00,40,00,75,04,05,07,78,52,12,50,77,91,08], [49,49,99,40,17,81,18,57,60,87,17,4…

Project Euler Problem 10

http://projecteuler.net/index.php?section=problems&id=10 200万以下の素数の和 main = print $ foldl1 (+) (primeList 1 2000000) primeList :: Integer -> Integer -> [Integer] primeList n max = let x = nextPrime n in if x > max then [] else [x] …

Project Euler Problem 9

http://projecteuler.net/index.php?section=problems&id=9合計が1000になるピタゴラス数の積 main = print $ (\(a,b,c) -> a * b * c) $ head $ filter isPythagoreanTriplet [(x,y,1000-x-y) | x <- [1..1000], y <- [1..x]] where isPythagoreanTriplet (…

Project Euler Problem 8

http://projecteuler.net/index.php?section=problems&id=8以下の数値の連続する5つの数値のうち、積が最大になるもの 73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501…

Project Euler Problem 7

http://projecteuler.net/index.php?section=problems&id=7 10001番目の素数を求める。nextPrime,isPrimeはProblem3から --時間かかりすぎ main = print $ ((primeList 1) !! 10000) primeList :: Integer -> [Integer] primeList n = [nextPrime n] ++ (pri…

Project Euler Problem 6

http://projecteuler.net/index.php?section=problems&id=61から100の和の2乗と2乗の和の差 main = print $ ((sum [1..100]) ^ 2) - (sum $ map (^ 2) [1..100])

リストから重複を削除

--リストから重複削除 uniqList :: [Integer] -> [Integer] uniqList [] = [] uniqList (x:xs) = (if x `elem` xs then [] else [x]) ++ (uniqList xs) --多相型に uniqList :: Eq a => [a] -> [a] uniqList [] = [] uniqList (x:xs) = (if x `elem` xs then…

Project Euler Problem 5

http://projecteuler.net/index.php?section=problems&id=5 1から20全てで割り切れる最小の数 --時間かかりすぎ main = print $ head $ filter (isCommonMultiples [1..20]) [21..] isCommonMultiples :: [Int] -> Int -> Bool isCommonMultiples [] _ = Tru…

同じ要素の無限リスト

Prelude> take 10 [2,2..] [2,2,2,2,2,2,2,2,2,2]

Project Euler Problem 4

http://projecteuler.net/index.php?section=problems&id=43桁の数の積である回文数のうち最大のもの main = print $ euler4 euler4 = maximum $ filter isPalindromic [x*y| x <- [100..999], y <- [100..999]] isPalindromic :: Int -> Bool isPalindromic…

Project Euler Problem 3

http://projecteuler.net/index.php?section=problems&id=3 600851475143の素因数のうち最大のもの main = print $ last $ primeFactors 600851475143 2 primeFactors :: Integer -> Integer -> [Integer] primeFactors x y | x > y = if (x `mod` y == 0) t…

Project Euler Problem 2

http://projecteuler.net/index.php?section=problems&id=2400万を超えない範囲のフィボナッチ数列で値が偶数である項の総和。 main = print $ foldl (+) 0 $ evenNumbers $ fib 1 2 evenNumbers :: [Int] -> [Int] evenNumbers xs = [x | x <- xs, x `mod` …

Project Euler Problem 1

Haskellをちょっと勉強したので、練習がてらProject Eulerを始めてみる。まず1問目。 http://projecteuler.net/index.php?section=problems&id=1 1から999のうち、3または5の倍数の総和。FizzBuzzぽい。 main = print $ foldl (+) 0 [x | x <- [1..999], x `…