Complete day 14

This commit is contained in:
Peter J. Holzer 2020-12-14 22:42:53 +01:00 committed by Peter J. Holzer
parent 259f974f32
commit 5189f9d0d0
3 changed files with 604 additions and 0 deletions

551
14/input Normal file
View File

@ -0,0 +1,551 @@
mask = 01101X001X111X010X0000X1001X010XX0X0
mem[4841] = 3942
mem[9168] = 414370178
mask = 0110010011X1X1X0000000XX0110000XX111
mem[33062] = 288
mem[20612] = 182
mask = 11X00100011111110000X1010X001X010000
mem[8509] = 140
mem[17752] = 2606028
mem[49078] = 5406
mem[51242] = 109058175
mem[32524] = 5834185
mem[18889] = 416675
mask = X1100X00111111X0000000X1XX1X1X000000
mem[20551] = 7515
mem[17979] = 6511051
mask = 111000X0111X111110000X0X01X1X0010001
mem[63807] = 65801880
mem[38229] = 1958228
mem[60238] = 10317226
mem[8245] = 37777
mem[13328] = 106103916
mask = 0110001111XXXX10X010X00101XX01000111
mem[2637] = 6952795
mem[29819] = 10089122
mem[47364] = 3403584
mem[59421] = 16626230
mem[10381] = 23975082
mask = 1X100X101110X11110101100X10101100001
mem[47584] = 7588784
mem[7998] = 209420582
mem[2215] = 101018542
mem[10326] = 33499943
mask = 010011001111XX01010101XX00110X100X00
mem[1380] = 14157477
mem[14979] = 3077
mem[56589] = 65261
mem[50403] = 966
mem[54831] = 485513
mem[15967] = 490311105
mask = 01XX11001110010100010X001X1X11011101
mem[32012] = 415
mem[23771] = 395310
mem[66] = 186902
mask = 1X10X110X1X01X1X10000X001X0100X00000
mem[37189] = 834
mem[59763] = 64348057
mask = X1100100111XX1X1X00X001101XX0100001X
mem[12021] = 123589
mem[150] = 691812
mem[1988] = 4844
mem[14979] = 866
mask = 11X001001X1X101X0X0X0010111000X00010
mem[1988] = 184319453
mem[30263] = 3126
mem[36910] = 56981746
mem[14016] = 25485783
mask = 1XX010X01110X110100000X11101X10X0X11
mem[3513] = 1787222
mem[11652] = 13761
mem[25508] = 235920
mem[49386] = 7440645
mem[51287] = 197564380
mem[9697] = 1812
mem[62638] = 5207143
mask = X01X110X1101010101101110X01010100010
mem[35711] = 311172
mem[11538] = 92602
mem[56210] = 147702
mem[36910] = 3677
mem[46719] = 80249
mask = X100X10010110101000X001X100111100110
mem[52498] = 7142
mem[55838] = 108173611
mem[8836] = 3620232
mem[52288] = 1254336
mask = 1110X11X11001111100000001X00X1100X01
mem[53505] = 2320049
mem[34984] = 22763
mem[48172] = 484320
mem[2670] = 334861
mask = X1100010X1X0111100X0XX00011110010100
mem[19607] = 60274605
mem[15403] = 4876
mem[50026] = 155030489
mem[54997] = 3872114
mem[45248] = 6299950
mem[8245] = 1107
mask = 10100X0X110111X110X00001101101100X00
mem[36085] = 6621
mem[57943] = 47436
mem[12709] = 21928466
mem[21724] = 534
mem[44782] = 460274
mem[62043] = 447
mem[48293] = 5706496
mask = 111X0100XX101110X00010XX110X101000X1
mem[61318] = 29864
mem[384] = 3350802
mem[85] = 63068
mem[60071] = 760978
mem[44357] = 15965
mask = 01X0X100X111X10X0X0X0001XX1011000000
mem[15426] = 479567220
mem[1988] = 8279
mem[21835] = 43376
mem[1257] = 99466
mem[56118] = 29525895
mask = XX1011X011X1X101011000XX1X100X110000
mem[51649] = 1040282
mem[36903] = 40633
mem[52146] = 50010
mem[41230] = 1549
mem[2090] = 61683
mem[45237] = 4280
mem[4116] = 639494
mask = 1X10XX00X11X010110000010010011000110
mem[32858] = 333331
mem[12610] = 3307080
mem[13553] = 849370649
mem[12442] = 49072
mask = 11100100X111X11100000110000X110000X1
mem[11661] = 26500
mem[48770] = 566036264
mem[25452] = 6655520
mem[20604] = 4661
mem[2240] = 30475
mem[5992] = 645113282
mask = 0110010001X1010001001X010111011XX010
mem[16596] = 38553734
mem[8245] = 288
mem[6256] = 2527
mem[8779] = 392795412
mask = 1010X1XX110X111110001X00000100100101
mem[40037] = 3557515
mem[40660] = 4025046
mem[12007] = 26303
mem[25863] = 1501
mem[51197] = 34569606
mask = 011X1X010010110100010XXXXX111X1100X0
mem[59421] = 256710
mem[8848] = 14645067
mem[20604] = 1810
mem[3814] = 227
mask = 111110X00110X010100X0XX110110X11X011
mem[47599] = 1290920
mem[21877] = 118276
mem[51248] = 87777
mask = 1110X01011101X1010XX0XX11XX0X1110011
mem[66] = 13465
mem[44079] = 1000
mem[5533] = 235749681
mem[47599] = 90145
mem[15331] = 828346025
mem[38599] = 38093
mem[9618] = 1155
mask = 0111X0101110X111001010011011000XX001
mem[51392] = 178163349
mem[34584] = 3043180
mem[2401] = 37940538
mem[5932] = 13078
mem[60430] = 32668784
mem[45249] = 13789
mem[64444] = 98
mask = 111X0100111X111XX0000XX0X00001X00X11
mem[37189] = 535092671
mem[37165] = 365784
mem[27008] = 24184267
mem[30336] = 211964
mask = 0111000101X0110100010010X1X001X0X00X
mem[1297] = 262172173
mem[15250] = 7218166
mem[3921] = 576305160
mem[5238] = 66721
mask = X100X100X01X010X010100010XX1010X01X0
mem[64159] = 3372817
mem[47010] = 13564
mem[19734] = 218293629
mem[13014] = 7811770
mem[16596] = 347
mask = 0110010X111001110X0X00X1100X100000X0
mem[23241] = 101885
mem[5238] = 416
mem[3862] = 1633802
mask = 111XX11011X0X1X1100000X011X000000011
mem[12021] = 8163882
mem[15827] = 136279370
mem[15875] = 111
mem[5991] = 178004
mask = X0111010011X111XX00011110010X1110011
mem[51143] = 111175
mem[31811] = 70891
mem[60840] = 13218
mem[46324] = 5020
mask = 1010101011101X10100000X1011X1X100111
mem[85] = 2036268
mem[32739] = 8222467
mem[50840] = 27115578
mem[46591] = 11383922
mem[56462] = 3203407
mask = 111000101110X01010XX11001100011X1XX0
mem[54079] = 6935
mem[62079] = 2679
mask = 10X000111X1011X1101001XX11010010X101
mem[5191] = 7928110
mem[31654] = 13131527
mem[30979] = 6724
mask = 1X1000X11X1011X0X0100X0111010000X011
mem[85] = 67719
mem[35174] = 418373
mem[51173] = 6061932
mem[48747] = 27919
mem[9961] = 16824594
mask = XX10X10X111001011000X0X000111X000110
mem[2215] = 12662
mem[53156] = 31725
mem[21956] = 18506440
mem[5954] = 892
mask = 0100010X1X1101000101X0X10X0001001X01
mem[14048] = 1256291
mem[33489] = 74344679
mem[31942] = 21958
mem[12007] = 1670564
mem[53466] = 11991
mem[33529] = 435881689
mem[12709] = 77367498
mask = 0X1100111X1000101X1X1XX1X000010011X0
mem[20604] = 745
mem[16901] = 55323
mem[31026] = 311133
mem[287] = 2850714
mem[61333] = 478308
mem[64074] = 493143
mask = XX10001X1X10111XX010X0011101001000X1
mem[5991] = 7705
mem[54597] = 3447346
mem[49386] = 28438
mem[36040] = 56052820
mem[20469] = 17271
mem[62913] = 7732604
mem[3412] = 6102127
mask = X1XX1000011011X010X001000X1101X11000
mem[29733] = 3524
mem[48770] = 125149
mem[12829] = 6776326
mask = 010X010X11111X00000X1X011X101X110110
mem[48337] = 1746
mem[85] = 574143
mem[35824] = 205850239
mem[38811] = 25425
mem[57154] = 25695
mem[45249] = 16800535
mem[19317] = 5109374
mask = 1X1000XX1X101X10X01011000001011XX110
mem[40611] = 1356
mem[12299] = 2095
mem[23202] = 2536
mask = 1110X1001X11111100010X0XX11XX0000101
mem[37400] = 442610
mem[34803] = 318
mem[9031] = 249678
mask = 1X1110X001101110X00010X11110011XXX00
mem[2670] = 99927
mem[49078] = 9463
mem[2993] = 640
mem[51455] = 428310
mem[47995] = 13063939
mask = 01101XXX1XXX100100000XX0001011011000
mem[48293] = 1674
mem[61009] = 500098
mem[5080] = 45615
mem[60023] = 49663406
mem[60905] = 1829076
mem[28346] = 183
mask = 11X01X0001XX011010X0000X0001X1X11100
mem[46718] = 4380
mem[13394] = 1909430
mem[29741] = 244218235
mem[3493] = 211917241
mem[39030] = 1374
mask = 0100010XX0110100X10100XX0001100X0X00
mem[19093] = 385
mem[121] = 770
mem[8820] = 235181808
mem[15967] = 44085381
mem[16580] = 1088367
mem[33422] = 919067085
mask = X0X011XX1X11110X01X0X01X111100111110
mem[39728] = 1714
mem[15624] = 417143278
mask = 00XX0001101011101X1001XX11X1X110001X
mem[17164] = 252516
mem[15654] = 16043
mem[3180] = 457215773
mem[41735] = 831
mem[5533] = 1251
mem[20687] = 363018
mem[14898] = 6896717
mask = 01101X0X1X111001X0000001000011101011
mem[29510] = 5445530
mem[58] = 2005940
mem[64191] = 161526093
mem[6578] = 736
mask = X11011X0010011111000XX10110100010001
mem[6000] = 7668
mem[9819] = 51057159
mem[43871] = 30001900
mem[27557] = 551910519
mem[52290] = 845
mask = 011XX010X1101111X010010X0X111XX100X1
mem[32012] = 13301157
mem[2422] = 2346
mem[51649] = 1026605881
mask = X11X001X111X001010100XX10X1X01X01001
mem[64367] = 440
mem[37189] = 248796
mem[40449] = 32700
mem[16556] = 386038740
mask = XX11X10X1X11111100000011010011XX0010
mem[15875] = 2785525
mem[37189] = 441
mem[55319] = 1225305
mem[41903] = 199582639
mask = 1011X0X0X1X011101000X010111XX11X01X1
mem[20675] = 49758
mem[12342] = 225305969
mem[8414] = 247229
mask = 1100X0001X1001101X000001110100X01011
mem[5089] = 18944
mem[35956] = 21989
mem[3169] = 487520844
mem[24443] = 623
mask = X110101X1110111010X00X00100000X0X011
mem[15824] = 85916
mem[32710] = 1664755
mem[1243] = 3977144
mem[23771] = 4115
mask = X1101110110101X101X00X1000X001X10100
mem[55138] = 5280
mem[36161] = 6353162
mem[56293] = 47505
mem[10292] = 8795
mem[56462] = 10685425
mask = 0110110X11X11X011100001100X011001110
mem[27214] = 1155726
mem[46047] = 18512966
mem[8386] = 204434879
mask = 01X0X10X1111X1010X010X0XX0001000X010
mem[51751] = 40804
mem[11905] = 11919
mem[51649] = 40498
mem[13888] = 345577645
mem[13303] = 918
mem[56350] = 53749
mask = X110X0101110111X0X10010X1X1001110011
mem[8103] = 129154665
mem[44036] = 5036
mask = 0X100XX1101011101010000X110X0X100X1X
mem[25004] = 1499470
mem[55753] = 34968
mem[22702] = 1142902
mem[39030] = 926
mask = XX1001001X111111000XX001100001000000
mem[33390] = 110
mem[57874] = 11128226
mem[51028] = 1148
mem[45069] = 482759
mem[55619] = 74382
mask = 0110X10011110XX111X00000X0X0X00X0X00
mem[41006] = 2013
mem[12442] = 920
mem[4802] = 4069
mem[63407] = 29200
mem[383] = 31063618
mask = 0X1X01X011X1011111000X0X1XX011000010
mem[63120] = 457184
mem[58737] = 318
mem[5932] = 27437790
mem[63130] = 14901403
mem[21088] = 11453101
mem[4224] = 44650697
mask = 1X111X1011000101100000111100000000XX
mem[30612] = 231194489
mem[14292] = 381820395
mem[51679] = 3770
mem[28848] = 172440
mem[5123] = 2223
mem[50307] = 50412008
mask = 01XX0100111X0101X000X0XX011111000XX1
mem[12934] = 6379810
mem[35678] = 3966282
mem[44674] = 10698
mask = 001000111X101XX01X101000010X11XX00X0
mem[150] = 836348
mem[17812] = 1567355
mem[16990] = 36
mask = 10100X001101X10110X000011X0111000000
mem[28382] = 6079948
mem[44054] = 739
mem[65201] = 113868293
mem[30979] = 8134
mem[42593] = 183875466
mem[54476] = 51841
mem[44938] = 205
mask = 1110010011X011X1100X10111101X1100111
mem[269] = 967723800
mem[10218] = 806086
mem[38482] = 76541
mask = 1X101000X110000010001X000100X0100101
mem[6139] = 179872491
mem[55619] = 3084490
mem[33489] = 18805974
mem[33720] = 1867
mask = 1110XXX01110111XX0X00001010001XX0001
mem[29331] = 7426107
mem[55557] = 797
mem[37189] = 126043
mem[10723] = 62212
mask = 011011001111X101X1X00XX00X100100XX10
mem[49078] = 57265156
mem[4802] = 419563
mem[24177] = 98724
mem[3708] = 1220
mask = 010011001X1X01010X010X0X0X11X1X0010X
mem[1156] = 60829
mem[3611] = 426415170
mem[15875] = 82238
mem[19317] = 126875
mem[30390] = 534080975
mask = 1110010X1X111XXXX0000011001X01X00010
mem[8245] = 64067
mem[4032] = 685799
mem[29972] = 911
mask = X11001001110111110001XX110X1011X1111
mem[59763] = 809103
mem[38982] = 637
mem[15766] = 7064924
mem[26073] = 28058
mask = X11011X000111X01X000X001110111111000
mem[39395] = 2147538
mem[62638] = 60835
mem[24537] = 14051774
mem[7587] = 30880
mem[13737] = 6187454
mem[61247] = 438831
mask = 011XXX0XXX101101000100110X1111110X10
mem[61225] = 41364
mem[2422] = 6652
mem[58450] = 13746
mem[35824] = 368584
mem[61670] = 18722
mask = 11110100X110111010001X00010001XX1111
mem[45069] = 7637
mem[5972] = 207784
mem[36269] = 125923
mask = 11X00X00111111X1000100X011111000001X
mem[19194] = 14408
mem[36135] = 1777
mem[9159] = 2558642
mem[47430] = 21171007
mem[30390] = 695210
mask = 0X1011X0XX11100100X000010XXX1101X010
mem[23225] = 120954910
mem[7731] = 43441
mem[54420] = 17279925
mem[53308] = 319968
mem[32858] = 700
mem[12928] = 9385710
mask = X010010110X011X010XX0101110XX110111X
mem[2502] = 750120
mem[13231] = 187500162
mem[13380] = 7025
mem[23997] = 85647493
mem[44993] = 7645707
mem[13771] = 124630838
mem[46591] = 940782440
mask = 01X0010011100111XX0000111X0X10110X01
mem[1325] = 949
mem[19298] = 943
mem[15847] = 27961
mask = 1111010011X011X010001X01000X01XX0111
mem[269] = 39091531
mem[44813] = 1679
mem[31203] = 2018
mem[52498] = 65627195
mem[25913] = 10103182
mem[15766] = 10700
mask = 111X01001110111X10000X101110000000XX
mem[20675] = 20849753
mem[55619] = 3881752
mem[57180] = 4340
mask = 0X1000100X101111X0X00X11101110XX1101
mem[21902] = 1166
mem[2215] = 14172991
mem[2817] = 167
mem[45484] = 1582594
mem[30693] = 333999
mask = 1X100000111X11110X100010110111X0X011
mem[29331] = 912
mem[12131] = 1076046
mem[15553] = 2914438
mask = 1110X110110XX0101000100X1001010X0010
mem[47762] = 5648
mem[34576] = 18810
mem[32012] = 2838
mem[16803] = 31492679
mem[27243] = 531430088
mem[43281] = 446489
mask = 0100X10000110100X101X00001X111000X1X
mem[13396] = 201057
mem[58199] = 1070284468
mem[28492] = 776
mem[4690] = 3285
mem[38660] = 144569370
mem[56769] = 3508
mask = 111X1000X110XXX010000X0101X10110X101
mem[60825] = 10196
mem[7331] = 17103725
mem[25913] = 3665
mem[33720] = 12442
mem[56398] = 182436
mem[22551] = 39589992
mask = 11XX0100111111X0X0X0110100X101000000
mem[53178] = 460751
mem[12299] = 3953
mask = X0X0XX11111011X01XX010X000111X000110
mem[50148] = 19839478
mem[26332] = 145396
mem[37366] = 1281037
mem[205] = 41677975
mem[40745] = 249226
mem[33529] = 29488129
mem[15168] = 58169583
mask = 0X10110XX01111010XX00X000X1011100000
mem[25461] = 148
mem[36903] = 116668851
mem[45581] = 167220499
mem[5089] = 65669014
mask = 011X11X011111X0101100X00011011001000
mem[6869] = 166150610
mem[4810] = 9250505
mask = 101000111110111100X0X0X10X000010010X
mem[8103] = 53773
mem[2805] = 640192
mem[6481] = 17745
mask = XX10X10011100X11000100111X110X000XX1
mem[14014] = 445390635
mem[5763] = 32807150
mem[13798] = 32190
mem[23253] = 317
mem[53999] = 257358

