Fix Haskell code with ormolu

This commit is contained in:
daniele 2024-12-15 11:31:42 +01:00
parent 6ebb82fb8c
commit 751673989c
Signed by: fuxino
GPG Key ID: 981A2B2A3BBF5514
34 changed files with 540 additions and 430 deletions

@ -1,12 +1,13 @@
module ProjectEuler
( isPrime
, primeSieve
, lcmm
, digitSum
, sumProperDivisors
, countDivisors
, isPandigital
) where
( isPrime,
primeSieve,
lcmm,
digitSum,
sumProperDivisors,
countDivisors,
isPandigital,
)
where
import Data.Char (digitToInt)
import Data.List (nub)
@ -18,7 +19,8 @@ isPrime 2 = True
isPrime 3 = True
isPrime n =
n > 0 && odd n && n `mod` 3 /= 0 && null [x | x <- candidates, n `mod` x == 0 || n `mod` (x + 2) == 0]
where candidates = [5,11..limit]
where
candidates = [5, 11 .. limit]
limit = floor (sqrt (fromIntegral n)) + 1
primeSieve :: (Integral n) => [n]
@ -33,13 +35,15 @@ digitSum :: (Integral a, Show a) => a -> Int
digitSum n = sum $ map digitToInt $ show n
sumProperDivisors :: (Integral a) => a -> a
sumProperDivisors n = sum [ if x /= y then x + y else x | x <- [2..floor $ sqrt $ fromIntegral n], let y = n `div` x, n `mod` x == 0 ] + 1
sumProperDivisors n = sum [if x /= y then x + y else x | x <- [2 .. floor $ sqrt $ fromIntegral n], let { y = n `div` x }, n `mod` x == 0] + 1
countDivisors :: (Integral a) => a -> Int
countDivisors n = length $ nub $ concat [[x, n `div` x] | x <- [1 .. limit], n `mod` x == 0]
where limit = floor $ sqrt $ fromIntegral n
where
limit = floor $ sqrt $ fromIntegral n
isPandigital :: Integer -> Bool
isPandigital n = n_length == length (nub n_char) && '0' `notElem` n_char && digitToInt (maximum n_char) == n_length
where n_char = show n
where
n_char = show n
n_length = length n_char

@ -4,9 +4,12 @@
sumMultiples :: Int
sumMultiples = sum $ filter p [1 .. 999]
where p n = n `mod` 3 == 0 || n `mod` 5 == 0
where
p n = n `mod` 3 == 0 || n `mod` 5 == 0
main = do
let result = sumMultiples
putStrLn $ "Project Euler, Problem 1\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 1\n"
++ "Answer: "
++ show result

@ -14,5 +14,7 @@ sumEvenFib = sum $ filter even $ takeWhile (<=4000000) (map fib [0..])
main = do
let result = sumEvenFib
putStrLn $ "Project Euler, Problem 2\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 2\n"
++ "Answer: "
++ show result

@ -11,5 +11,7 @@ maxPrimeFactor n
main = do
let result = maxPrimeFactor 600851475143
putStrLn $ "Project Euler, Problem 3\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 3\n"
++ "Answer: "
++ show result

@ -11,5 +11,7 @@ maxPalindrome =
main = do
let result = maxPalindrome
putStrLn $ "Project Euler, Problem 4\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 4\n"
++ "Answer: "
++ show result

@ -6,5 +6,7 @@ import ProjectEuler (lcmm)
main = do
let result = lcmm [1 .. 20]
putStrLn $ "Project Euler, Problem 5\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 5\n"
++ "Answer: "
++ show result

@ -15,5 +15,7 @@ sumSquareDiff n = (sum [1..n] ^2) - sum (map (^2) [1..n])
main = do
let result = sumSquareDiff 100
putStrLn $ "Project Euler, Problem 6\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 6\n"
++ "Answer: "
++ show result

@ -9,5 +9,7 @@ nthPrime n = last $ take n [ x | x <- [1..], isPrime x ]
main = do
let result = nthPrime 10001
putStrLn $ "Project Euler, Problem 7\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 7\n"
++ "Answer: "
++ show result

