diff --git a/input/14.txt b/input/14.txt new file mode 100644 index 0000000..60dc98a --- /dev/null +++ b/input/14.txt @@ -0,0 +1,554 @@ +mask = 1110X1110XXX101X0011010X110X10X0110X +mem[40257] = 51331021 +mem[18433] = 464024066 +mem[9993] = 463909 +mask = 11X011010X110X101X011X1X010X10100001 +mem[54152] = 692939 +mem[31079] = 22525259 +mem[33597] = 474240 +mem[3881] = 919507 +mem[24651] = 48975360 +mem[14815] = 1554 +mem[17731] = 1337580 +mask = X0X0111111000000100101100X000X10X001 +mem[56856] = 474071 +mem[3724] = 29660 +mem[18229] = 189 +mem[34570] = 419796001 +mem[11355] = 65374715 +mem[37999] = 522634 +mask = 1111X0111XX00000111X1010X1101XX01110 +mem[3262] = 99770791 +mem[4906] = 11370 +mem[12532] = 1083912 +mask = 10110101101X1X00X1111010001001010X10 +mem[46252] = 84993342 +mem[5286] = 1013690 +mask = 11X001110111101X001101XX100110001010 +mem[55055] = 516 +mem[38350] = 615 +mem[51960] = 2038 +mem[61990] = 957107 +mem[24357] = 8172 +mask = 1XXX1111X101001X011X000X110110001X01 +mem[57990] = 3734 +mem[50349] = 101222011 +mem[45511] = 42986512 +mem[40272] = 403 +mem[54329] = 1626458 +mem[26816] = 448210757 +mask = 11101111011000X01X1XX100X0XXX010X001 +mem[51488] = 333041 +mem[30893] = 3258 +mem[31999] = 14972408 +mem[48851] = 74906 +mem[22619] = 3442368 +mask = 0X000X11X10XXX101011010X001111111011 +mem[6850] = 1224301 +mem[48485] = 34534000 +mem[24614] = 1055775 +mask = 0100X11101X100X0X11100XX110011101100 +mem[18755] = 100409700 +mem[31397] = 114132362 +mask = 1110111111000X011XX1X10011X001011001 +mem[25234] = 575 +mem[54990] = 110437 +mem[5738] = 872 +mem[37430] = 206977297 +mem[40257] = 767384 +mem[478] = 5752 +mask = 111001110111101X001101X1100110X010X1 +mem[21231] = 2835725 +mem[14092] = 1259011 +mem[23506] = 3099 +mask = 1110001X1111001X1101101XXX100X0010XX +mem[37900] = 79419475 +mem[37628] = 125826 +mem[11380] = 624 +mem[36032] = 284016390 +mem[47266] = 767 +mask = XX10X1101101XXX0111110011100X111110X +mem[48427] = 18603 +mem[19559] = 124107997 +mem[49782] = 29154 +mem[3724] = 136805 +mem[49580] = 148450462 +mem[54342] = 180288875 +mask = 110011110101X01001X10XX11X1XX111X011 +mem[49856] = 445359 +mem[7226] = 4303932 +mem[62181] = 12485531 +mem[45386] = 1037 +mask = X1X01111X1010010XX11X1000100XX1000X1 +mem[32337] = 31771 +mem[55567] = 1438485 +mem[49504] = 452407 +mem[15890] = 64458173 +mem[9930] = 43490551 +mask = 101X1111111X00101X110X100100XX111101 +mem[11172] = 30476781 +mem[16705] = 10356 +mem[9799] = 3517752 +mem[35121] = 991958953 +mem[12861] = 13640943 +mem[15424] = 98158 +mask = X110011X010XX01100X100010X1XX0001101 +mem[31621] = 456005334 +mem[57990] = 5145 +mem[7067] = 127283 +mem[57106] = 322139 +mem[49968] = 2140844 +mask = 1X1001X1X01X10110XX101XX010X00000100 +mem[42602] = 128159 +mem[26816] = 7253653 +mem[26531] = 42978 +mem[7592] = 249896576 +mem[7956] = 1315 +mask = 111011X1X11100X011X1010101XXX0XX0010 +mem[52446] = 1677086 +mem[44919] = 1499581 +mem[34842] = 5043767 +mem[24471] = 579304892 +mem[4380] = 1934 +mem[44081] = 2818 +mask = X1101X0X110X00X111X001001100111X0010 +mem[44457] = 10924 +mem[61114] = 41913513 +mem[25625] = 1074 +mem[53821] = 4293765 +mem[21864] = 895125 +mem[18764] = 24202 +mask = X111011X0110XX0X1011110111000011000X +mem[28782] = 3396 +mem[51935] = 250016 +mem[29096] = 1633 +mask = 100011111X0X000X1011101X00001100X011 +mem[50213] = 21062 +mem[17583] = 17889 +mem[6214] = 755665 +mem[41630] = 554432 +mem[36640] = 21683065 +mem[9993] = 663 +mask = 10X0111111X00010X0X1000X0000101X1000 +mem[31206] = 1563 +mem[31999] = 893563867 +mem[25234] = 16239 +mem[16826] = 1185 +mem[6325] = 308015 +mask = 111000X11101001X11X1010000101XXX0010 +mem[714] = 174841 +mem[47336] = 1080 +mem[48590] = 5902057 +mask = 111011110X1100001101101111X10101X1X1 +mem[11741] = 285199 +mem[32864] = 794118 +mem[50294] = 3086 +mem[21244] = 13500488 +mem[52937] = 668328 +mem[25942] = 14773413 +mask = X11001111X10000011X101X0111010000X01 +mem[55993] = 227666987 +mem[54990] = 29299 +mem[10848] = 14517154 +mem[26412] = 920115307 +mask = 1X0X11111100001XX00100X01X0010111101 +mem[14992] = 62272953 +mem[48256] = 5676 +mem[19361] = 168138195 +mem[144] = 986 +mem[36032] = 911 +mask = 1X10001111110X1X110X10X1X01X1010X001 +mem[9960] = 4200 +mem[8832] = 1841117 +mask = 111X111101X00X101X11010000111111X001 +mem[32864] = 15880 +mem[9966] = 7278514 +mem[46710] = 1818748 +mem[1863] = 13021558 +mask = 1110001111X1001011X11001101000XX0XXX +mem[63705] = 3162416 +mem[45211] = 686629227 +mem[26397] = 17094 +mem[9999] = 783527 +mem[25355] = 2865745 +mem[37999] = 982 +mask = XXX01111110000XX10X10100010XX1X01001 +mem[36032] = 1405160 +mem[25234] = 10488275 +mem[56856] = 9235 +mem[62886] = 10583974 +mask = 01000111X10X00X11011X0X11010111XX00X +mem[9960] = 108631252 +mem[20641] = 236021 +mem[54181] = 898590 +mem[47206] = 357135433 +mask = 0X00X11111010010111X0000011001110X01 +mem[34160] = 168879 +mem[31424] = 28869180 +mem[24916] = 10670389 +mem[738] = 352 +mem[47762] = 8844766 +mask = 111011X10110X010X011X00000001100XXXX +mem[22643] = 52619618 +mem[26725] = 18104217 +mem[51488] = 348349 +mask = 1X1011110XXX00101111100000110000X10X +mem[56604] = 38442 +mem[64943] = 178378 +mem[14699] = 13770627 +mask = 11X01111001010X01011100000010X10X010 +mem[17095] = 9031632 +mem[21925] = 157279 +mem[16803] = 28186944 +mask = 010XX11XX1X0001X10X11101X00111011X01 +mem[18863] = 1188008 +mem[5968] = 795 +mem[43052] = 2990150 +mem[38515] = 747 +mem[44368] = 496 +mem[45434] = 2077409 +mask = 0X10111X111100111X1X000XXX00X01X1010 +mem[13059] = 23890054 +mem[51572] = 29407 +mem[39964] = 4094674 +mem[59053] = 5346433 +mask = 1110011111X100X011011X11111110X11100 +mem[1791] = 12339300 +mem[51641] = 105572 +mem[22529] = 1649 +mem[29570] = 930208 +mask = 11101111X1XX00101X111000XX000X10X0X1 +mem[19744] = 1667 +mem[18167] = 556 +mem[52216] = 39333 +mem[8118] = 28457779 +mem[14409] = 7493808 +mem[32337] = 34018 +mask = 0110X1111X010X10001X1110011X0010001X +mem[40] = 27424 +mem[6244] = 41469 +mem[6612] = 214 +mem[36981] = 34852720 +mem[35860] = 74811624 +mem[44120] = 82357013 +mem[5999] = 395 +mask = X1X0111111000001XX11X1000XX001000010 +mem[12392] = 8235335 +mem[52538] = 236135318 +mem[7227] = 6809 +mask = 111011X10110X010111100001X00X00000X1 +mem[13662] = 270146 +mem[49569] = 11401458 +mem[49782] = 12256 +mask = X11X11110X10X000101111XXXX0100100001 +mem[63774] = 25139 +mem[47309] = 107486126 +mem[39140] = 884 +mem[35267] = 2032 +mem[16513] = 3724990 +mem[47901] = 120378235 +mem[47121] = 574 +mask = 1100X1X100110110XX010111110111101111 +mem[21716] = 53071834 +mem[9997] = 343 +mem[34175] = 109609 +mem[22643] = 59660540 +mask = 011X1X10111X001111X100X1011010100001 +mem[2872] = 4637 +mem[7429] = 13346151 +mem[21514] = 521995 +mask = 0111X1X1X11010001011X10011000X11110X +mem[34817] = 34195656 +mem[59139] = 1538904 +mem[33597] = 7322219 +mem[43471] = 2053 +mem[31759] = 352 +mem[24649] = 393907 +mask = 0010X1111X10001010X100001X010011111X +mem[53821] = 389983024 +mem[30685] = 681448 +mem[14409] = 8810596 +mem[58403] = 202202 +mem[59589] = 11132409 +mem[36376] = 1035668 +mem[10107] = 282 +mask = 1X00110101X1001010011010X0100000X001 +mem[35009] = 1137976 +mem[30376] = 893048407 +mem[44428] = 1634 +mask = X01X11111111001X111X10X111X00X1111X0 +mem[3088] = 1335 +mem[57928] = 2122936 +mem[14992] = 1850 +mem[50886] = 596 +mem[20951] = 1834738 +mask = X11111X1X0X000001X11XX1010X10X000001 +mem[46309] = 1344734 +mem[57393] = 7607663 +mem[64140] = 412481329 +mem[31937] = 4156010 +mask = 01000XX11100XX1110X10X00X011X11010X0 +mem[21092] = 188978 +mem[58601] = 747 +mask = 11101XX11100X001100001000X0000X11X10 +mem[49580] = 681666 +mem[28396] = 6693 +mem[21446] = 2871 +mem[8409] = 129741145 +mem[26851] = 64088468 +mask = 1X101111X111X001101010X001000000XX11 +mem[50617] = 2893221 +mem[44352] = 351080 +mem[6973] = 74704635 +mem[35215] = 58274979 +mem[34986] = 204485850 +mem[46431] = 483390728 +mask = 11101X11011100101101X00X010010X0X100 +mem[21875] = 106030145 +mem[18755] = 2197864 +mem[21518] = 110524 +mask = 101001011101X0001111XX01X000010X10X1 +mem[3866] = 10698 +mem[25215] = 23678 +mem[16705] = 8210939 +mem[40472] = 1601 +mem[43847] = 4262784 +mem[20280] = 845863570 +mask = X110XX1XX101001011X101X01000X00100X1 +mem[57100] = 7125772 +mem[64179] = 73893 +mem[54526] = 3175087 +mem[62001] = 1973479 +mask = 11X0111XXX00001010111X00X00X0XX01011 +mem[54845] = 10595 +mem[31178] = 10986515 +mem[16074] = 765117 +mem[39388] = 548 +mem[16713] = 2599663 +mask = 0100X111110100XX1X11X1X1001000110XX1 +mem[21508] = 3155 +mem[28193] = 144849 +mem[8918] = 5192 +mem[610] = 1144170 +mem[61348] = 102390786 +mem[43515] = 27343 +mem[63705] = 10436512 +mask = X100X11101000011101XXXX1101001XX0X01 +mem[47313] = 28073 +mem[33901] = 90318443 +mem[64222] = 7293 +mask = X110111XX11X00011X1X101X0100000XX001 +mem[24490] = 2682 +mem[9264] = 627919 +mem[1411] = 8120967 +mem[17130] = 1272496 +mem[2438] = 30859917 +mask = 110XXX111101X0X00X11100X010X011001X1 +mem[6973] = 19850171 +mem[51470] = 67939742 +mask = 10100111110100XX111100XX1X01X0010110 +mem[11147] = 30 +mem[22117] = 3508 +mem[32551] = 29083435 +mask = 101001XX1101X0001111X0010X01XXX11X01 +mem[18544] = 482715873 +mem[56829] = 24246491 +mem[19107] = 39530 +mem[11939] = 361324 +mem[64069] = 3257668 +mem[37976] = 2801177 +mask = X1101101X1110X10X001101X10X0110001X1 +mem[41961] = 94719 +mem[5528] = 319045708 +mem[31759] = 597770 +mem[3298] = 54756 +mem[39780] = 454394346 +mask = 11101111X1X1X010111101001X101011XX0X +mem[6325] = 54296774 +mem[53884] = 2248 +mem[41087] = 315232205 +mem[17418] = 227971462 +mem[46081] = 5766 +mask = 1010XX00X1011000X1110X0X000110XX1100 +mem[36022] = 2440 +mem[309] = 11100855 +mem[40840] = 113562551 +mem[51488] = 1410 +mem[38724] = 80445305 +mem[46414] = 693 +mask = 100011111X010011X11100X01001XX0X1001 +mem[6850] = 1658 +mem[27296] = 2089 +mem[34000] = 227145532 +mem[36309] = 6512 +mem[8049] = 41857993 +mem[3603] = 2183079 +mem[9019] = 583919731 +mask = 11XX1XX1110000011X0XX1101100X101101X +mem[42218] = 3195265 +mem[24649] = 20411584 +mask = 1110111X0101X0100011000011000X00X001 +mem[21925] = 945752010 +mem[26816] = 463236906 +mem[8118] = 75 +mem[7382] = 3470 +mem[24647] = 65907 +mem[34226] = 703 +mask = X11011111101X01011111011XX0000101001 +mem[54526] = 523463 +mem[12392] = 240399435 +mask = X01011111110001011111XX00XX00011X001 +mem[29635] = 370994023 +mem[1064] = 1593105 +mem[39783] = 4929783 +mem[7721] = 3697 +mem[19747] = 911509249 +mem[12181] = 8022 +mem[9277] = 269282378 +mask = 1100111XXX0X000110X1X0001100010010X1 +mem[62185] = 768934 +mem[8118] = 238 +mem[16448] = 67217 +mem[1286] = 2768751 +mask = 11X001X11110X0001111X01010X0X0000XX0 +mem[26659] = 4857903 +mem[15890] = 41829451 +mem[61153] = 1745 +mem[33685] = 1322893 +mem[58844] = 22060038 +mask = 11X0X111011100X011011111XXX00011001X +mem[41057] = 504 +mem[9775] = 90755012 +mem[35694] = 1327 +mem[14023] = 5965 +mem[46660] = 15962 +mem[45618] = 93484 +mask = X01111111X11001011100X01X000X0XXX01X +mem[41817] = 30341471 +mem[40062] = 2045 +mem[20631] = 3206 +mem[57953] = 99 +mask = X11011X101X11000111100011101X0001110 +mem[53840] = 154298805 +mem[46322] = 653989 +mem[36288] = 427196 +mem[50550] = 54235668 +mem[61463] = 9653 +mem[58758] = 8531442 +mem[25942] = 187891326 +mask = 1X1011111100001010X1X00000000X1XX001 +mem[24145] = 670 +mem[39140] = 8027405 +mask = 01X01110X11000111111100X001100101X1X +mem[1858] = 465546026 +mem[53156] = 33616871 +mem[34303] = 3814644 +mem[9993] = 424038168 +mem[18379] = 105249 +mask = 1110111X0111001X111101010X11X00X1010 +mem[37628] = 1729777 +mem[14716] = 37020621 +mem[40472] = 633 +mask = 1110111XX11X000X1111001X01000011X00X +mem[32816] = 22945 +mem[58409] = 4261203 +mask = 0110111111110001110X0X1XX111X01110X1 +mem[25234] = 1845 +mem[11313] = 26080 +mem[9420] = 894744 +mem[55530] = 854 +mask = 011011101X11001111X100X00011X0010100 +mem[11839] = 96131 +mem[53757] = 1408 +mem[44034] = 27236 +mem[2385] = 383509 +mask = 111111110XX000001X110X0X00010000XX1X +mem[32942] = 18689 +mem[45731] = 632528 +mem[51515] = 65228710 +mem[7190] = 512188 +mem[55271] = 109657287 +mask = X1101X1111110000111X0X0001001110X010 +mem[31454] = 53024958 +mem[39884] = 1067 +mem[45511] = 12320135 +mem[49866] = 122369 +mem[57038] = 27967196 +mem[29561] = 2925457 +mask = 1X1XXXX11X10X0001111101101101000011X +mem[5666] = 246869 +mem[16826] = 4819818 +mem[9708] = 56613002 +mem[19527] = 979537 +mem[46710] = 1863 +mem[24930] = 9732123 +mask = 0010X11111XX00101X110X0011100X01X000 +mem[54809] = 7602 +mem[46221] = 1952 +mem[18345] = 3892597 +mem[5738] = 9611 +mem[53884] = 2050573 +mem[35694] = 1819 +mem[52446] = 1143 +mask = 01001111110100XX0XXX010000001010XX01 +mem[7226] = 7110 +mem[58560] = 9302 +mem[47854] = 13408926 +mem[50530] = 115326557 +mask = 00101111111000101111000X010X001X00X0 +mem[46080] = 88122926 +mem[36726] = 990065 +mem[6612] = 244727289 +mem[3724] = 7537840 +mem[41817] = 244009305 +mem[42763] = 100935344 +mask = 11111X110010X0001X1111000X1000111101 +mem[29093] = 3116673 +mem[17213] = 576 +mem[42218] = 742524 +mask = 00101X101X010010111X11X1110001X10X1X +mem[18167] = 5096 +mem[18013] = 110009 +mem[12532] = 548 +mem[58899] = 72440595 +mask = 00111111X111X0111110X1011X1101111001 +mem[12181] = 417885 +mem[28523] = 561 +mem[63924] = 785190 +mem[31937] = 27019144 +mem[569] = 149095763 +mem[54809] = 2678 +mem[14355] = 15451 +mask = 10101X11X1000X1X100111011001X1101001 +mem[29525] = 27635 +mem[38648] = 286224 +mem[40257] = 33000302 +mem[2385] = 87334 +mask = 100011X1110000X1X0010X10X10001011011 +mem[10671] = 752653692 +mem[29096] = 28346 +mem[64943] = 5823968 +mem[8985] = 1725 +mem[14409] = 432068 +mask = 11101X11XX11X00011110X0111X11X001X10 +mem[35782] = 26162 +mem[18167] = 265539 +mem[53514] = 17777350 +mask = 0110111X111X00X111X100000111X0100XXX +mem[11289] = 25199 +mem[21966] = 1577738 +mem[33100] = 7214029 +mem[14371] = 225814 +mask = 1110X111111000X011X11X1XX0XX0010X000 +mem[54809] = 164605380 +mem[38947] = 1624427 +mem[63150] = 221584 +mask = 11101111XX0110X0X01101X010XX101X1X00 +mem[28523] = 622707 +mem[8072] = 227741 +mem[6611] = 15393 +mem[2600] = 386986740 +mask = 110010X111010X10X1110001X11001110101 +mem[46256] = 1543619 +mem[58524] = 128793487 +mem[39996] = 2787 diff --git a/lib.rkt b/lib.rkt index 08e63c8..a0069f3 100644 --- a/lib.rkt +++ b/lib.rkt @@ -43,6 +43,7 @@ number->digits number->digits-reverse digits->number + string->binary snoc scanl scanr @@ -235,6 +236,12 @@ (if (empty? ns) n (loop (+ (* n 10) (car ns)) (cdr ns))))) +;; string->binary : string -> number +;; Given a string representation of a binary number, +;; convert it to the number it represents +(define (string->binary str) + (string->number (string-append "#b" str))) + ;; List helpers ;; diff --git a/src/14.rkt b/src/14.rkt new file mode 100644 index 0000000..4df423c --- /dev/null +++ b/src/14.rkt @@ -0,0 +1,66 @@ +#lang curly-fn racket + +(require "../lib.rkt") + +(define input (problem-input 14)) + +(define (parse1 instr) + (match instr + [(regexp #px"^mask = (\\w+)$" (list _ mask)) + (let ([ormask (string->binary (string-replace mask "X" "0"))] + [andmask (string->binary (string-replace mask "X" "1"))]) + (list 'mask ormask andmask))] + [(regexp #px"^mem\\[(\\d+)\\] = (\\d+)" (list _ addr val)) + (list 'write (string->number addr) (string->number val))])) + +(define (parse2 instr) + (match instr + [(regexp #px"^mask = (\\w+)$" (list _ mask)) + (let* ([ormask (string->binary (string-replace mask "X" "0"))] + [andmask (string->binary (regexp-replaces mask '([#rx"0" "1"] [#rx"X" "0"])))] + [X-indices (indexes-of (string->list mask) #\X)] + [X-ormasks (map #{expt 2 (sub1 (- (string-length mask) %))} X-indices)]) + (list 'mask ormask andmask X-ormasks))] + [(regexp #px"^mem\\[(\\d+)\\] = (\\d+)" (list _ addr val)) + (list 'write (string->number addr) (string->number val))])) + +(define (addrs addr ormasks) + (if (empty? ormasks) + (list addr) + (let ([rest-addrs (addrs addr (rest ormasks))]) + (append (map #{bitwise-ior (first ormasks) %} rest-addrs) + rest-addrs)))) + +(define part1 + (match-let-values + ([(mem _ _) + (for/fold ([mem (hash)] + [ormask 0] + [andmask -1]) + ([instr (map parse1 input)]) + (match instr + [(list 'mask ormask andmask) + (values mem ormask andmask)] + [(list 'write addr val) + (let ([val (bitwise-ior ormask (bitwise-and andmask val))]) + (values (hash-set mem addr val) ormask andmask))]))]) + (sum (hash-values mem)))) + +(define part2 + (match-let-values + ([(mem _ _ _) + (for/fold ([mem (hash)] + [ormask 0] + [andmask -1] + [X-ormasks '()]) + ([instr (map parse2 input)]) + (match instr + [(list 'mask ormask andmask X-ormasks) + (values mem ormask andmask X-ormasks)] + [(list 'write addr val) + (let* ([addr (bitwise-ior ormask (bitwise-and andmask addr))] + [mem (foldl #{hash-set %2 %1 val} mem (addrs addr X-ormasks))]) + (values mem ormask andmask X-ormasks))]))]) + (sum (hash-values mem)))) + +(show-solution part1 part2)