From 643296c38200bbaf0cd9ee9a232ac0098bafb7a7 Mon Sep 17 00:00:00 2001 From: Thorn Avery Date: Wed, 9 Dec 2020 18:43:33 +1300 Subject: [PATCH] day9 --- day9.hs | 40 +++ day9.txt | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1040 insertions(+) create mode 100644 day9.hs create mode 100644 day9.txt diff --git a/day9.hs b/day9.hs new file mode 100644 index 0000000..347b84f --- /dev/null +++ b/day9.hs @@ -0,0 +1,40 @@ +main :: IO () +main = do + raw <- readFile "day9.txt" + let nums = (map read $ lines raw) :: [Int] + ansA = solveA nums + ansB = solveB ansA nums + in do + putStrLn $ "day9a: " ++ (show ansA) + putStrLn $ "day9b: " ++ (show ansB) + +solveA :: [Int] -> Int +solveA nums = runWindow' (take 25 nums) (drop 25 nums) + +solveB :: Int -> [Int] -> Int +solveB t nums = (maximum ans) + (minimum ans) + where + ans = testRuns t nums + +runWindow' :: [Int] -> [Int] -> Int +runWindow' _ [] = error "reached end of stream" +runWindow' win (n:ns) = + if n `elem` ws + then runWindow' ((tail win) ++ [n]) ns + else n + where + ws = [ x+y | x <- ls, y <- ls, x /= y ] + ls = filter (<= (n - (minimum win))) win + +findRun :: Int -> [Int] -> Int -> [Int] -> Maybe [Int] +findRun _ _ _ [] = Nothing +findRun t a r (l:ls) + | r + l == t = Just (l:a) + | r + l > t = Nothing + | otherwise = findRun t (l:a) (r + l) ls + +testRuns :: Int -> [Int] -> [Int] +testRuns _ [] = error "no answer" +testRuns t ls = case (findRun t [] 0 ls) of + Nothing -> testRuns t (tail ls) + Just x -> x diff --git a/day9.txt b/day9.txt new file mode 100644 index 0000000..24b0baf --- /dev/null +++ b/day9.txt @@ -0,0 +1,1000 @@ +34 +15 +45 +16 +30 +43 +36 +21 +32 +18 +14 +31 +47 +41 +22 +39 +9 +38 +6 +7 +42 +46 +4 +3 +8 +10 +51 +24 +45 +17 +19 +28 +11 +12 +23 +80 +13 +15 +14 +63 +16 +20 +9 +32 +18 +7 +79 +26 +30 +21 +25 +22 +31 +24 +27 +29 +46 +35 +44 +39 +23 +28 +53 +33 +60 +34 +73 +55 +36 +95 +107 +43 +45 +48 +47 +77 +92 +61 +50 +74 +93 +67 +51 +66 +56 +57 +62 +69 +200 +70 +79 +87 +81 +83 +114 +94 +98 +95 +97 +148 +101 +106 +118 +107 +123 +113 +108 +139 +119 +195 +126 +131 +162 +176 +160 +343 +164 +175 +177 +203 +189 +296 +337 +272 +232 +246 +213 +241 +236 +227 +234 +373 +303 +351 +295 +257 +291 +352 +554 +363 +339 +536 +366 +624 +392 +402 +440 +449 +445 +459 +470 +468 +530 +686 +566 +491 +649 +831 +797 +548 +657 +768 +691 +731 +889 +1234 +758 +1276 +794 +1459 +1016 +885 +1704 +904 +927 +938 +959 +1215 +1727 +2418 +3186 +1239 +1205 +1279 +1306 +1643 +1616 +1422 +1552 +1647 +3038 +1662 +1698 +2238 +2543 +1789 +1812 +1842 +1865 +2143 +2606 +4241 +3263 +2901 +5792 +3563 +4563 +4268 +3069 +6464 +2974 +3084 +3120 +3199 +3309 +5041 +3360 +3487 +6571 +3601 +4962 +3654 +4743 +4008 +4749 +5507 +5985 +10355 +5875 +6043 +6628 +6393 +6058 +6094 +8109 +6173 +6204 +8751 +14152 +6669 +9472 +7088 +12117 +12595 +11136 +7662 +8397 +18901 +14845 +10256 +12079 +11860 +13062 +11918 +14790 +12152 +20257 +12262 +24262 +32659 +12842 +12873 +13757 +14331 +23098 +14750 +26668 +16059 +17918 +18798 +18653 +23778 +22116 +22335 +22174 +44035 +24012 +25104 +24070 +25715 +24414 +47220 +25135 +28088 +41194 +26599 +27204 +32984 +29081 +30809 +32668 +33977 +64786 +43053 +37451 +40769 +49549 +46749 +44509 +51013 +58383 +53093 +49785 +67793 +53223 +51618 +55944 +62586 +62065 +56285 +74746 +83902 +66532 +59890 +73862 +66645 +78220 +81960 +80504 +120969 +125028 +91258 +94294 +95522 +150238 +202929 +103008 +101403 +118350 +104841 +107562 +112229 +118871 +157764 +161293 +126422 +138110 +126535 +203084 +140507 +174207 +171762 +162464 +174798 +279643 +213632 +185552 +189816 +196925 +204411 +206244 +221879 +208965 +248069 +245348 +219791 +238764 +245293 +252957 +264532 +264645 +419876 +368687 +315305 +302971 +357314 +334226 +337262 +360350 +389963 +486524 +547130 +605643 +401336 +484057 +484323 +491721 +780226 +590219 +458555 +517602 +498250 +567616 +517489 +529177 +888213 +637197 +618276 +640233 +660285 +859891 +671488 +821585 +1227416 +791299 +1135447 +948466 +987732 +885393 +956805 +1096793 +950276 +1098788 +1450110 +976044 +1015739 +1027427 +1157722 +1046666 +1200665 +1255473 +1503669 +1687227 +1300518 +2003471 +1651190 +1462787 +1612884 +1964205 +1676692 +1905271 +1833859 +2704119 +1835669 +1991783 +1926320 +3799874 +2022710 +5633733 +2043166 +2062405 +2074093 +2302139 +2247331 +2501183 +3856569 +2763305 +2913402 +3075671 +3113977 +3139479 +5136687 +3448553 +3510551 +4014493 +3897054 +3669528 +3761989 +3827452 +3918103 +7566582 +5930662 +4803322 +6419286 +4806471 +7118081 +6027379 +5916859 +11132574 +6562530 +17695104 +6211858 +7090164 +6189648 +6253456 +8647238 +10080908 +7180079 +7911547 +7431517 +9678848 +21213482 +7680092 +8724574 +8721425 +9609793 +11983401 +10720181 +13643375 +10723330 +27776012 +16327330 +12106507 +12401506 +12443104 +12465314 +27403130 +21662249 +13369727 +40772857 +16404666 +15901504 +14611596 +17289885 +22829837 +16401517 +17445999 +22094301 +20827932 +33229438 +22826688 +22703582 +30933260 +25749882 +23124836 +24508013 +24549611 +24571821 +30815726 +24908418 +27076910 +33191389 +31016262 +27981323 +30513100 +66420827 +39231354 +45954673 +33691402 +39526353 +40149581 +38273931 +44920989 +43531514 +45530270 +48874718 +45828418 +50201746 +47632849 +49057624 +49079834 +49121432 +90875662 +77038947 +55058233 +72902312 +58494423 +58997585 +61672725 +64204502 +84761624 +71965333 +73217755 +134575037 +110752559 +119598182 +83194920 +88452503 +89061784 +94587894 +93461267 +94908252 +96754281 +96690473 +157979379 +108077419 +104179665 +113552656 +120670310 +114055818 +199814343 +130459756 +123202087 +193241449 +185816065 +166679022 +145183088 +172256704 +181913770 +171647423 +176656187 +179949201 +177514287 +193444754 +188049161 +243872397 +225368008 +219956368 +200870138 +231279506 +212257084 +217732321 +227608474 +316443536 +324072225 +309018152 +253661843 +268385175 +343335209 +311862110 +399865178 +408005529 +343904127 +351596624 +356605388 +367998362 +357463488 +365563448 +381493915 +413127222 +625737850 +625384306 +418602459 +454531981 +439865558 +429989405 +445340795 +375054920 +562679995 +522047018 +565523953 +580247285 +884521386 +784165907 +655766237 +695500751 +700509515 +709467575 +722168836 +714068876 +998849744 +723026936 +740618368 +794621137 +831729681 +793657379 +1162892494 +1554756617 +952036423 +1229506702 +805044325 +1239961932 +1647537174 +1084727013 +1102294303 +1411976966 +1236013522 +1377935073 +1351266988 +1418527687 +1423536451 +1962130768 +1431636411 +1952533638 +1437095812 +1463645304 +2702749136 +1534275747 +1588278516 +1598701704 +1745693802 +1757080748 +1889771338 +2838663636 +2320740535 +1907338628 +2855623499 +3374107734 +2782903399 +2338307825 +2774803439 +2587280510 +3340065841 +3209339106 +3344434440 +3177330213 +2868732223 +4448442938 +2900741116 +3035797516 +2997921051 +4746002264 +4121556257 +3186980220 +3355782452 +3502774550 +4612704247 +3797109966 +4659048360 +4228079163 +4245646453 +5193931324 +4925588335 +5515638038 +7635423158 +5362083949 +5774260730 +9312748004 +5898662167 +5866653274 +5769473339 +5936538632 +6256523568 +7648501763 +6033718567 +6184901271 +7932982484 +6858557002 +6542762672 +12858570819 +7748421003 +10655666968 +11092593491 +14189506052 +8473725616 +9171234788 +10119519659 +11414300205 +11260746116 +11131557288 +12441424839 +13831644651 +11636126613 +11668135506 +11706011971 +11803191906 +17197284748 +12218619838 +14507444183 +12576481239 +12727663943 +13401319674 +14291183675 +15016488288 +26765987291 +25321063340 +17644960404 +21201389559 +19290754447 +20839370294 +20302792076 +21251076947 +23988410059 +22966758087 +22767683901 +23304262119 +24395799449 +36935714851 +27083925422 +27018847618 +24021811744 +31867235686 +26128983617 +25304145182 +25977800913 +27692503349 +46817171207 +46968353911 +35855858582 +38896037351 +48220237177 +45268555360 +39593546523 +40130124741 +44217835034 +44018760848 +44555339066 +67723094268 +46988569831 +46071946020 +47326073863 +48417611193 +49325956926 +51281946095 +50150795361 +49999612657 +51433128799 +53821486966 +53670304262 +100658874093 +88895650008 +81927804602 +74751895933 +93951611707 +85884607182 +84347959775 +84148885589 +79723671264 +88773174100 +100810056797 +94018373505 +147688677767 +152092002892 +124902691294 +172228765157 +144102407068 +101432741456 +99325569583 +101281558752 +100150408018 +131927417259 +105103433061 +222440573700 +137819189851 +154475567197 +159099855708 +178100497296 +158900781522 +181005230016 +260381414460 +163872556853 +168496845364 +341973054149 +291791084835 +242922622912 +193343943088 +199475977601 +200607128335 +337001278818 +321766143283 +200758311039 +201431966770 +204429002644 +205253841079 +232077825277 +491476846015 +259579000258 +515101776114 +460988542795 +313376348719 +318000637230 +322773338375 +809477483245 +332369402217 +523531649414 +364630867892 +361840788452 +398597784167 +392819920689 +517805351363 +518758948269 +402039095105 +720190915039 +406685807849 +636149687094 +405187313683 +405860969414 +437331666356 +607292936184 +491656825535 +1015188474949 +572955348977 +822829331247 +965775269666 +645745750936 +729459146224 +655142740592 +1237996266402 +694210190669 +1159681336508 +835929450523 +754660709141 +1272466060504 +794859015794 +956090614625 +1361951584039 +807226408788 +811048283097 +898342633384 +1012480249867 +842518980039 +1137402576471 +928988491891 +1064612174512 +1389999458919 +1218701099913 +1228098089569 +1300888491528 +1650300805294 +1339955941605 +1349352931261 +1409803449733 +1489069206463 +1448870899810 +1995610787031 +1823528532964 +1549519724935 +1705569042172 +2169177992827 +1618274691885 +1771507471930 +1649745388827 +1653567263136 +1740861613423 +1993600666403 +1907131154551 +2157086581460 +3090214544684 +2682886866397 +2528986581097 +2446799189482 +2568054031174 +2958230633490 +2689308872866 +4076309147378 +3396200361014 +4795783586856 +4117573756109 +4391582564138 +3167794416820 +3199265113762 +3203086988071 +5137061974437 +3425074735066 +4852832376898 +3303312651963 +3390607002250 +3394428876559 +3900731820954 +4522587247500 +5696780997917 +4603885770942 +6697741528522 +4975785770579 +5014853220656 +5136108062348 +7803150884704 +6079915875116 +5857103289686 +8318165872619 +6367059530582 +7721852361262 +6370881404891 +6402352101833 +6471107068783 +6785035878809 +6506399640034 +6693919654213 +7291338823204 +10598473349476 +11607215131131 +7295160697513 +7917016124059 +8423319068454 +14092733766153 +11346667175470 +14284075654641 +9990638991235 +10111893832927 +10150961283004 +17793789875939 +16618293472961 +11937019164802 +16478953363509 +12737940935473 +13155917283700 +14388123192842 +19209048004256 +13096271756046 +12977506708817 +24487709530152 +14610935778272 +15117238722667 +14586499520717 +24324173884287 +22412399420180 +15212176821572 +16340335192513 +18413958059689 +24577138511952 +23089400541744 +22087980447806 +20102532824162 +22849834768400 +22888902218477 +24674960100275 +27564006229534 +24914525873619 +25715447644290 +25834212691519 +26073778464863 +28094745431484 +38301577363316 +27588442487089 +28189683530389 +36442868016675 +29197435298989 +42776183051106 +29798676342289 +37624576241752 +45817980468452 +33626134881261 +34754293252202 +47611393358678 +42190513271968 +48565282412690 +42952367592562 +53422655178608 +45738736986877 +52687578560766 +49589485973894 +50988304338482 +51789226109153 +51549660335809 +88008493740420 +79083049769966 +72574859393395 +55778126017478 +56785877786078 +106110233739374