19
14/part1 Executable file
View File

@ -0,0 +1,19 @@
#!/usr/bin/python3
import re
mem = []
with open("input") as fh:
for ln in fh:
if m := re.match(r"mask = ([01X]{36})", ln):
mask = m.group(1)
mask_and = int(mask.replace("1", "0").replace("X", "1"), base=2)
mask_or = int(mask.replace("X", "0"), base=2)
elif m:= re.match(r"mem\[(\d+)\] = (\d+)", ln):
i = int(m.group(1))
v = int(m.group(2))
while i >= len(mem):
mem.append(0)
mem[i] = (v & mask_and) | mask_or
else:
raise RuntimeError(ln)
print(sum(mem))

34
14/part2 Executable file
View File

@ -0,0 +1,34 @@
#!/usr/bin/python3
from pprint import pprint
import re
def all_values(v, mask_1, mask_float):
if mask_float:
t = mask_float
t |= t >> 1
t |= t >> 2
t |= t >> 4
t |= t >> 8
t |= t >> 16
t |= t >> 32
hi = t - (t >> 1)
return all_values(v | hi, mask_1, mask_float & ~hi) + all_values(v & ~hi, mask_1, mask_float & ~hi)
else:
return [v | mask_1]
mem = {}
with open("input") as fh:
for ln in fh:
if m := re.match(r"mask = ([01X]{36})", ln):
mask = m.group(1)
mask_1 = int(mask.replace("X", "0"), base=2)
mask_float = int(mask.replace("1", "0").replace("X", "1"), base=2)
elif m:= re.match(r"mem\[(\d+)\] = (\d+)", ln):
i = int(m.group(1))
v = int(m.group(2))
for i in all_values(i, mask_1, mask_float):
mem[i] = v
else:
raise RuntimeError(ln)
print(sum(mem.values()))