@ -31,7 +31,8 @@ nDigitProduct n s
| otherwise = max (product (map digitToInt (take n s))) (nDigitProduct n (tail s))
main = do
let s = "73167176531330624919225119674426574742355349194934"
let s =
"73167176531330624919225119674426574742355349194934"
++ "96983520312774506326239578318016984801869478851843"
++ "85861560789112949495459501737958331952853208805511"
++ "12540698747158523863050715693290963295227443043557"
@ -52,5 +53,7 @@ main = do
++ "05886116467109405077541002256983155200055935729725"
++ "71636269561882670428252483600823257530420752963450"
result = nDigitProduct 13 s
putStrLn $ "Project Euler, Problem 8\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 8\n"
++ "Answer: "
++ show result

@ -16,5 +16,7 @@ prodTriplet (x, y, z) = x * y * z
main = do
let result = prodTriplet $ pythagoreanTriplet 1000
putStrLn $ "Project Euler, Problem 9\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 9\n"
++ "Answer: "
++ show result

@ -6,5 +6,7 @@ import ProjectEuler (primeSieve)
main = do
let result = sum $ takeWhile (< 2000000) primeSieve
putStrLn $ "Project Euler, Problem 10\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 10\n"
++ "Answer: "
++ show result

@ -29,7 +29,9 @@ import Data.List (transpose)
diagonals :: [[Int]] -> [[Int]]
diagonals xs = diagonals' xs ++ diagonals' ((transpose . reverse) xs)
where diagonals' xs = transpose (zipWith drop [0..] xs)
where
diagonals' xs =
transpose (zipWith drop [0 ..] xs)
++ transpose (zipWith drop [1 ..] (transpose xs))
maxProd4 :: [Int] -> Int
@ -37,30 +39,34 @@ maxProd4 [x, y, z] = 0
maxProd4 (w : x : y : z : xs) = max (w * x * y * z) (maxProd4 (x : y : z : xs))
main = do
let grid = [[ 8, 2, 22, 97, 38, 15, 0, 40, 0, 75, 4, 5, 7, 78, 52, 12, 50, 77, 91, 8]
,[49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 4, 56, 62, 0]
,[81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 3, 49, 13, 36, 65]
,[52, 70, 95, 23, 4, 60, 11, 42, 69, 24, 68, 56, 1, 32, 56, 71, 37, 2, 36, 91]
,[22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80]
,[24, 47, 32, 60, 99, 3, 45, 2, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50]
,[32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70]
,[67, 26, 20, 68, 2, 62, 12, 20, 95, 63, 94, 39, 63, 8, 40, 91, 66, 49, 94, 21]
,[24, 55, 58, 5, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72]
,[21, 36, 23, 9, 75, 0, 76, 44, 20, 45, 35, 14, 0, 61, 33, 97, 34, 31, 33, 95]
,[78, 17, 53, 28, 22, 75, 31, 67, 15, 94, 3, 80, 4, 62, 16, 14, 9, 53, 56, 92]
,[16, 39, 5, 42, 96, 35, 31, 47, 55, 58, 88, 24, 0, 17, 54, 24, 36, 29, 85, 57]
,[86, 56, 0, 48, 35, 71, 89, 7, 5, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58]
,[19, 80, 81, 68, 5, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 4, 89, 55, 40]
,[ 4, 52, 8, 83, 97, 35, 99, 16, 7, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66]
,[88, 36, 68, 87, 57, 62, 20, 72, 3, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69]
,[ 4, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 8, 46, 29, 32, 40, 62, 76, 36]
,[20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74, 4, 36, 16]
,[20, 73, 35, 29, 78, 31, 90, 1, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 5, 54]
,[ 1, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 1, 89, 19, 67, 48]]
let grid =
[ [8, 2, 22, 97, 38, 15, 0, 40, 0, 75, 4, 5, 7, 78, 52, 12, 50, 77, 91, 8],
[49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 4, 56, 62, 0],
[81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 3, 49, 13, 36, 65],
[52, 70, 95, 23, 4, 60, 11, 42, 69, 24, 68, 56, 1, 32, 56, 71, 37, 2, 36, 91],
[22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80],
[24, 47, 32, 60, 99, 3, 45, 2, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50],
[32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70],
[67, 26, 20, 68, 2, 62, 12, 20, 95, 63, 94, 39, 63, 8, 40, 91, 66, 49, 94, 21],
[24, 55, 58, 5, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72],
[21, 36, 23, 9, 75, 0, 76, 44, 20, 45, 35, 14, 0, 61, 33, 97, 34, 31, 33, 95],
[78, 17, 53, 28, 22, 75, 31, 67, 15, 94, 3, 80, 4, 62, 16, 14, 9, 53, 56, 92],
[16, 39, 5, 42, 96, 35, 31, 47, 55, 58, 88, 24, 0, 17, 54, 24, 36, 29, 85, 57],
[86, 56, 0, 48, 35, 71, 89, 7, 5, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58],
[19, 80, 81, 68, 5, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 4, 89, 55, 40],
[4, 52, 8, 83, 97, 35, 99, 16, 7, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66],
[88, 36, 68, 87, 57, 62, 20, 72, 3, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69],
[4, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 8, 46, 29, 32, 40, 62, 76, 36],
[20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74, 4, 36, 16],
[20, 73, 35, 29, 78, 31, 90, 1, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 5, 54],
[1, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 1, 89, 19, 67, 48]
]
diags = filter (\x -> length x >= 4) $ diagonals grid
maxRow = maximum $ map maxProd4 grid
maxCol = maximum . map maxProd4 $ transpose grid
maxDiag = maximum $ map maxProd4 diags
result = maximum [maxRow, maxCol, maxDiag]
putStrLn $ "Project Euler, Problem 11\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 11\n"
++ "Answer: "
++ show result

