From 18821356ad629cdcd68c88ad4e2e664fd3a232a8 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 14 Dec 2020 16:03:38 +0530 Subject: add day14 --- aoc.cabal | 6 + execs/Day14.hs | 68 +++++++ input/14 | 590 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ input/14sample | 4 + 4 files changed, 668 insertions(+) create mode 100644 execs/Day14.hs create mode 100644 input/14 create mode 100644 input/14sample diff --git a/aoc.cabal b/aoc.cabal index 87867f4..ad67f92 100644 --- a/aoc.cabal +++ b/aoc.cabal @@ -99,3 +99,9 @@ executable Day13 build-depends: base, aoc, containers, split default-language: Haskell2010 hs-source-dirs: execs + +executable Day14 + main-is: Day14.hs + build-depends: base, aoc, containers, parsec, strings + default-language: Haskell2010 + hs-source-dirs: execs diff --git a/execs/Day14.hs b/execs/Day14.hs new file mode 100644 index 0000000..d82424a --- /dev/null +++ b/execs/Day14.hs @@ -0,0 +1,68 @@ +module Main where + +import Utils +import Text.ParserCombinators.Parsec +import Text.Parsec.Char +import Data.Either +import Data.Char +import Data.Strings +import Numeric (showIntAtBase, readInt) +import Data.Map (Map) +import qualified Data.Map as Map + +data Stmt = Mask String | Mem Int Int deriving Show + +parseMask :: Parser Stmt +parseMask = string "mask = " >> Mask <$> many anyChar + +parseMem :: Parser Stmt +parseMem = do + one <- string "mem[" >> many1 digit + two <- string "] = " >> many1 digit + return $ Mem (read one) (read two) + +parseLine :: Parser Stmt +parseLine = try parseMask <|> parseMem + +applyMask :: Int -> String -> Int +applyMask v m = fst $ head $ readInt 2 (`elem` "01") digitToInt wm + where bv = strPadLeft '0' 36 $ showIntAtBase 2 intToDigit v "" + wm = zipWith fn bv m + fn o 'X' = o + fn _ '1' = '1' + fn _ '0' = '0' + +runProgram :: [Stmt] -> Int +runProgram ls = sum regs + where (mask, regs) = foldl fn ("", Map.empty) ls + fn (_, regs) (Mask s) = (s, regs) + fn (m, regs) (Mem idx val) = (m, Map.insert idx nval regs) + where nval = applyMask val m + +floatings :: String -> [String] +floatings [] = [[]] +floatings ('X':xs) = floatings xs >>= (\b -> ['0':b, '1':b]) +floatings (x:xs) = map (x:) $ floatings xs + +genIdxs :: Int -> String -> [Int] +genIdxs v m = map (fst . head . readInt 2 (`elem` "01") digitToInt) (floatings wm) + where bv = strPadLeft '0' 36 $ showIntAtBase 2 intToDigit v "" + wm = zipWith fn bv m + fn o '0' = o + fn _ '1' = '1' + fn _ 'X' = 'X' + +v2chip :: [Stmt] -> Int +v2chip ls = sum regs + where (mask, regs) = foldl fn ("", Map.empty) ls + fn (_, regs) (Mask s) = (s, regs) + fn (m, regs) (Mem idx val) = (m, nmap) + where idxs = genIdxs idx m + nmap = flip Map.union regs $ Map.fromList $ zip idxs $ repeat val + + +main :: IO () +main = do + n <- rights . map (parse parseLine "main") . lines <$> readFile "input/14" + print $ runProgram n + print $ v2chip n diff --git a/input/14 b/input/14 new file mode 100644 index 0000000..1b33a0d --- /dev/null +++ b/input/14 @@ -0,0 +1,590 @@ +mask = 10X0110X01100X00111XX00001X011101001 +mem[45673] = 370803 +mem[32234] = 92667525 +mem[47600] = 955 +mem[6610] = 316949 +mask = 0X10X001X00011X1111X111111010100X000 +mem[13551] = 903991 +mem[45894] = 160707 +mem[4188] = 64891428 +mem[43779] = 4687114 +mem[51764] = 53700515 +mask = 01X0X0001X10XX1001001111X0101111010X +mem[34881] = 3311 +mem[23766] = 26540481 +mem[4785] = 13080077 +mem[43617] = 238523796 +mask = 010X100X010000101X100101011X0110X00X +mem[4166] = 16195 +mem[21001] = 622 +mem[13952] = 245 +mem[43083] = 105622 +mem[11083] = 8400 +mem[35492] = 48568 +mask = X100X00XX1100X111111001001000X00X110 +mem[50918] = 9999 +mem[59535] = 70467 +mem[20502] = 87635 +mem[57441] = 113 +mem[21256] = 398644 +mem[43258] = 307 +mask = 1000XX00X1100X0XXX1110010X1001101001 +mem[14095] = 944 +mem[12960] = 7270083 +mem[666] = 4745792 +mem[43494] = 702 +mem[55637] = 86020085 +mem[61142] = 10437888 +mask = 11101XX01110X11011011101XX0100X0100X +mem[57379] = 4533 +mem[48229] = 15994 +mem[22693] = 1881 +mem[44857] = 286865340 +mem[17331] = 8492087 +mem[25889] = 1613193 +mask = 0000100X0110X1111X0X11X00000X10XX1X1 +mem[57477] = 6196148 +mem[6101] = 15304384 +mem[57864] = 200431 +mask = 000X1X0001X0111X1111001000X0101011X0 +mem[44569] = 3960 +mem[39386] = 4949396 +mem[9324] = 96252 +mem[10664] = 3252 +mem[33233] = 50858274 +mem[41081] = 203824750 +mem[6645] = 34497265 +mask = 000011010010111X11111X00010X1100011X +mem[3293] = 233493759 +mem[18956] = 118389 +mem[1025] = 5036522 +mask = 10X0X0X0011001X111111X01X110001X0XX0 +mem[4097] = 107862 +mem[6873] = 2097 +mask = 0100100XX1100X111111X001010111X01100 +mem[61230] = 540498103 +mem[47962] = 2753 +mem[37400] = 2327554 +mem[30629] = 1110830 +mem[53020] = 5591877 +mask = 10100X000101111X111X0X001110X0000101 +mem[54388] = 26326 +mem[419] = 1567 +mem[5373] = 2530 +mem[60258] = 33744 +mask = X1101000X11011X0110X1X0X000X0010X0X1 +mem[54088] = 256796 +mem[38615] = 38356 +mem[40164] = 31653 +mem[21378] = 76110 +mem[33233] = 277981788 +mem[2571] = 133984535 +mem[11562] = 879 +mask = 1X000X00010101011X10110X11111001XX11 +mem[34740] = 8869920 +mem[22740] = 521027 +mem[33792] = 96794 +mem[37005] = 862607 +mem[22723] = 317832765 +mem[26555] = 20923879 +mem[22410] = 54159 +mask = 00X010XX11101111X1111X0X1X000111X001 +mem[26275] = 663 +mem[59230] = 226183705 +mem[41684] = 2128 +mem[54297] = 12877801 +mem[60773] = 376426529 +mem[20303] = 196221024 +mask = 101X1000X1X10101111X11X0X110010100XX +mem[22528] = 16249 +mem[57494] = 279620437 +mem[58026] = 31278 +mem[37016] = 4312 +mem[9883] = 921 +mem[41007] = 1465898 +mem[40481] = 1671783 +mask = 0X0X100001X01X10111X0X01000110101101 +mem[10406] = 997 +mem[38062] = 59582680 +mem[10708] = 198003209 +mem[46873] = 408862 +mem[11077] = 459424361 +mem[5727] = 1700448 +mem[14726] = 2676553 +mask = 10101X10011X000X101X0111X10X1000X0X1 +mem[10664] = 1516 +mem[30273] = 75130511 +mem[35601] = 25120037 +mem[49009] = 1173 +mask = 0X00100001101X1110010100X0001XX001X1 +mem[49285] = 7571 +mem[64534] = 1098 +mem[32768] = 200634491 +mask = 0000100X01100X101101X110X0X011110100 +mem[22416] = 30148149 +mem[60551] = 149806 +mem[2296] = 213850419 +mem[41081] = 39093 +mem[27329] = 216373847 +mask = 0X00100011X0001011000XX1011001011101 +mem[18054] = 9320576 +mem[54549] = 890 +mem[41636] = 251377782 +mem[2838] = 33263103 +mem[17995] = 30197595 +mask = 01X1100X1X10011001XXX0000X0011010010 +mem[49674] = 40088568 +mem[13699] = 9623301 +mem[17255] = 102507 +mem[1482] = 950983 +mem[25007] = 209244 +mem[49349] = 6079 +mask = 00X011X1X0001101XX10010XX01111000001 +mem[5196] = 30458917 +mem[50829] = 8251485 +mask = 010X1000X1100X10XX0X010X000011X10X01 +mem[32774] = 10963415 +mem[41684] = 371254 +mem[5706] = 6352 +mem[57962] = 1978534 +mem[8949] = 573680 +mask = 000010010X11X1X1X11X00X00X00X110110X +mem[60127] = 25613364 +mem[54388] = 5567 +mem[1653] = 1153 +mem[49977] = 2608790 +mem[9352] = 121392208 +mask = 101000X0011001111X11000XX01000000001 +mem[54320] = 11715 +mem[26597] = 1278105 +mem[34204] = 6005345 +mask = 100X000100001111111001X1010X0111100X +mem[17355] = 75752606 +mem[53353] = 41600 +mem[45075] = 4191461 +mask = 000X0X0X0000111111101X000101XXX0110X +mem[27128] = 1953 +mem[17909] = 1884792 +mem[51151] = 161966299 +mem[60933] = 477409 +mem[39509] = 502 +mask = 10X0100001X10001001001X10101010100X0 +mem[26096] = 7205 +mem[39089] = 53634109 +mem[3545] = 339663043 +mask = 01X01X00011X00X01X0011X1001001X10011 +mem[34827] = 1959 +mem[22616] = 29090401 +mem[37561] = 18 +mask = 11XX100X0X10110011011101000100000001 +mem[57541] = 2764656 +mem[39464] = 945 +mem[34491] = 42267 +mem[56023] = 6588 +mem[59338] = 227140650 +mem[8359] = 3521567 +mem[41266] = 2122 +mask = XX00XX00011000101XXX0101XX0001100111 +mem[21001] = 467174080 +mem[40395] = 368280 +mem[21797] = 32584 +mem[51282] = 6472405 +mem[21479] = 38767 +mem[35943] = 1352511 +mask = 0X000001X0X0X11111X0111000111XX00101 +mem[19657] = 22615287 +mem[26805] = 864204812 +mem[42351] = 5662 +mem[2495] = 43866067 +mem[52318] = 1650 +mask = 0000X0X00X1001111101X11X010XX1010101 +mem[54816] = 774 +mem[18176] = 2028911 +mem[24777] = 8250958 +mask = X0001X0X0X1011111111X1000X0011000111 +mem[40738] = 2113 +mem[32774] = 484919091 +mem[39152] = 628235 +mem[54496] = 5964 +mem[40103] = 7433792 +mask = 0101100XX010X110011100000X00X0000X11 +mem[17488] = 3678 +mem[22963] = 519281 +mem[36751] = 85353835 +mem[47241] = 2092837 +mask = 00X0000100101111X11X00X0111XX1XX10X1 +mem[1650] = 922793 +mem[41636] = 6071583 +mem[36791] = 722 +mem[45902] = 372891111 +mask = 0001X1X01110011X010X001110X10001X00X +mem[15382] = 246575660 +mem[10047] = 2031 +mem[33628] = 11165 +mem[59682] = 71030 +mask = XX01100010X001100X11X0X11X00100011X1 +mem[1239] = 750 +mem[7827] = 242729 +mem[2838] = 10048934 +mem[40971] = 531387 +mem[26539] = 9562 +mem[10664] = 1779885 +mask = X0X000X0011101XX1111011100000100X011 +mem[13229] = 118094981 +mem[22915] = 127258 +mem[57384] = 2073 +mem[18067] = 44857 +mem[1653] = 149132182 +mem[17291] = 395470 +mask = 00XX100101100X11X1X00000001010010101 +mem[31462] = 3975909 +mem[49220] = 466696245 +mem[50776] = 887 +mem[48644] = 241048 +mask = 0100X000X100XX111111X010010110011100 +mem[29775] = 441 +mem[52222] = 5446718 +mask = 101010X001XX01111011010101010100010X +mem[16127] = 264083 +mem[27345] = 5194478 +mem[26269] = 167664051 +mem[34669] = 802625 +mask = 0100100001X00X1111110XX00X00X00101X0 +mem[21223] = 48966793 +mem[55118] = 225912 +mem[29898] = 1032 +mem[34679] = 318500 +mem[18584] = 5184511 +mem[53788] = 381219 +mask = 00000001001011XX11100000X100X0101001 +mem[20373] = 668 +mem[16238] = 532704 +mem[19062] = 680735783 +mem[57683] = 382 +mem[64534] = 305874 +mem[29567] = 71891 +mem[55384] = 8257807 +mask = 010010000110011X10XXX1011011X0010011 +mem[8834] = 27346290 +mem[26882] = 5857155 +mem[65399] = 28233 +mem[15313] = 9758 +mem[19856] = 15131 +mem[21792] = 452232 +mask = X0100X000110011111110X0X01XX100111X1 +mem[36885] = 11870 +mem[23633] = 8017694 +mem[49960] = 59066 +mask = 000010010X10011X110X11010X1100011101 +mem[52222] = 7906 +mem[50113] = 20025 +mem[62759] = 60742 +mem[42818] = 24123 +mem[20196] = 2695677 +mem[56150] = 2043641 +mask = 000010X10010011111110000XX1X01101101 +mem[14726] = 163931507 +mem[64534] = 10658257 +mem[36548] = 2016635 +mem[53328] = 1547 +mem[37016] = 29161 +mem[49509] = 204 +mem[54816] = 133927223 +mask = X000X000011X0101111111X00X00X000X011 +mem[63137] = 65851 +mem[3078] = 46729269 +mem[28777] = 44750 +mem[8050] = 2134 +mask = 0010100XX000X1011XX00101011001000110 +mem[42058] = 1405824 +mem[56633] = 3470500 +mem[18390] = 40628 +mask = 0100X00X01100X10100XX100011000X00011 +mem[23954] = 26996858 +mem[42351] = 4571897 +mem[39152] = 5572 +mem[22233] = 1518947 +mem[3293] = 261 +mask = 10X010X00111011X1110111011X000X10001 +mem[10419] = 119957 +mem[64222] = 1935417 +mem[39073] = 7184 +mask = 00001000111001101001XX10XX00X00X011X +mem[18840] = 6949 +mem[54130] = 31279452 +mem[56463] = 2468673 +mem[12291] = 94799059 +mem[31014] = 130 +mask = 0100100X11X000X011010X0X0X00110011X1 +mem[55653] = 780405166 +mem[17373] = 289755 +mem[55275] = 129895 +mask = X0001XX001110111101001X10100X0010010 +mem[61610] = 176605034 +mem[26181] = 1694 +mem[40235] = 249848880 +mem[65399] = 58927 +mem[4769] = 197080137 +mem[2885] = 88722 +mask = 010110X011X001X10100010X110111010011 +mem[19697] = 49908 +mem[49644] = 27297 +mem[46331] = 68362 +mem[23374] = 4476652 +mem[38046] = 152384 +mask = 01001000X1X000X01X100X00XX00010010X0 +mem[57824] = 238363421 +mem[13229] = 141760722 +mem[12259] = 67177 +mem[24101] = 3496418 +mem[38370] = 125455 +mem[49997] = 1619802 +mask = X0XX1001X0X111110111110X10100X0110X0 +mem[57151] = 27210 +mem[51757] = 94709766 +mem[27009] = 184467 +mem[65310] = 623337 +mem[8310] = 6432 +mem[42814] = 312612328 +mask = 000X11X0X1100110X10X00X1X0X100001X01 +mem[51449] = 233840 +mem[33113] = 336176 +mem[24215] = 583439 +mem[32484] = 33697151 +mem[41246] = 35091190 +mem[45335] = 22504209 +mask = 00001X01XX00110111101000X11001000X00 +mem[49728] = 385 +mem[20071] = 19552156 +mem[36751] = 1381732 +mem[63977] = 140878 +mem[40754] = 8924389 +mem[31910] = 4771465 +mask = 0X101XX0111011101101101100XXX1X11111 +mem[4561] = 86501812 +mem[45894] = 15097769 +mem[52368] = 10598 +mem[57151] = 17927388 +mem[39781] = 121000932 +mask = 1X00X000XX10010111111101X00001X0000X +mem[40963] = 13692 +mem[44259] = 12653 +mask = 00X010000XX011111100100X001100010001 +mem[26454] = 7079 +mem[23082] = 1849 +mem[16238] = 112603 +mem[35527] = 3215051 +mask = 01X0100XX110XX10110X1X0100001100X0X1 +mem[22233] = 14653 +mem[65020] = 210017 +mem[52710] = 3469 +mem[4243] = 4204979 +mask = 00001100001X11110111001000X00000X10X +mem[54906] = 160425 +mem[2296] = 107308 +mem[25636] = 325676 +mem[1157] = 17126 +mem[18174] = 26645399 +mem[341] = 134 +mask = 00001X0X0X1X1111X111000001000XX01100 +mem[49509] = 1792437 +mem[9352] = 16691097 +mask = 01011000X110011010010XX00XX0X10X0000 +mem[47744] = 66265 +mem[17758] = 2364 +mem[58881] = 184736586 +mem[45874] = 3288 +mem[33128] = 1060635188 +mem[32851] = 8162 +mem[4758] = 8270611 +mask = 101010X0X1110X011010010111010X0100X1 +mem[65020] = 3436 +mem[7304] = 351967 +mem[20204] = 7690 +mem[52050] = 6767 +mem[42627] = 18681018 +mem[2302] = 309 +mask = 0X00X00111101111XX11111X100X011X0100 +mem[31161] = 4045 +mem[44948] = 998036 +mem[6417] = 1038591 +mem[19456] = 331767 +mem[13551] = 351590897 +mem[57397] = 2335810 +mem[27468] = 30148246 +mask = X0X010000111010111X10X011X0100110100 +mem[26334] = 2474013 +mem[17909] = 9019 +mem[7685] = 31 +mem[31203] = 88097 +mask = 0101100XX1XX011X01XX1100000X0011X101 +mem[33782] = 10039109 +mem[36350] = 13839 +mem[17355] = 5492 +mask = X000X00X110011111111X001110X001000X1 +mem[65020] = 81625042 +mem[34391] = 24765 +mem[22616] = 6081 +mem[40777] = 5659 +mask = 10X01000011101X11X1XX101010X00X1X0X1 +mem[57202] = 334564 +mem[64222] = 2096644 +mem[24034] = 23828772 +mem[22410] = 146958 +mem[10664] = 57410819 +mem[40103] = 335 +mem[40501] = 115314 +mask = 0X000001001011X1111111011010000010XX +mem[20666] = 6659411 +mem[44873] = 41558959 +mem[33233] = 1051981 +mem[51278] = 6138 +mem[36171] = 1332906 +mem[6568] = 230 +mem[40776] = 4041579 +mask = 10101000110101011111100X10000X00XX10 +mem[11862] = 14638 +mem[18132] = 998819 +mem[11967] = 360999 +mem[6417] = 655336840 +mask = X0X10X010X001111X11010000001000101X0 +mem[21289] = 3642 +mem[45673] = 19810371 +mem[1416] = 92975839 +mask = XX00100001100X111X110010000010001011 +mem[51270] = 25149 +mem[42395] = 132570 +mem[1016] = 1001728 +mem[41825] = 2500361 +mem[17518] = 608172 +mem[41081] = 59823249 +mem[42445] = 47 +mask = 010X10001110001000000100X0X0110X00X0 +mem[53475] = 11095 +mem[33113] = 267232 +mem[29075] = 982 +mask = 1010XX00XXX1X111111X00011100X00100X1 +mem[22184] = 3304995 +mem[52883] = 286206091 +mem[17684] = 3033221 +mem[10660] = 834092 +mem[639] = 66342 +mem[10379] = 615664 +mem[47839] = 1155259 +mask = 00001X010110111110011X000X00100001XX +mem[53353] = 219728 +mem[65333] = 4002063 +mem[3492] = 891 +mem[6417] = 6050475 +mem[10047] = 53027987 +mem[57541] = 37059 +mem[29203] = 79275 +mask = 1X00X0X0011XX10X1110X0001010001X0X00 +mem[56853] = 3481 +mem[48818] = 70504232 +mask = 000XX1X01110X1100100011110X010X0X010 +mem[8087] = 894158 +mem[12413] = 146584 +mem[6706] = 2582 +mem[8095] = 30280 +mem[30578] = 163689 +mask = 0000X0X0011X00101010X10XX00001101XX1 +mem[16238] = 883 +mem[60302] = 1463 +mem[52026] = 501033 +mem[21101] = 963003 +mem[49342] = 37665 +mask = 1000010X01X00XX010X01100110001100111 +mem[21667] = 384155 +mem[54343] = 6134066 +mem[17373] = 80965 +mem[34043] = 15468883 +mem[855] = 750 +mem[3492] = 4885002 +mask = 1000X00001X10X01X0100X0111011101X001 +mem[38410] = 38053819 +mem[64257] = 7130584 +mem[23001] = 90831 +mem[29203] = 31460429 +mask = 00X000X100101111X11XXX000110X10X0011 +mem[53226] = 3680 +mem[43919] = 7913 +mem[23001] = 113363252 +mem[24130] = 594 +mask = X000X001XXX01111111X1101010X01X00001 +mem[56633] = 195050663 +mem[45339] = 58339099 +mem[34669] = 28208072 +mem[33167] = 107343266 +mem[55625] = 20752 +mem[56130] = 27956180 +mask = 000011X00X0XX110111X001X10111010X00X +mem[10675] = 342846 +mem[1723] = 1470723 +mem[51218] = 14886517 +mem[25654] = 468441 +mem[22233] = 750318 +mem[10638] = 1940647 +mem[49663] = 3527 +mask = 00X0XX01X00011X1111011X0011X01X001X0 +mem[21769] = 95158 +mem[18925] = 465784126 +mem[57920] = 873 +mem[29516] = 1870546 +mem[56132] = 145637 +mem[39089] = 16016081 +mem[40777] = 111866962 +mask = 0101100X111001X00100X10101001101001X +mem[46653] = 282150006 +mem[21001] = 26649672 +mask = 0000100X0X10X1X1111110X0X00X0000X1X1 +mem[57539] = 10584 +mem[54889] = 7790 +mem[50184] = 357116445 +mem[8050] = 8577 +mask = 11000000011XX01011011101100000XX0111 +mem[22120] = 2547919 +mem[64904] = 493040 +mem[17509] = 411541 +mem[6417] = 7691463 +mem[33118] = 840 +mask = 010010X001X00X111111011100X000X1X11X +mem[65020] = 222328295 +mem[30448] = 4080 +mem[52883] = 592 +mem[13763] = 1508 +mask = 010110X00110011X100001X0001001110X00 +mem[44389] = 839 +mem[25975] = 395854 +mem[20373] = 16016219 +mem[23886] = 68934677 +mem[41201] = 518 +mem[17454] = 738127 +mem[56227] = 806 +mask = 00001X00X1100X101X010X11X0000X000111 +mem[9822] = 2044 +mem[24640] = 24948181 +mem[24791] = 7537 +mem[39152] = 2411 +mem[18584] = 348 +mem[45337] = 98555334 +mem[53797] = 31216158 +mask = 0X0010000110011X11X101100XXXX1X001X1 +mem[36788] = 26899502 +mem[57344] = 9033077 +mem[2296] = 313866362 +mem[57429] = 96331601 +mem[6101] = 34417 +mask = 0000X000011001101XX110110X1X011X0111 +mem[50776] = 68004929 +mem[43617] = 775267546 +mem[60477] = 1699097 +mem[53328] = 155946 +mem[58881] = 5866890 +mem[19724] = 24153 +mask = 10000XX0010100011010011101X1010X1010 +mem[1157] = 392051 +mem[32234] = 43930 +mem[3987] = 213349 +mem[17692] = 467627 +mem[42272] = 5070 diff --git a/input/14sample b/input/14sample new file mode 100644 index 0000000..2e961e3 --- /dev/null +++ b/input/14sample @@ -0,0 +1,4 @@ +mask = 000000000000000000000000000000X1001X +mem[42] = 100 +mask = 00000000000000000000000000000000X0XX +mem[26] = 1 -- cgit v1.2.3