Last active
January 7, 2016 05:43
-
-
Save sooop/1155fc9a3f40eeca4330 to your computer and use it in GitHub Desktop.
Project Euler in Haskell #002 (011 ~ 020)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-아래와 같은 20×20 격자가 있습니다. | |
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 40 98 43 69 48 04 56 62 00 | |
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 | |
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 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 03 45 02 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 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 | |
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 | |
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 | |
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 | |
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 | |
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 | |
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 | |
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 | |
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 | |
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 | |
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 | |
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 | |
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 | |
위에서 대각선 방향으로 연속된 붉은 숫자 네 개의 곱은 26 × 63 × 78 × 14 = 1788696 입니다. | |
그러면 수평, 수직, 또는 대각선 방향으로 연속된 숫자 네 개의 곱 중 최대값은 얼마입니까?-} | |
string :: String | |
string = "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 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 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 03 45 02 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 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48" | |
_width :: Integer | |
_width = 20 | |
_height :: Integer | |
_height = 20 | |
numbers :: [Integer] | |
numbers = map read . words $ string | |
numberAt :: (Integer, Integer) -> Integer | |
numberAt (x, y) | |
|x >= 0 && x < 20 && y >= 0 && y < 20 = let index = x + (y * _width) in | |
numbers !! (fromIntegral index) | |
|otherwise = 0 | |
rights :: [Integer] | |
rights = let coords = [(x, y) | x <- [0..16], y <- [0..19]] | |
getP (x, y) = numberAt (x, y) * numberAt (x+1, y) * numberAt (x+2, y) * numberAt (x+3, y) | |
in | |
map getP coords | |
downs :: [Integer] | |
downs = let coords = [(x,y) | x <- [0..19], y <- [0..16]] | |
getP (x,y) = numberAt (x, y) * numberAt (x, y+1) * numberAt (x, y+2) * numberAt (x, y+3) | |
in | |
map getP coords | |
drs :: [Integer] | |
drs = let coords = [(x,y) | x <- [0..16], y <- [0..16]] | |
getP (x,y) = numberAt (x, y) * numberAt (x+1, y+1) * numberAt (x+2, y+2) * numberAt (x+3, y+3) | |
in | |
map getP coords | |
dls :: [Integer] | |
dls = let coords = [(x,y) | x <- [3..19], y <- [0..16]] | |
getP (x,y) = numberAt (x, y) * numberAt (x-1, y+1) * numberAt (x-2, y+2) * numberAt (x-3, y+3) | |
in | |
map getP coords | |
main = print $ foldr1 max $ (dls ++ drs ++ downs ++ rights) | |
-- 70600674 | |
-- real 0m1.224s |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-1부터 n까지의 자연수를 차례로 더하여 구해진 값을 삼각수라고 합니다. | |
예를 들어 7번째 삼각수는 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28이 됩니다. | |
이런 식으로 삼각수를 구해 나가면 다음과 같습니다. | |
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... | |
이 삼각수들의 약수를 구해봅시다. | |
1: 1 | |
3: 1, 3 | |
6: 1, 2, 3, 6 | |
10: 1, 2, 5, 10 | |
15: 1, 3, 5, 15 | |
21: 1, 3, 7, 21 | |
28: 1, 2, 4, 7, 14, 28 | |
위에서 보듯이, 5개 이상의 약수를 갖는 첫번째 삼각수는 28입니다. | |
그러면 500개 이상의 약수를 갖는 가장 작은 삼각수는 얼마입니까?-} | |
import Euler | |
main = print $ head . filter test $ [(x*(x + 1) )`div` 2 | x <- [1..]] | |
where test x = numberOfDivisors x >= 500 | |
-- 76576500 | |
-- real 0m5.388s |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-아래에 50자리 숫자가 100개 있습니다. 이것을 모두 더한 값의 첫 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-} | |
string = "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" | |
numbers :: [Integer] | |
numbers = map read . words $ string | |
main = print $ take 10 . show . foldr1 (+) $ numbers | |
-- "5537376230" | |
-- real 0m1.156s |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-양의 정수 n에 대하여, 다음과 같은 계산 과정을 반복하기로 합니다. | |
n → n / 2 (n이 짝수일 때) | |
n → 3 n + 1 (n이 홀수일 때) | |
13에 대하여 위의 규칙을 적용해보면 아래처럼 10번의 과정을 통해 1이 됩니다. | |
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 | |
아직 증명은 되지 않았지만, 이런 과정을 거치면 어떤 수로 시작해도 마지막에는 1로 끝나리라 생각됩니다. | |
(역주: 이것은 콜라츠 추측 Collatz Conjecture이라고 하며, 이런 수들을 우박수 hailstone sequence라 부르기도 합니다) | |
그러면, 백만(1,000,000) 이하의 수로 시작했을 때 1까지 도달하는데 가장 긴 과정을 거치는 숫자는 얼마입니까? | |
참고: 계산 과정 도중에는 숫자가 백만을 넘어가도 괜찮습니다.-} | |
import Data.Function (on) | |
hsNext :: Integer -> Integer | |
hsNext 1 = 1 | |
hsNext n | |
|n `mod` 2 == 0 = n `div` 2 | |
|otherwise = 3 * n + 1 | |
hsStep :: Integer -> Integer | |
hsStep 1 = 1 | |
hsStep n = (+) 1 . hsStep . hsNext $ n | |
type Path = (Integer, Integer) | |
getLongerPath :: Path -> Path -> Path | |
getLongerPath x y = let c = (>) `on` snd in | |
if x `c` y then x else y | |
main = print $ fst . foldr1 getLongerPath $ [(x, hsStep x) | x <- [1..1000000]] | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-아래와 같은 2 × 2 격자의 왼쪽 위 모서리에서 출발하여 오른쪽 아래 모서리까지 도달하는 길은 모두 6가지가 있습니다 (거슬러 가지는 않기로 합니다). | |
그러면 20 × 20 격자에는 모두 몇 개의 경로가 있습니까?-} | |
factorial :: Integer -> Integer | |
factorial n | |
|n < 2 = 1 | |
|otherwise = (*) n . factorial $ (n - 1) | |
result = factorial 40 `div` (factorial 20 * factorial 20) | |
main = print result |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{- | |
215 = 32768 의 각 자리수를 더하면 3 + 2 + 7 + 6 + 8 = 26 입니다. | |
21000의 각 자리수를 모두 더하면 얼마입니까? | |
-} | |
main = print $ sum . fmap (\x -> read [x] :: Integer) . show $ 2^1000 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{- | |
1부터 5까지의 숫자를 영어로 쓰면 one, two, three, four, five 이고, | |
각 단어의 길이를 더하면 3 + 3 + 5 + 4 + 4 = 19 이므로 사용된 글자는 모두 19개입니다. | |
1부터 1,000까지 영어로 썼을 때는 모두 몇 개의 글자를 사용해야 할까요? | |
참고: 빈 칸이나 하이픈('-')은 셈에서 제외하며, 단어 사이의 and 는 셈에 넣습니다. | |
예를 들어 342를 영어로 쓰면 three hundred and forty-two 가 되어서 23 글자, | |
115 = one hundred and fifteen 의 경우에는 20 글자가 됩니다. | |
-} | |
w2 = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", | |
"seventy", "eighty", "ninety"] | |
w1 = ["", "one", "two", "three", "four", "five", "six", "seven", "eight", | |
"nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", | |
"sixteen", "seventeen", "eighteen", "nineteen"] | |
toWord :: Int -> String | |
toWord n | |
| n > 1000 = "" | |
| n == 1000 = "onethousand" | |
| n > 99 = let remains = if n `mod` 100 == 0 | |
then "" | |
else "and" ++ (toWord $ n `mod` 100) | |
in (w1 !! div n 100) ++ "hundred" ++ remains | |
| n > 19 = (w2 !! div n 10) ++ toWord (n `mod` 10) | |
| otherwise = w1 !! n | |
main = print $ sum . fmap wCount $ [1..1000] | |
where wCount n = length . toWord $ n | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{- | |
아래와 같은 삼각형의 꼭대기에서 인접한 숫자를 따라 내려가는 경로의 합을 계산해보면, | |
붉은 색으로 표시한 경우가 3 + 7 + 4 + 9 = 23으로 가장 큽니다. | |
3 | |
7 4 | |
2 4 6 | |
8 5 9 3 | |
텍스트 파일 triangle.txt (우클릭해서 다운로드)에는 100줄짜리 삼각형 숫자 데이터가 들어 있습니다. | |
꼭대기에서 바닥에 이르는 경로의 합 중 최대값은 얼마입니까? | |
참고: 이 문제는 18번 문제와 비슷하지만 훨씬 더 어려운 버전입니다. | |
이 문제를 풀려고 모든 경로를 계산하는 것은 가능하지 않은데, 경우의 수가 모두 299 이나 되기 때문입니다. | |
일 초에 1조 (1012)개의 경로를 계산할 수 있다고 해도, | |
모든 경우의 수를 계산하려면 200억년이 걸립니다. | |
이 문제를 해결할 수 있는 효율적인 알고리즘을 찾아보시기 바랍니다. | |
-} | |
import Data.List (foldl1') | |
numbers = [[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,41,26,56,83,40,80,70,33], | |
[41,48,72,33,47,32,37,16,94,29], | |
[53,71,44,65,25,43,91,52,97,51,14], | |
[70,11,33,28,77,73,17,78,39,68,17,57], | |
[91,71,52,38,17,14,91,43,58,50,27,29,48], | |
[63,66,04,68,89,53,67,30,73,16,69,87,40,31], | |
[04,62,98,27,23,09,70,98,73,93,38,53,60,04,23]] :: [[Int]] | |
process :: [Int] -> [Int] -> [Int] | |
process xs ys = let a = zipWith (+) xs ys | |
b = zipWith (+) (tail xs) ys | |
in zipWith max a b | |
main = print $ head . foldl1' process . reverse $ numbers |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
isLeap :: Int -> Bool | |
isLeap y | |
| cd y 400 = True | |
| cd y 100 = False | |
| cd y 4 = True | |
| otherwise = False | |
where cd a b = mod a b == 0 | |
days = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] | |
days' = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] | |
data Date = Date { year::Int, | |
month::Int, | |
day::Int } deriving Show | |
nextDay :: Date -> Date | |
nextDay x = let y = year x | |
m = month x | |
d = day x | |
ds = if isLeap y then head.drop m $ days' else head.drop m $ days | |
d' = if d == ds then 1 else d + 1 | |
m' = if d == ds then | |
if m == 12 then 1 else m + 1 | |
else m | |
y' = if d == 31 && m == 12 then y + 1 else y | |
in Date y' m' d' | |
{- | |
다음은 달력에 관한 몇 가지 일반적인 정보입니다 (필요한 경우 좀 더 연구를 해 보셔도 좋습니다). | |
1900년 1월 1일은 월요일이다. | |
4월, 6월, 9월, 11월은 30일까지 있고, 1월, 3월, 5월, 7월, 8월, 10월, 12월은 31일까지 있다. | |
2월은 28일이지만, 윤년에는 29일까지 있다. | |
윤년은 연도를 4로 나누어 떨어지는 해를 말한다. | |
하지만 400으로 나누어 떨어지지 않는 매 100년째는 윤년이 아니며, | |
400으로 나누어 떨어지면 윤년이다 | |
20세기 (1901년 1월 1일 ~ 2000년 12월 31일) 에서, 매월 1일이 일요일인 경우는 총 몇 번입니까? | |
-} | |
-- 윤년인지 판단하는 함수 | |
isLeap :: Int -> Bool | |
isLeap y | |
| cd y 400 = True | |
| cd y 100 = False | |
| cd y 4 = True | |
| otherwise = False | |
where cd a b = mod a b == 0 | |
-- 평년/윤년일 때의 날 수 | |
days = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] | |
days' = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] | |
-- 날짜를 위한 자료형 | |
data Date = Date { year::Int, | |
month::Int, | |
day::Int } deriving Show | |
-- 다음 날짜를 구한다. | |
nextDay :: Date -> Date | |
nextDay x = let y = year x | |
m = month x | |
d = day x | |
ds = if isLeap y then head.drop m $ days' else head.drop m $ days | |
d' = if d == ds then 1 else d + 1 | |
m' = if d == ds then | |
if m == 12 then 1 else m + 1 | |
else m | |
y' = if d == 31 && m == 12 then y + 1 else y | |
in Date y' m' d' | |
process :: Date -> Int -> Int -> Int | |
process (Date 2000 12 31) _ count = count | |
-- 1901년 이후부터 세어야 한다. | |
process dday date count | |
| year dday > 1900 = if day dday == 1 && date == 0 | |
then process (nextDay dday) (mod (date+1) 7) (count + 1) | |
else process (nextDay dday) (mod (date+1) 7) count | |
| otherwise = process (nextDay dday) (mod (date+1) 7) count | |
main = print $ process (Date 1900 1 1) 1 0 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{- | |
n! 이라는 표기법은 n × (n − 1) × ... × 3 × 2 × 1을 뜻합니다. | |
예를 들자면 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800 이 되는데, | |
여기서 10!의 각 자리수를 더해 보면 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27 입니다. | |
100! 의 자리수를 모두 더하면 얼마입니까? | |
-} | |
factorial x = foldr (*) 1 [1..x] | |
process :: Integer -> Integer | |
process n = let ns = map read . map (:[]) . show $ n :: [Integer] | |
in foldr1 (+) ns | |
main = print $ process . factorial $ 100 |
e018.hs
두 리스트의 각각의 원소를 더하거나 곱한 새로운 리스트를 만들 때는 zipWith
를 이용하면 좋다.
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (+) [1,2,3] [10,20, 30]
-- [11, 22, 33]
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
e014.hs
on
은 두 개의 함수를 받아 합성하는데, 단일 파라미터 함수를 각각 두 개의 파라미터에 각각 적용한 후 이중 파라미터 함수에 넣는다.위치는
Data.Function
에 있다.