@ -28,5 +28,7 @@ triang500 = head [ x | x <- triangNumbers, countDivisors x > 500 ]
main = do
let result = triang500
putStrLn $ "Project Euler, Problem 12\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 12\n"
++ "Answer: "
++ show result

@ -105,107 +105,112 @@ firstDigitsSum :: Int -> [Integer] -> Int
firstDigitsSum n xs = read . take n . show $ sum xs
main = do
let result = firstDigitsSum 10 [37107287533902102798797998220837590246510135740250
, 46376937677490009712648124896970078050417018260538
, 74324986199524741059474233309513058123726617309629
, 91942213363574161572522430563301811072406154908250
, 23067588207539346171171980310421047513778063246676
, 89261670696623633820136378418383684178734361726757
, 28112879812849979408065481931592621691275889832738
, 44274228917432520321923589422876796487670272189318
, 47451445736001306439091167216856844588711603153276
, 70386486105843025439939619828917593665686757934951
, 62176457141856560629502157223196586755079324193331
, 64906352462741904929101432445813822663347944758178
, 92575867718337217661963751590579239728245598838407
, 58203565325359399008402633568948830189458628227828
, 80181199384826282014278194139940567587151170094390
, 35398664372827112653829987240784473053190104293586
, 86515506006295864861532075273371959191420517255829
, 71693888707715466499115593487603532921714970056938
, 54370070576826684624621495650076471787294438377604
, 53282654108756828443191190634694037855217779295145
, 36123272525000296071075082563815656710885258350721
, 45876576172410976447339110607218265236877223636045
, 17423706905851860660448207621209813287860733969412
, 81142660418086830619328460811191061556940512689692
, 51934325451728388641918047049293215058642563049483
, 62467221648435076201727918039944693004732956340691
, 15732444386908125794514089057706229429197107928209
, 55037687525678773091862540744969844508330393682126
, 18336384825330154686196124348767681297534375946515
, 80386287592878490201521685554828717201219257766954
, 78182833757993103614740356856449095527097864797581
, 16726320100436897842553539920931837441497806860984
, 48403098129077791799088218795327364475675590848030
, 87086987551392711854517078544161852424320693150332
, 59959406895756536782107074926966537676326235447210
, 69793950679652694742597709739166693763042633987085
, 41052684708299085211399427365734116182760315001271
, 65378607361501080857009149939512557028198746004375
, 35829035317434717326932123578154982629742552737307
, 94953759765105305946966067683156574377167401875275
, 88902802571733229619176668713819931811048770190271
, 25267680276078003013678680992525463401061632866526
, 36270218540497705585629946580636237993140746255962
, 24074486908231174977792365466257246923322810917141
, 91430288197103288597806669760892938638285025333403
, 34413065578016127815921815005561868836468420090470
, 23053081172816430487623791969842487255036638784583
, 11487696932154902810424020138335124462181441773470
, 63783299490636259666498587618221225225512486764533
, 67720186971698544312419572409913959008952310058822
, 95548255300263520781532296796249481641953868218774
, 76085327132285723110424803456124867697064507995236
, 37774242535411291684276865538926205024910326572967
, 23701913275725675285653248258265463092207058596522
, 29798860272258331913126375147341994889534765745501
, 18495701454879288984856827726077713721403798879715
, 38298203783031473527721580348144513491373226651381
, 34829543829199918180278916522431027392251122869539
, 40957953066405232632538044100059654939159879593635
, 29746152185502371307642255121183693803580388584903
, 41698116222072977186158236678424689157993532961922
, 62467957194401269043877107275048102390895523597457
, 23189706772547915061505504953922979530901129967519
, 86188088225875314529584099251203829009407770775672
, 11306739708304724483816533873502340845647058077308
, 82959174767140363198008187129011875491310547126581
, 97623331044818386269515456334926366572897563400500
, 42846280183517070527831839425882145521227251250327
, 55121603546981200581762165212827652751691296897789
, 32238195734329339946437501907836945765883352399886
, 75506164965184775180738168837861091527357929701337
, 62177842752192623401942399639168044983993173312731
, 32924185707147349566916674687634660915035914677504
, 99518671430235219628894890102423325116913619626622
, 73267460800591547471830798392868535206946944540724
, 76841822524674417161514036427982273348055556214818
, 97142617910342598647204516893989422179826088076852
, 87783646182799346313767754307809363333018982642090
, 10848802521674670883215120185883543223812876952786
, 71329612474782464538636993009049310363619763878039
, 62184073572399794223406235393808339651327408011116
, 66627891981488087797941876876144230030984490851411
, 60661826293682836764744779239180335110989069790714
, 85786944089552990653640447425576083659976645795096
, 66024396409905389607120198219976047599490197230297
, 64913982680032973156037120041377903785566085089252
, 16730939319872750275468906903707539413042652315011
, 94809377245048795150954100921645863754710598436791
, 78639167021187492431995700641917969777599028300699
, 15368713711936614952811305876380278410754449733078
, 40789923115535562561142322423255033685442488917353
, 44889911501440648020369068063960672322193204149535
, 41503128880339536053299340368006977710650566631954
, 81234880673210146739058568557934581403627822703280
, 82616570773948327592232845941706525094512325230608
, 22918802058777319719839450180888072429661980811197
, 77158542502016545090413245809786882778948721859617
, 72107838435069186155435662884062257473692284509516
, 20849603980134001723930671666823555245252804609722
, 53503534226472524250874054075591789781264330331690
let result =
firstDigitsSum
10
[ 37107287533902102798797998220837590246510135740250,
46376937677490009712648124896970078050417018260538,
74324986199524741059474233309513058123726617309629,
91942213363574161572522430563301811072406154908250,
23067588207539346171171980310421047513778063246676,
89261670696623633820136378418383684178734361726757,
28112879812849979408065481931592621691275889832738,
44274228917432520321923589422876796487670272189318,
47451445736001306439091167216856844588711603153276,
70386486105843025439939619828917593665686757934951,
62176457141856560629502157223196586755079324193331,
64906352462741904929101432445813822663347944758178,
92575867718337217661963751590579239728245598838407,
58203565325359399008402633568948830189458628227828,
80181199384826282014278194139940567587151170094390,
35398664372827112653829987240784473053190104293586,
86515506006295864861532075273371959191420517255829,
71693888707715466499115593487603532921714970056938,
54370070576826684624621495650076471787294438377604,
53282654108756828443191190634694037855217779295145,
36123272525000296071075082563815656710885258350721,
45876576172410976447339110607218265236877223636045,
17423706905851860660448207621209813287860733969412,
81142660418086830619328460811191061556940512689692,
51934325451728388641918047049293215058642563049483,
62467221648435076201727918039944693004732956340691,
15732444386908125794514089057706229429197107928209,
55037687525678773091862540744969844508330393682126,
18336384825330154686196124348767681297534375946515,
80386287592878490201521685554828717201219257766954,
78182833757993103614740356856449095527097864797581,
16726320100436897842553539920931837441497806860984,
48403098129077791799088218795327364475675590848030,
87086987551392711854517078544161852424320693150332,
59959406895756536782107074926966537676326235447210,
69793950679652694742597709739166693763042633987085,
41052684708299085211399427365734116182760315001271,
65378607361501080857009149939512557028198746004375,
35829035317434717326932123578154982629742552737307,
94953759765105305946966067683156574377167401875275,
88902802571733229619176668713819931811048770190271,
25267680276078003013678680992525463401061632866526,
36270218540497705585629946580636237993140746255962,
24074486908231174977792365466257246923322810917141,
91430288197103288597806669760892938638285025333403,
34413065578016127815921815005561868836468420090470,
23053081172816430487623791969842487255036638784583,
11487696932154902810424020138335124462181441773470,
63783299490636259666498587618221225225512486764533,
67720186971698544312419572409913959008952310058822,
95548255300263520781532296796249481641953868218774,
76085327132285723110424803456124867697064507995236,
37774242535411291684276865538926205024910326572967,
23701913275725675285653248258265463092207058596522,
29798860272258331913126375147341994889534765745501,
18495701454879288984856827726077713721403798879715,
38298203783031473527721580348144513491373226651381,
34829543829199918180278916522431027392251122869539,
40957953066405232632538044100059654939159879593635,
29746152185502371307642255121183693803580388584903,
41698116222072977186158236678424689157993532961922,
62467957194401269043877107275048102390895523597457,
23189706772547915061505504953922979530901129967519,
86188088225875314529584099251203829009407770775672,
11306739708304724483816533873502340845647058077308,
82959174767140363198008187129011875491310547126581,
97623331044818386269515456334926366572897563400500,
42846280183517070527831839425882145521227251250327,
55121603546981200581762165212827652751691296897789,
32238195734329339946437501907836945765883352399886,
75506164965184775180738168837861091527357929701337,
62177842752192623401942399639168044983993173312731,
32924185707147349566916674687634660915035914677504,
99518671430235219628894890102423325116913619626622,
73267460800591547471830798392868535206946944540724,
76841822524674417161514036427982273348055556214818,
97142617910342598647204516893989422179826088076852,
87783646182799346313767754307809363333018982642090,
10848802521674670883215120185883543223812876952786,
71329612474782464538636993009049310363619763878039,
62184073572399794223406235393808339651327408011116,
66627891981488087797941876876144230030984490851411,
60661826293682836764744779239180335110989069790714,
85786944089552990653640447425576083659976645795096,
66024396409905389607120198219976047599490197230297,
64913982680032973156037120041377903785566085089252,
16730939319872750275468906903707539413042652315011,
94809377245048795150954100921645863754710598436791,
78639167021187492431995700641917969777599028300699,
15368713711936614952811305876380278410754449733078,
40789923115535562561142322423255033685442488917353,
44889911501440648020369068063960672322193204149535,
41503128880339536053299340368006977710650566631954,
81234880673210146739058568557934581403627822703280,
82616570773948327592232845941706525094512325230608,
22918802058777319719839450180888072429661980811197,
77158542502016545090413245809786882778948721859617,
72107838435069186155435662884062257473692284509516,
20849603980134001723930671666823555245252804609722,
53503534226472524250874054075591789781264330331690
]
putStrLn $ "Project Euler, Problem 13\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 13\n"
++ "Answer: "
++ show result

@ -25,5 +25,7 @@ maxCollatzLength n = snd $ maximum $ zip [ length (collatz x) | x <- [1..n-1] ]
main = do
let result = maxCollatzLength 1000000
putStrLn $ "Project Euler, Problem 14\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 14\n"
++ "Answer: "
++ show result

@ -7,5 +7,7 @@ factorial n = n * factorial (n - 1)
main = do
let result = factorial 40 `div` factorial 20 ^ 2
putStrLn $ "Project Euler, Problem 15\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 15\n"
++ "Answer: "
++ show result

@ -6,5 +6,7 @@ import ProjectEuler (digitSum)
main = do
let result = digitSum $ 2 ^ 1000
putStrLn $ "Project Euler, Problem 16\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 16\n"
++ "Answer: "
++ show result

@ -14,12 +14,15 @@
import Data.Time.Calendar (Day, DayOfWeek (Sunday), dayOfWeek, fromGregorian)
countSundaysFirst :: Day -> Day -> Int
countSundaysFirst start end = let days = [start .. end]
countSundaysFirst start end =
let days = [start .. end]
in length $ filter (\x -> dayOfWeek x == Sunday && [last (init (show x)), last (show x)] == "01") days
main = do
let startDate = fromGregorian 1901 1 1
endDate = fromGregorian 2000 12 31
result = countSundaysFirst startDate endDate
putStrLn $ "Project Euler, Problem 19\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 19\n"
++ "Answer: "
++ show result

@ -13,5 +13,7 @@ factorial n = n * factorial (n - 1)
main = do
let result = digitSum $ factorial 100
putStrLn $ "Project Euler, Problem 20\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 20\n"
++ "Answer: "
++ show result

@ -19,5 +19,7 @@ sumAmicable n = sum [ x | x <- [1..n-1], amicable x $ sumProperDivisors x ]
main = do
let result = sumAmicable 10000
putStrLn $ "Project Euler, Problem 21\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 21\n"
++ "Answer: "
++ show result

@ -11,12 +11,15 @@ import Data.List (sort)
import Data.List.Split (splitOn)
nameScore :: String -> Int
nameScore s = let a = ord 'A' - 1
nameScore s =
let a = ord 'A' - 1
in sum $ map ((\x -> x - a) . ord) s
main = do
contents <- readFile "p022_names.txt"
let name_scores = map nameScore . sort . splitOn "," $ filter (/= '"') contents
result = sum $ zipWith (*) name_scores [1 ..]
putStrLn $ "Project Euler, Problem 22\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 22\n"
++ "Answer: "
++ show result

@ -11,7 +11,6 @@
-- Find the sum of all the positive integers which cannot be written as the sum of two abundant numbers.
import Data.List ((\\))
import qualified Data.Set as Set
import ProjectEuler (sumProperDivisors)
isAbundant :: (Integral a) => a -> Bool
@ -19,12 +18,15 @@ isAbundant n = sumProperDivisors n > n
abundantSums :: (Integral a) => [a]
abundantSums = Set.toList $ Set.fromList [x + y | x <- abundantList, y <- abundantList, x + y <= 28123, y >= x]
where abundantList = [ x | x <- [12..28123], isAbundant x ]
where
abundantList = [x | x <- [12 .. 28123], isAbundant x]
sumNotAbundant :: (Integral a) => a
sumNotAbundant = sum $ [1 .. 28123] \\ abundantSums
main = do
let result = sumNotAbundant
putStrLn $ "Project Euler, Problem 23\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 23\n"
++ "Answer: "
++ show result

@ -5,9 +5,11 @@
--
-- What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9?
import Data.List (sort, permutations)
import Data.List (permutations, sort)
main = do
let result = sort (permutations "0123456789") !! 999999
putStrLn $ "Project Euler, Problem 24\n"
++ "Answer: " ++ result
putStrLn $
"Project Euler, Problem 24\n"
++ "Answer: "
++ result

@ -26,5 +26,7 @@ thousandDigitFib = length $ takeWhile (\x -> length (show x) < 1000) fibs
main = do
let result = thousandDigitFib
putStrLn $ "Project Euler, Problem 25\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 25\n"
++ "Answer: "
++ show result

@ -30,9 +30,12 @@ findCycleLength n = findCycleLengthRecursive ((removeFactor 2 . removeFactor 5)
maxRepeatingCycle :: (Integral a) => a -> a -> a
maxRepeatingCycle a b = snd . maximum $ zip xs [1 ..]
where xs = map findCycleLength [a..b]
where
xs = map findCycleLength [a .. b]
main = do
let result = maxRepeatingCycle 1 999
putStrLn $ "Project Euler, Problem 26\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 26\n"
++ "Answer: "
++ show result

@ -18,14 +18,15 @@
-- Find the product of the coefficients, a and b, for the quadratic expression that produces the maximum number of primes for consecutive values of n,
-- starting with n=0.
import Data.List (maximumBy)
import Data.Function (on)
import Data.List (maximumBy)
import ProjectEuler (isPrime)
findLengthPrimeSequence :: Int -> Int -> Int
findLengthPrimeSequence a b = length $ takeWhile isPrime [n * n + a * n + b | n <- [0 ..]]
findCoefficients = let as = [-999..999]
findCoefficients =
let as = [-999 .. 999]
bs = filter isPrime [2 .. 1000]
cs = [(a, b) | a <- as, b <- bs]
in fst $ maximumBy (compare `on` snd) [(c, l) | c <- cs, let l = uncurry findLengthPrimeSequence c]
@ -33,5 +34,7 @@ findCoefficients = let as = [-999..999]
main = do
let coefficients = findCoefficients
result = uncurry (*) coefficients
putStrLn $ "Project Euler, Problem 27\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 27\n"
++ "Answer: "
++ show result

@ -17,5 +17,7 @@ powerCombinations n = nub [ x^y | x <- [2..n], y <- [2..n] ]
main = do
let result = length $ powerCombinations 100
putStrLn $ "Project Euler, Problem 29\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 29\n"
++ "Answer: "
++ show result

@ -20,5 +20,7 @@ equalsSumNthPowerDigit p n = n == sumNthPowerDigit p n
main = do
let result = sum $ filter (equalsSumNthPowerDigit 5) [10 .. 354295]
putStrLn $ "Project Euler, Problem 30\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 30\n"
++ "Answer: "
++ show result

@ -14,10 +14,13 @@ factDigits :: [Int]
factDigits = map factorial [0 .. 9]
equalsDigitFactorial :: Int -> Bool
equalsDigitFactorial n = let fact_digit_sum = sum $ [ factDigits !! x | x <- map digitToInt (show n) ]
equalsDigitFactorial n =
let fact_digit_sum = sum $ [factDigits !! x | x <- map digitToInt (show n)]
in fact_digit_sum == n
main = do
let result = sum $ filter equalsDigitFactorial [10 .. 9999999]
putStrLn $ "Project Euler, Problem 34\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 34\n"
++ "Answer: "
++ show result

@ -13,11 +13,12 @@ isCircularPrime n
| any (`elem` ['0', '2' .. '8']) (show n) = False
| all (isPrime . read) rotations = True
| otherwise = False
where rotations = zipWith (++) (tails (show n)) (init (inits (show n)))
--isCircularPrime n = let rotations = zipWith (++) (tails (show n)) (init (inits (show n)))
-- in all (isPrime . read) rotations
where
rotations = zipWith (++) (tails (show n)) (init (inits (show n)))
main = do
let result = length $ filter isCircularPrime (takeWhile (< 1000000) primeSieve)
putStrLn $ "Project Euler, Problem 35\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 35\n"
++ "Answer: "
++ show result

@ -14,5 +14,7 @@ doublePalindrome n = show n == reverse (show n) && toBinary n == reverse (toBina
main = do
let result = sum $ filter doublePalindrome [1 .. 999999]
putStrLn $ "Project Euler, Problem 36\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 36\n"
++ "Answer: "
++ show result

@ -3,12 +3,14 @@
--
-- What is the largest n-digit pandigital prime that exists?
import ProjectEuler (isPrime, isPandigital)
import ProjectEuler (isPandigital, isPrime)
maxPandigitalPrime :: Integer
maxPandigitalPrime = head $ filter isPrime (filter isPandigital [7654321, 7654319 ..])
main = do
let result = maxPandigitalPrime
putStrLn $ "Project Euler, Problem 41\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 41\n"
++ "Answer: "
++ show result

@ -8,5 +8,7 @@ smallestPermutedMultiples = head [ x | x <- [1..], sort (show x) == sort (show
main = do
let result = smallestPermutedMultiples
putStrLn $ "Project Euler, Problem 52\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 52\n"
++ "Answer: "
++ show result

@ -44,26 +44,31 @@
--
-- How many hands does Player 1 win?
import Data.List (sort, sortBy, groupBy, minimumBy, maximumBy)
import Data.Function (on)
import Data.List (groupBy, maximumBy, minimumBy, sort, sortBy)
import Data.Maybe (fromJust)
data Value = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King | Ace
deriving (Eq, Ord, Show, Bounded, Enum)
data Suit = Hearts | Diamonds | Clubs | Spades deriving (Eq, Show)
data Card = Card { value :: Maybe Value
, suit :: Maybe Suit
} deriving (Eq, Show)
data Card = Card
{ value :: Maybe Value,
suit :: Maybe Suit
}
deriving (Eq, Show)
instance Ord Card where
(Card v1 _) `compare` (Card v2 _) = v1 `compare` v2
type Hand = [Card]
data PokerGame = PokerGame { player1 :: Hand
, player2 :: Hand
} deriving (Eq, Show)
data PokerGame = PokerGame
{ player1 :: Hand,
player2 :: Hand
}
deriving (Eq, Show)
getValue :: Char -> Maybe Value
getValue '2' = Just Two
@ -103,8 +108,8 @@ straightFlush :: Hand -> Bool
straightFlush h =
let hs@(x : _) = sort h
start = fromJust . value $ x
in length (head (groupBy ((==) `on` suit) hs)) == 5 &&
take 5 [start..] == map (fromJust . value) hs
in length (head (groupBy ((==) `on` suit) hs)) == 5
&& take 5 [start ..] == map (fromJust . value) hs
fourOfAKind :: Hand -> Bool
fourOfAKind h =
@ -113,8 +118,8 @@ fourOfAKind h =
fullHouse :: Hand -> Bool
fullHouse h =
let hs = sort h
in length (minimumBy (compare `on` length) (groupBy ((==) `on` value) hs)) == 2 &&
length (maximumBy (compare `on` length) (groupBy ((==) `on` value) hs)) == 3
in length (minimumBy (compare `on` length) (groupBy ((==) `on` value) hs)) == 2
&& length (maximumBy (compare `on` length) (groupBy ((==) `on` value) hs)) == 3
flush :: Hand -> Bool
flush h =
@ -183,15 +188,32 @@ playGame g
| twoPairs (player1 g) && twoPairs (player2 g) =
let (v : w : x : y : z : _) = sort $ player1 g
(a : b : c : d : e : _) = sort $ player2 g
in if value y > value d then 1
else if value y < value d then -1
else if value w > value b then 1
else if value w < value b then -1
else if value z > value e then 1
else if value z < value e then -1
else if value x > value c then 1
else if value x < value c then -1
else if value v > value a then 1
in if value y > value d
then 1
else
if value y < value d
then -1
else
if value w > value b
then 1
else
if value w < value b
then -1
else
if value z > value e
then 1
else
if value z < value e
then -1
else
if value x > value c
then 1
else
if value x < value c
then -1
else
if value v > value a
then 1
else -1
| pair (player1 g) && not (pair (player2 g)) = 1
| pair (player2 g) && not (pair (player1 g)) = -1
@ -200,9 +222,14 @@ playGame g
p2 = findPairVal (player2 g)
xs = reverse . sort $ player1 g
ys = reverse . sort $ player2 g
in if p1 > p2 then 1
else if p2 > p1 then -1
else if xs > ys then 1
in if p1 > p2
then 1
else
if p2 > p1
then -1
else
if xs > ys
then 1
else -1
| otherwise =
let xs = reverse . sort $ player1 g
@ -213,5 +240,7 @@ main = do
contents <- readFile "p054_poker.txt"
let games = map readGame (lines contents)
result = sum $ filter (== 1) $ map playGame games
putStrLn $ "Project Euler, Problem 54\n"
++ "Answer: " ++ show result
putStrLn $
"Project Euler, Problem 54\n"
++ "Answer: "
++ show result