# HG changeset patch # User Steve Losh # Date 1639531136 18000 # Node ID 68bbcb0ce4f762657746571a0db75b6df26b90cc # Parent 6614131d7b10260a250d9caa7a700cbe0d55cfc0 2020/14 diff -r 6614131d7b10 -r 68bbcb0ce4f7 data/2020/14.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/data/2020/14.txt Tue Dec 14 20:18:56 2021 -0500 @@ -0,0 +1,545 @@ +mask = X00000000000110011100XXX011110111011 +mem[41579] = 225076 +mem[14806] = 26208185 +mem[47659] = 176531392 +mem[27723] = 186971157 +mem[35129] = 3483636 +mem[27142] = 4246 +mask = 01101X10101011000101X1X0XXX101111110 +mem[16685] = 392461 +mem[65343] = 13662482 +mem[53292] = 736 +mem[6830] = 382342975 +mem[12777] = 19983424 +mem[19592] = 679514970 +mem[8776] = 122013 +mask = 011X110100011100111001X1000XX011001X +mem[29076] = 305532 +mem[30139] = 135337 +mask = 0100X00X1010110X0X010010010001000001 +mem[32307] = 2921 +mem[29478] = 15201 +mask = 1X101101001111111XX1XX1X00X100111X11 +mem[35018] = 63654376 +mem[13977] = 22331 +mem[7078] = 27879686 +mem[36409] = 1248 +mem[29098] = 1049 +mask = 010X0001001X111011001011X000X100X010 +mem[37355] = 3525 +mem[37012] = 16715 +mem[2023] = 7212969 +mem[31805] = 455891 +mem[34394] = 411403104 +mem[5056] = 14954425 +mem[55325] = 17658 +mask = 01101XX01010X100010XXX011110111X0010 +mem[60619] = 889 +mem[65362] = 145345 +mem[53540] = 2298570 +mem[62434] = 542 +mem[12457] = 1279 +mem[5456] = 4090 +mask = 01001X01100010101111X000X01X0X01X001 +mem[27104] = 3012 +mem[9008] = 75 +mem[31688] = 60 +mask = XX01X00000XX110011100X0X010110XX1100 +mem[25251] = 7374 +mem[63139] = 27875755 +mem[42967] = 8204614 +mem[61987] = 396 +mem[30866] = 691 +mask = 1001000X00X0110X1110001000100101XX00 +mem[40705] = 21726765 +mem[7454] = 22726 +mem[46834] = 68819 +mem[7078] = 643555271 +mem[48619] = 34299689 +mem[42749] = 27406055 +mem[32511] = 54957378 +mask = 0X0110010011X1X0110000001010000100X0 +mem[5752] = 957 +mem[58252] = 463561556 +mask = 0X1X1X010011110X111001X00001000XX0X0 +mem[63353] = 14516 +mem[15823] = 2060 +mem[30126] = 102554 +mem[30621] = 17543629 +mem[35116] = 76250 +mem[10236] = 11446819 +mem[16660] = 2541872 +mask = 1X01X00000101100X1X01111100101100000 +mem[48609] = 312842 +mem[2909] = 17774 +mem[19872] = 5613 +mem[9985] = 6539455 +mem[63287] = 312743 +mem[40351] = 16889429 +mask = 0111001001111110XXXX0XXXX11100010011 +mem[61065] = 14018 +mem[1689] = 301351825 +mem[31135] = 568 +mask = X10000100010X000111001X0X0010010X00X +mem[29969] = 7096617 +mem[19809] = 862281685 +mem[30350] = 1871 +mem[31001] = 93711152 +mem[13233] = 33263717 +mem[42482] = 579908 +mask = 01X10X0X00X11100110100011X0X0X0X001X +mem[41248] = 7946615 +mem[1829] = 1576 +mem[907] = 21637953 +mem[3566] = 2883 +mem[29687] = 19408 +mem[15657] = 972 +mask = 010100X10001110010X110X01X0111X01010 +mem[53292] = 609 +mem[55550] = 8115727 +mem[834] = 617 +mem[53708] = 498838597 +mem[39044] = 309 +mem[17842] = 5862 +mask = 0100X00010X011X01110X0XX0110000X1101 +mem[32511] = 50674184 +mem[41256] = 996258 +mem[47199] = 1837 +mask = 1101001XXX1X111X10X00X000X011101X101 +mem[9292] = 623250 +mem[45902] = 258279925 +mem[20440] = 172992884 +mem[31688] = 65210 +mem[2288] = 66034927 +mask = 01100101X110X01X11X01100001000X11001 +mem[58893] = 2144468 +mem[5048] = 750616856 +mask = 010110X1001111001100XX0011100101X0X0 +mem[9150] = 4201416 +mem[33664] = 15504 +mem[7218] = 18606957 +mask = 01X1100X0X00110011X0101101111X0X1111 +mem[8003] = 1403 +mem[64683] = 16052434 +mem[17299] = 43327 +mem[13505] = 961 +mem[48609] = 709578 +mem[11582] = 855 +mem[42822] = 3983 +mask = 01101001X01X11X011XX0111110110000101 +mem[30603] = 24703071 +mem[3805] = 775231 +mem[30098] = 230279 +mem[46351] = 5983 +mem[6689] = 3542 +mem[26816] = 121693 +mask = 1X00X0101010010011X1XX0110110011X0X1 +mem[16838] = 192956313 +mem[60531] = 24171693 +mem[22819] = 38459 +mem[26453] = 6160088 +mask = 1X010X000000110X1110100001X0100100X0 +mem[43837] = 22192131 +mem[10090] = 21946 +mask = 01X111000X011100111XX100001100100000 +mem[4306] = 56171106 +mem[50905] = 3399 +mem[36168] = 121097 +mask = 1X010000XXX111001X100X100100X0X001X1 +mem[31394] = 121478 +mem[4906] = 139929 +mem[36356] = 1924 +mask = 1010X010001011X011X011XX11011110X111 +mem[11864] = 29928714 +mem[30866] = 45934 +mem[19873] = 370711 +mask = 0101100000X10110111110X0XXX1XX110X01 +mem[51120] = 65808488 +mem[22318] = 10244125 +mem[26453] = 13126923 +mem[64961] = 3880 +mask = X01011X1001111X1X11XX100010X00111100 +mem[62778] = 126882 +mem[59733] = 1267462 +mem[13740] = 435 +mem[3400] = 8477 +mem[4133] = 116701 +mem[30619] = 231703 +mask = 01000X011010101011110X1000110XX0110X +mem[45164] = 25402465 +mem[9309] = 77050566 +mem[29909] = 706 +mem[27758] = 1319 +mem[6150] = 106196666 +mask = 01X11X0X00X111001110X1XX0001X001001X +mem[14255] = 13708852 +mem[513] = 3790644 +mem[28804] = 395377671 +mem[57953] = 72417 +mem[28725] = 1201 +mem[11750] = 233 +mask = X10100X100111110110X00001X1011010X11 +mem[49595] = 24812 +mem[64152] = 9382 +mem[12122] = 2319571 +mem[42088] = 482 +mask = 1X000XX010100100111100X001110X1000XX +mem[13636] = 524153304 +mem[36450] = 352968 +mem[6260] = 4407821 +mask = 0111000X000101X01XX100X1X1001110X010 +mem[7218] = 94415 +mem[29864] = 5120026 +mem[53070] = 6612 +mem[36573] = 8326010 +mem[1987] = 5992534 +mem[9798] = 11713 +mask = 110000X01010X100111100X01011000XX10X +mem[26267] = 61334 +mem[29687] = 520585578 +mem[11781] = 66211489 +mask = X001X000000111001110X011001X1X100011 +mem[2023] = 805 +mem[7673] = 1711 +mem[9374] = 7545 +mem[45925] = 33575 +mask = 010X000X10101X000011XXX00X1000000000 +mem[30922] = 12722836 +mem[61189] = 510395 +mem[26267] = 38479500 +mask = X0101X0100X11X1110X11110000000X01011 +mem[55014] = 27563943 +mem[46994] = 497673195 +mem[43529] = 80791407 +mem[65052] = 454391739 +mem[30577] = 304 +mask = 0X01000110011X00X10110111100X0X10010 +mem[45248] = 7792707 +mem[6927] = 12193 +mem[60386] = 3927747 +mem[39315] = 4161237 +mask = X001X01000X01100111010101X111X1X0010 +mem[15099] = 17870434 +mem[60] = 32347 +mem[6193] = 412046876 +mem[61561] = 142217182 +mem[25826] = 2073043 +mem[61322] = 14525 +mask = X1X100X0X11111X01XX000000101000X1X01 +mem[4794] = 233038 +mem[29193] = 23211308 +mem[26267] = 10247786 +mem[44728] = 384574 +mem[57840] = 471 +mem[23517] = 507429935 +mem[8408] = 251968 +mask = X1000X010010110X11X100101X1X1101X100 +mem[14979] = 52721 +mem[14121] = 12422 +mem[65343] = 653 +mem[513] = 23189896 +mask = 1101X0X0010X110010100111101000X00XX0 +mem[21511] = 30489818 +mem[63139] = 13245573 +mem[64852] = 762 +mask = XX01100000011100111X11X00100110X0111 +mem[59229] = 47739 +mem[49595] = 31185 +mem[9374] = 11755159 +mem[42415] = 206175 +mask = X1X010X01010X10001X1010100X1X1X10X10 +mem[65383] = 54664 +mem[17412] = 6631 +mem[55994] = 373011 +mem[53672] = 26530655 +mem[7974] = 1007816675 +mask = 1100X010X01X1000111001X100011011000X +mem[4896] = 38031019 +mem[754] = 2287 +mem[30181] = 50259322 +mask = 1X010XX00XX111001X10X110100X10000100 +mem[32551] = 7983378 +mem[7438] = 31324924 +mask = 0101X0000010X100111000X0X1X110X01110 +mem[25209] = 48369038 +mem[50393] = 576369 +mem[40859] = 3812 +mem[56386] = 569373625 +mem[63105] = 8734731 +mask = 10101XX0001011X01110XX001X010110XX0X +mem[34042] = 19350728 +mem[32063] = 255940784 +mem[33476] = 53404 +mem[35243] = 209057823 +mem[4983] = 377086 +mem[4794] = 16200733 +mask = 01X01000101X110001010X11X01X00000101 +mem[19467] = 14126078 +mem[29699] = 830 +mask = 010110X000X1X110111XX1001111X0X10XX1 +mem[43026] = 13471405 +mem[4984] = 1882 +mem[18947] = 15001421 +mask = XX011001X0XXXX001X1101X0000100001010 +mem[55787] = 737 +mem[1563] = 2538 +mem[59758] = 28003877 +mask = 100X000X000X110X1X101100001011X1X011 +mem[25696] = 172112 +mem[12279] = 113288 +mem[24031] = 37612590 +mask = 11XX00X00010110011100101X11010100111 +mem[46130] = 1530 +mem[12542] = 795 +mask = 110X00011X01111001X00X1100100010XX10 +mem[27592] = 128275 +mem[27809] = 132195912 +mem[24738] = 199737 +mem[19162] = 15356 +mask = 010001010X10X10X1111000010001101X000 +mem[8268] = 377409380 +mem[10236] = 540166 +mem[38723] = 139937 +mem[60530] = 7895799 +mem[21813] = 6275543 +mem[8917] = 50534988 +mem[50461] = 251351 +mask = 0110X1011XX01X1011X0X1010X11X000X000 +mem[37937] = 2706 +mem[53672] = 23428 +mem[16637] = 43775004 +mem[13789] = 23884648 +mask = 1X0X00X0001011001110000101X1X1X0X0X1 +mem[55787] = 960988 +mem[29687] = 510439 +mem[63862] = 122580 +mem[30126] = 1488 +mem[44826] = 3558 +mask = XX00001010X011001X110X0X11XX10000X00 +mem[5760] = 209762 +mem[27142] = 2968 +mem[19789] = 269 +mem[634] = 9949 +mask = 01X0X00010101100X1X101XX01110X0X011X +mem[24659] = 304 +mem[28725] = 7064540 +mem[23533] = 396592131 +mem[42715] = 129702313 +mask = 1X0X0000X0X0110011101X10011X1110000X +mem[31688] = 698304069 +mem[28880] = 1648 +mem[1915] = 1894 +mem[50253] = 3317783 +mask = 0101X00100X1110011XX00X00X00X00XX010 +mem[7930] = 49938921 +mem[45686] = 376 +mem[44994] = 394081142 +mem[25475] = 1655 +mem[11478] = 704 +mem[34150] = 4147579 +mask = X10X00X0011X11001X100100011100000011 +mem[13838] = 9047 +mem[64712] = 7762 +mem[63477] = 6690357 +mem[38863] = 7288 +mask = 01000000101011000X11011XX111000X01X1 +mem[20533] = 10736847 +mem[40924] = 430217452 +mem[64360] = 2426851 +mem[58115] = 12071761 +mem[30126] = 26562102 +mem[6672] = 154543 +mem[4382] = 10121 +mask = 01X110X00X1X11101X10X110011100X00011 +mem[20472] = 194 +mem[35111] = 708430742 +mem[2674] = 44 +mem[39452] = 614 +mem[19219] = 110991746 +mask = 01X10X010001X1001XX1X00000X00X000110 +mem[38888] = 996404203 +mem[13988] = 2030 +mem[29687] = 833197 +mask = X0010000X00X11X001X000X001011XX1X001 +mem[19041] = 26558 +mem[57953] = 30524 +mem[58714] = 3716054 +mem[12930] = 83910 +mask = 1101100X0X111X001X10XX1101011X100000 +mem[45686] = 3647 +mem[33541] = 36310663 +mem[17979] = 6056054 +mem[10534] = 16345 +mem[47111] = 232953370 +mem[25533] = 27557895 +mem[58098] = 1560064 +mask = 100X0000X0X011XX11X001000101111X0000 +mem[26199] = 246090059 +mem[18199] = 88594470 +mem[29909] = 16759 +mem[64360] = 634531 +mask = 0101XXX10011110XX1100011000X001101X0 +mem[16673] = 22927535 +mem[12390] = 62487 +mem[60131] = 719 +mem[20196] = 175993 +mem[34150] = 25943355 +mem[9914] = 48537509 +mem[41065] = 46726 +mask = 0101000100X11100XX01000X101001000000 +mem[61353] = 192 +mem[30126] = 122504373 +mem[43978] = 112475 +mem[54606] = 262832639 +mask = 110000X01XX0010X1111011010XX01110100 +mem[38654] = 5670 +mem[19246] = 3500 +mem[3280] = 780682 +mem[25841] = 3675082 +mem[10090] = 939 +mem[30577] = 19385 +mask = 1101X000001X11XX1110010101101X101X01 +mem[30181] = 467224373 +mem[64712] = 19540 +mem[9150] = 110790020 +mem[58763] = 649 +mem[61987] = 31515335 +mem[36168] = 40664 +mask = 011001X1X10010X01X1X0X010100X101X1X1 +mem[50341] = 249123925 +mem[57809] = 1245764 +mem[1000] = 6880 +mem[62447] = 9704635 +mem[57040] = 22401 +mem[36847] = 1403 +mask = 1XX0X01000101XX0111001X00101110XX101 +mem[44459] = 1909253 +mem[28804] = 13248 +mask = 11000000X010X1001110111XX0100X101000 +mem[44826] = 1584 +mem[8549] = 20390300 +mem[8024] = 83478929 +mem[26411] = 1612730 +mem[27809] = 3340355 +mask = 0101100X00X111X0111XX100X010000100X1 +mem[43026] = 246196988 +mem[3889] = 148865 +mem[43538] = 168294874 +mem[37181] = 2452 +mem[13074] = 203182 +mask = 100100100101110011X0XX10X101101XX100 +mem[47655] = 2283 +mem[43365] = 51654102 +mem[20448] = 1899 +mem[46501] = 866 +mem[39220] = 8179259 +mask = 01100101111X11XX1X00X100000X0110XX00 +mem[4063] = 25905 +mem[56197] = 7616 +mem[22101] = 96196611 +mask = XX011100X001110X1110XX000X1010000010 +mem[38766] = 317650050 +mem[275] = 1077 +mem[47272] = 3545 +mem[17513] = 428 +mem[31209] = 10901538 +mem[60020] = 8191405 +mask = 100X0000X0001100X110XXX00001110X000X +mem[3889] = 240406519 +mem[58283] = 105792011 +mem[2023] = 11451400 +mem[42056] = 500252 +mask = 0101100100X11X00110100X001001X0000X0 +mem[51566] = 18992 +mem[2207] = 9397005 +mem[16208] = 18748 +mem[11287] = 117402894 +mem[10310] = 16126 +mem[63935] = 59804 +mask = X1X00X01101011X011XX1001011X10110X01 +mem[17412] = 292 +mem[55917] = 290254 +mem[36766] = 38849561 +mem[39220] = 401237793 +mask = 011001011X1011X01X100001000110010X00 +mem[41854] = 1014518 +mem[16822] = 16372 +mem[36517] = 6130231 +mem[37271] = 406796637 +mask = 0X01000X000111X0111X011001X000000X11 +mem[58255] = 95641 +mem[98] = 61432470 +mask = 0100000100101XX01111100100X11X011101 +mem[9985] = 1592325 +mem[11478] = 2271665 +mem[3757] = 41068007 +mem[61585] = 70572 +mem[17154] = 335361 +mem[60531] = 41930933 +mask = 1001X00000X011011110X0100X000X010010 +mem[64462] = 29767556 +mem[24738] = 210929 +mem[50899] = 1287 +mask = 000XX000000111100100X10001X10010100X +mem[6334] = 287 +mem[34777] = 1860550 +mask = 110X001000101X001110X111010X0X1X0X01 +mem[12157] = 6178 +mem[40351] = 59493 +mem[30619] = 34292339 +mem[13636] = 1290347 +mask = X100000XX01011X0111X100101000X10X1X1 +mem[60731] = 9983015 +mem[9985] = 18414272 +mem[56154] = 62268050 +mem[40924] = 15580622 +mask = 01010001XX011100110110100X00XX010000 +mem[24823] = 113683 +mem[33142] = 14761835 +mem[33664] = 26275 +mem[7822] = 5148968 +mem[39411] = 1216069 +mem[27779] = 102128 +mem[36065] = 10811 +mask = 11X00010XX10100011X00001X11X0X1X10X1 +mem[34192] = 592942932 +mem[61987] = 27192613 +mem[63760] = 8016 +mask = 010XX00110X01X101111100X0X100X100001 +mem[14125] = 363398 +mem[9080] = 113944 +mem[29909] = 14606451 +mem[52829] = 102953 +mask = 0101XX01001111X0110X0010XX0001011110 +mem[8212] = 2171 +mem[60531] = 439001 +mem[11151] = 8267 +mem[634] = 51725 +mem[38040] = 6915656 +mask = XX01001X011X1X001000011100100X000101 +mem[18184] = 34766 +mem[53526] = 38417257 +mem[28494] = 114210018 +mem[102] = 3422103 +mask = X100000010101100X1110XXX01110000X1X1 +mem[7454] = 3185 +mem[45157] = 3488 +mem[62822] = 3659366 +mask = 1110100X1010110001X1X11X1001X0X1001X +mem[58002] = 236109549 +mem[3536] = 11719 +mem[40939] = 550805420 +mem[34751] = 538 +mem[51410] = 19066 +mem[11996] = 29329688 +mask = 01010XX00001111011X00110010X0010X111 +mem[64654] = 1185760 +mem[56361] = 13297936 +mem[102] = 3966 +mem[18335] = 470391 +mem[1905] = 25790 +mask = X10X000110XX1110X11001000X00101001X0 +mem[55089] = 17943368 +mem[40456] = 501700825 +mem[47927] = 513748 +mem[13838] = 385 diff -r 6614131d7b10 -r 68bbcb0ce4f7 src/2020/days/day-14.lisp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/2020/days/day-14.lisp Tue Dec 14 20:18:56 2021 -0500 @@ -0,0 +1,62 @@ +(advent:defpackage* :advent/2020/14) +(in-package :advent/2020/14) + +(defun parse (stream) + (iterate + (for line :in-stream stream :using #'read-line) + (collect (or (ppcre:register-groups-bind ((#'parse-integer addr val)) + ("mem\\[(\\d+)\\] = (\\d+)" line) + (list :set addr val)) + (ppcre:register-groups-bind (mask) + ("mask = ([X01]+)" line) + (list :mask mask)))))) + +(defun op (inst) (first inst)) +(defun mask (inst) (second inst)) +(defun addr (inst) (second inst)) +(defun value (inst) (third inst)) + +(defun-inline char->bit (char) + (ecase char (#\0 0) (#\1 1))) + +(defun-inline dpbit (bit pos value) + (dpb bit (byte 1 pos) value)) + +(defun mask-value (mask value) + (iterate (for char :in-string mask :downto 0) + (for pos :from 0) + (unless (eql #\X char) + (setf value (dpbit (char->bit char) pos value)))) + value) + +(defun mask-address (mask addr) + (iterate (with-result addrs = (list addr)) + (for pos :from 0) + (for char :in-string mask :downto 0) + (ecase char + (#\X (setf addrs (append (mapcar (curry #'dpbit 0 pos) addrs) + (mapcar (curry #'dpbit 1 pos) addrs)))) + (#\0 (progn)) + (#\1 (map-into addrs (curry #'dpbit 1 pos) addrs))))) + +(defun run-program (program &key part) + (iterate (with memory = (make-hash-table)) + (with mask = nil) + (for inst :in program) + (ecase (op inst) + (:mask (setf mask (mask inst))) + (:set (ecase part + (1 (setf (gethash (addr inst) memory 0) + (mask-value mask (value inst)))) + (2 (dolist (addr (mask-address mask (addr inst))) + (setf (gethash addr memory 0) + (value inst))))))) + (finally (return (reduce #'+ (alexandria:hash-table-values memory)))))) + +(define-problem (2020 14) (data parse) (9967721333886 4355897790573) + (values + (run-program data :part 1) + (run-program data :part 2))) + + +#; Scratch --------------------------------------------------------------------