Last active
December 25, 2015 21:39
-
-
Save zaneli/7044111 to your computer and use it in GitHub Desktop.
「HaskellでProject Euler(Problem 13~15)」ブログ用
This file contains hidden or 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
main = print $ sumHead 10 | |
sumHead :: (Read a, Num a) => Int -> a | |
sumHead n = read $ take n $ show $ sum nums | |
nums = [ | |
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] |
This file contains hidden or 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
import Data.Ord (comparing) | |
import Data.List (maximumBy) | |
main = print $ maxCollatz 999999 | |
maxCollatz :: Integral a => a -> a | |
maxCollatz n = last $ maximumBy (comparing length) $ map collatz [n,(n-1)..1] | |
-- nからはじまるコラッツ数列(逆順) | |
collatz :: Integral a => a -> [a] | |
collatz n = collatz' n [n] | |
where | |
collatz' 1 ns = ns | |
collatz' n ns = collatz' next $ next:ns | |
where next | even n = n `div` 2 | |
| otherwise = 3 * n + 1 |
This file contains hidden or 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
import Data.Ord (comparing) | |
import Data.List (maximumBy) | |
main = print $ maxCollatz 999999 | |
maxCollatz :: Integral a => a -> a | |
maxCollatz n = last $ maxCollatz' [] n | |
where | |
maxCollatz' m current | |
| current <= 0 = m | |
| processed = maxCollatz' m next | |
| otherwise = maxCollatz' (maximumBy (comparing length) [m, collatz current]) next | |
where | |
-- 2倍した値が n 以下であれば、すでにcurrentを含むコラッツ数列を作成済みであり、 | |
-- currentから始まるコラッツ数列がmより長くは成り得ないため処理を省く | |
processed = current * 2 <= n | |
next = current - 1 | |
-- nから始まるコラッツ数列(逆順) | |
collatz :: Integral a => a -> [a] | |
collatz n = collatz' n [n] | |
where | |
collatz' 1 ns = ns | |
collatz' n ns = collatz' next $ next:ns | |
where next | even n = n `div` 2 | |
| otherwise = 3 * n + 1 |
This file contains hidden or 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
main = print $ maxCollatz 999999 | |
maxCollatz :: Integral a => a -> a | |
maxCollatz n = snd $ foldl process (0, 0) [n, n-1..1] | |
where | |
process m n' | processed = m | |
| otherwise = max m (collatz n', n') | |
where | |
-- 2倍した値が n 以下であれば、すでにn'を含むコラッツ数列を作成済みであり、 | |
-- n'から始まるコラッツ数列がmより長くは成り得ないため処理を省く | |
processed = n' * 2 <= n | |
-- nからはじまるコラッツ数列の長さを返す | |
collatz :: (Integral a, Enum b, Num b) => a -> b | |
collatz n = collatz' n 0 | |
where | |
collatz' 1 l = succ l | |
collatz' n l = collatz' next $ succ l | |
where next | even n = n `div` 2 | |
| otherwise = 3 * n + 1 |
This file contains hidden or 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
import Data.List (groupBy) | |
import Data.Maybe (catMaybes) | |
main = print $ route 20 20 | |
route :: (Num a, Num b, Num c, Ord a, Ord b) => a -> b -> c | |
route row line = route' [(1, (0, 0))] | |
where | |
route' [(n, p)] | p == (row, line) = n | |
route' rs = | |
let rs' = catMaybes $ concat $ map (\(n, (r, l)) -> [(proceed n (r+1) l), (proceed n r (l+1))]) rs | |
in route' $ summarize rs' | |
proceed n r l | (r <= row) && (l <= line) = Just (n, (r, l)) | |
| otherwise = Nothing | |
summarize :: (Num a, Eq b) => [(a, b)] -> [(a, b)] | |
summarize rs = map (foldl1 (\(n1, p) (n2, _) -> (n1+n2, p))) $ groupBy (\(_, p1) (_, p2) -> p1 == p2) rs |
This file contains hidden or 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
main = print $ route 20 20 | |
-- 二項係数を用いて格子経路を算出 | |
route :: Integral a => a -> a -> a | |
route x y = fact (x + y) `div` ((fact x) * (fact y)) | |
fact :: (Eq a, Num a) => a -> a | |
fact 0 = 1 | |
fact n = n * fact (n - 1) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment