Day 14 part 1 solution

This commit is contained in:
Bill Thiede 2020-12-14 18:08:15 -08:00
parent 78063d8bf6
commit d0146e18d4
3 changed files with 711 additions and 0 deletions

577
2020/input/2020/day14.txt Normal file
View File

@ -0,0 +1,577 @@
mask = 00101X10011X0X111110010X010011X10101
mem[41248] = 4595332
mem[26450] = 60
mem[32210] = 982366
mem[1060] = 234632920
mem[20694] = 38159
mem[45046] = 58906955
mask = 010110010X1101XX11X0100001X0000X00X1
mem[16069] = 7758
mem[55864] = 2473265
mem[37095] = 103513009
mem[4911] = 1002
mem[63231] = 6932274
mem[21265] = 72322159
mem[43724] = 16591353
mask = 01001X01X101011101010101011X1X000000
mem[63470] = 30339812
mem[16920] = 471738
mem[1014] = 29735753
mem[61061] = 6866
mem[8437] = 9138168
mem[46487] = 1819945
mem[2985] = 15040783
mask = 0X10X1101111001X1X100X1X00011100XX11
mem[32836] = 12902
mem[60365] = 24782
mem[29953] = 10085
mem[18214] = 1160
mask = 001011X10X11100000100X0X0X0X01011001
mem[39434] = 37383633
mem[278] = 670174555
mem[34062] = 20749996
mem[2583] = 6222093
mask = 01X111X1001101X11110100XX001X1000XX1
mem[6075] = 49890
mem[9363] = 2392780
mem[24967] = 218861
mask = X110111X1XX1010101111X01XX1000X001X1
mem[41334] = 11836
mem[24242] = 7263066
mem[17289] = 64986060
mem[2583] = 4702503
mem[21650] = 103905
mem[134] = 486675
mask = 00X010100110XXXX111000XXX1000011000X
mem[45307] = 37940
mem[16597] = 224911
mem[17943] = 392744
mem[55001] = 622484
mem[35954] = 470
mask = 11X01011X11000X1X1100X100X011101X011
mem[1005] = 56755
mem[16146] = 4333571
mem[32347] = 10486693
mem[11452] = 377363
mem[25158] = 328161913
mem[51956] = 250388
mem[10044] = 34078606
mask = 011011X1X111010111110000X001X1X00110
mem[8773] = 10575925
mem[33116] = 175
mem[36101] = 14593
mask = 0100010X110X0101010XX10X011111XX1101
mem[21083] = 1922
mem[3653] = 912
mem[26768] = 7321934
mem[49134] = 17616
mem[62950] = 41565481
mem[12957] = 2136786
mem[10324] = 17788
mask = X11X0X0X11010101110X01111010X1100X11
mem[5462] = 18755
mem[39408] = 2435211
mem[49271] = 6589
mask = X1X011XX01X100010110001X0X0X111X1100
mem[52570] = 2166
mem[28731] = 16573421
mem[18265] = 1192
mem[22435] = 10856992
mem[19263] = 7550
mem[30541] = 434738
mem[36101] = 869138
mask = 010001X001010001XX010100000010110X01
mem[52893] = 125505223
mem[22919] = 597
mem[62950] = 54107
mem[52797] = 7649588
mem[30421] = 3968
mem[30429] = 614720
mask = 01X0X10001X100010X1011XX00000X111X00
mem[44718] = 11141064
mem[42713] = 206218234
mem[51781] = 527553473
mem[1967] = 27527823
mem[6386] = 5404
mask = 00101X10XX11X0XX1110001000001110X11X
mem[62339] = 72046594
mem[14657] = 3243652
mem[750] = 40239
mem[134] = 1936539
mem[5775] = 266384125
mask = 011X111XXX110X01X11X000X00010100011X
mem[2956] = 438895
mem[41520] = 7282
mem[42192] = 34769
mem[8837] = 2587
mask = 01XX11100101000X0X10011XX01010011101
mem[12515] = 450388
mem[62175] = 649233
mem[54743] = 129273
mem[10284] = 159823
mem[31311] = 16983
mem[56137] = 852771967
mask = 11010X1X01010101X1010X11101111X00010
mem[47190] = 526627409
mem[34299] = 540572
mem[61226] = 61426238
mem[12892] = 61446
mem[33421] = 4192
mask = 0110111111X10101111010100XX01XX10100
mem[41685] = 258
mem[26983] = 60795579
mem[28064] = 10483
mem[33070] = 66557269
mem[12624] = 448724
mem[38125] = 141175913
mask = 010X1X00X101000X0111010101XX01011000
mem[12957] = 7693971
mem[45285] = 4628
mem[48546] = 799
mem[17857] = 7578026
mask = 00101X100101X0010110000000XX1010X110
mem[41841] = 234511
mem[27387] = 2990
mem[24636] = 1269957
mem[15638] = 428392
mem[22064] = 272
mask = 0XXX10X01011X011111000000XX0X100X010
mem[26764] = 482715793
mem[8422] = 70439
mem[17857] = 28381730
mem[4524] = 750659820
mask = 11101100010100X1011000111000XX00X010
mem[52570] = 517468200
mem[25263] = 11113122
mem[33421] = 32762600
mask = 11101X01XX1000010X10111000X1101X0X00
mem[16577] = 910
mem[32450] = 16924479
mem[4421] = 24801362
mem[46638] = 8546454
mask = 01X11X1101110101X1X1X010000XX101X001
mem[34209] = 24703796
mem[30481] = 831
mem[46487] = 147322
mem[38619] = 11686
mem[26615] = 1174
mask = 010X0X00110100X1XX000010110XX100X001
mem[53587] = 198046
mem[38420] = 22334
mem[20181] = 962
mask = XX101101X01000010XX01111001111010100
mem[33812] = 107321
mem[8613] = 7395
mem[1117] = 149990
mem[22919] = 23596
mask = 1X01110110010X01X100000001111011X010
mem[57800] = 254591077
mem[6633] = 60308580
mem[8980] = 104196938
mem[5936] = 289911936
mem[44806] = 297364592
mask = 11X10XX0X1010X01010110XXX01111100X00
mem[49271] = 177794
mem[15368] = 259266583
mem[19327] = 590
mem[40243] = 24245
mem[57130] = 1201404
mem[22545] = 1831196
mem[59161] = 25210381
mask = 0X101X11111X010111100X110XX11000X10X
mem[38749] = 2091454
mem[45138] = 621877
mem[52107] = 3430339
mask = 0010X110X11X00101X100011XX111X000100
mem[17228] = 252642
mem[23892] = 13721
mem[43787] = 2786942
mem[55481] = 58875
mem[513] = 892
mem[62445] = 40312
mask = 0010X11XXX11001011X01010X0111110X100
mem[17415] = 7415167
mem[9048] = 46059
mem[2159] = 636711036
mask = X010111X111X010X1110X10100XX1000X00X
mem[38420] = 104527
mem[24790] = 85
mem[58634] = 127952377
mem[8958] = 11672057
mask = X01X111X00X110XX0X10000000000X0X0100
mem[283] = 241
mem[8898] = 36719
mem[49134] = 217820
mem[31884] = 419937
mask = 0XX11110X1110X0101111000000100110X00
mem[27694] = 6848
mem[25843] = 331711
mem[6688] = 581239
mem[41591] = 171
mask = 0100X100X1010X01010X001XX01XX1010101
mem[30429] = 1103121
mem[42192] = 7844667
mem[21668] = 51727200
mask = 001X1X10001X101XX1100X1000101100X010
mem[4322] = 157863993
mem[49962] = 9140
mem[16964] = 1599
mem[14443] = 2038
mem[3767] = 16636129
mem[13476] = 485497191
mem[1663] = 163345
mask = X101110111010101X1X10011001X10110000
mem[13172] = 195
mem[33921] = 5684133
mem[1337] = 51317
mask = X1XXX101110101X1010X0100XX111X101001
mem[63928] = 4636
mem[56436] = 3887978
mem[6185] = 3037
mem[7095] = 11521156
mem[1663] = 121401
mem[7218] = 20750
mask = 010001001X0101010X00001XXX100XX10100
mem[24149] = 309519
mem[16287] = 12731276
mem[29772] = 65227
mem[37172] = 2824
mem[17508] = 59271
mem[22133] = 3806
mask = 01X0X101011X000X0X101000100011111101
mem[14401] = 158547520
mem[37172] = 16841
mem[40439] = 461272566
mem[60909] = 478018315
mem[43219] = 2154608
mem[25369] = 46117
mem[54852] = 79656
mask = XX10111001X100X1X1100X1X0001110001X1
mem[4213] = 900609324
mem[19327] = 28071
mem[30421] = 782
mem[4804] = 17293
mask = 0100X1000101X0010X010101X01000011001
mem[18139] = 1546181
mem[14021] = 33793814
mem[46699] = 2014
mem[51956] = 171606030
mem[29702] = 475302805
mem[18265] = 198549
mask = 0101X0110X1X0101X1X1X01101001X001XX1
mem[38962] = 132592128
mem[9436] = 7464578
mem[12650] = 49333
mem[8837] = 3234578
mask = 011X11101011X101111000XX001110001110
mem[61694] = 1206
mem[32263] = 20761769
mem[2116] = 193628
mem[13505] = 123039
mem[62164] = 14323289
mask = 1X101010100X0101X1110X01000101X00100
mem[21385] = 1022949
mem[51318] = 5667643
mem[17420] = 36980027
mem[29202] = 801
mask = 0101X01XX11X0101X10110X1010001001001
mem[15338] = 23103863
mem[10488] = 4521
mem[13172] = 17055515
mask = X10111X11X01X111X100000000111011X111
mem[36577] = 397263
mem[8992] = 11944917
mem[22064] = 738796
mem[17310] = 1562710
mem[30068] = 4950154
mask = 011111X10111X10X010X00X1X100X0010001
mem[31166] = 6551
mem[62218] = 1528
mem[11467] = 35999360
mem[39578] = 11530695
mem[30855] = 27864
mem[18369] = 1610323
mem[58953] = 12938251
mask = 01X111010X1111X0010X0XX010000X000111
mem[15411] = 1096
mem[49541] = 3181
mem[23568] = 276408
mem[45168] = 1721
mem[11394] = 155136
mask = 1111X1X011010001X101010X100XX11001X1
mem[61945] = 26647548
mem[63262] = 110741
mem[33783] = 158
mem[12753] = 200460
mem[43229] = 7579
mem[37084] = 26507
mask = 0100110011X10101010X00X01X11X1X10101
mem[65089] = 636807464
mem[5775] = 4440830
mem[52107] = 69328099
mem[38420] = 859060126
mem[21272] = 1700
mem[12062] = 176162
mem[12094] = 8733
mask = X100010111XX01X1X1010100X01101001X1X
mem[44718] = 33650499
mem[26507] = 165784650
mem[12622] = 2023
mem[5651] = 120398699
mask = 110001011X010X0111X10X00011110001X00
mem[44975] = 666498
mem[11614] = 751
mem[61354] = 5063
mem[4396] = 1131
mem[25418] = 882
mem[49245] = 64151
mask = 011X1X110111X1XX11X1100X01000X101001
mem[59013] = 1141214
mem[18016] = 95668408
mem[30067] = 18132964
mem[38900] = 286972459
mem[42265] = 13529062
mem[59369] = 6028326
mask = 0110110X010100010XXX0X00X0011X101X1X
mem[6479] = 8816055
mem[28451] = 29446
mem[61417] = 59156
mem[6694] = 15597
mem[29264] = 115437
mask = 11110100110101011101XX0001X1X1110101
mem[46886] = 114630
mem[17383] = 452299
mask = 010X110X11X10101000X001X011010000100
mem[19215] = 487176198
mem[59629] = 2120284
mem[27009] = 3064
mem[42335] = 22072
mem[514] = 2010
mask = 0100X1001101010X010000X0001000X00100
mem[37232] = 2564
mem[20561] = 29506163
mem[27396] = 380700410
mem[34075] = 868
mem[24967] = 1882926
mask = 010X1X01XX110111111X0XX0000X010X0101
mem[61084] = 3068852
mem[33028] = 188720342
mem[17375] = 62850
mask = X10X1X0X110101010X01001001101000X000
mem[24149] = 1815
mem[51489] = 197928369
mem[27694] = 231814
mem[11813] = 1002177793
mem[526] = 104755102
mem[22216] = 8396
mask = 0110111101010001X1X0X11100X010001111
mem[21083] = 2509191
mem[13215] = 172339241
mem[12386] = 106305632
mask = X1X101X11101010101000X010X11101101X1
mem[35709] = 64980388
mem[51838] = 62510
mem[48641] = 1174272
mem[42157] = 149
mask = 0X101100010100010X0X00X1100101111111
mem[35807] = 1100541
mem[10044] = 69616152
mem[3047] = 142725213
mask = 11101X1X10X101010111X001XX10X0X00100
mem[38049] = 110
mem[43097] = 14955394
mem[61810] = 3545867
mem[61238] = 5370
mem[20585] = 191903
mem[26133] = 24248
mask = 010X110X011X00010110010100X0XXX1X011
mem[15950] = 140910
mem[12062] = 424527462
mem[11876] = 236
mem[5182] = 4776
mem[50278] = 490
mask = 010XX011011101X1110101110111110110X0
mem[53736] = 2314
mem[12633] = 5053
mem[66] = 49557761
mask = 01X01101X10101010101000X00111110100X
mem[18849] = 911
mem[20666] = 12891678
mem[5609] = 10432
mem[59720] = 22145720
mem[17508] = 42631
mem[8585] = 3448
mask = 11X1X10X110101X101010X01X0011011X001
mem[30601] = 9140827
mem[30361] = 4166366
mem[46057] = 16057
mem[26983] = 251682577
mem[63197] = 1603252
mem[52893] = 462048575
mask = 011011100111X00X11100X00100010001XXX
mem[17534] = 25807901
mem[4932] = 106350673
mem[42192] = 735653575
mem[10874] = 59007
mask = 01000101110001X1XX001000001X1X011111
mem[48049] = 386
mem[1538] = 138451275
mem[50333] = 15707
mask = 0101100X01110111XX1X0000001011001X01
mem[18139] = 102960
mem[41277] = 5837
mem[44484] = 29937
mask = 11101XX10X1X0001011000100X010010X00X
mem[30615] = 95201946
mem[719] = 3697022
mem[27391] = 150969140
mem[62680] = 427952
mem[7349] = 46922
mem[17375] = 41348888
mem[57800] = 1901
mask = 0010X11X1X11X011111X0011001X01001111
mem[46994] = 118757653
mem[32947] = 23571
mem[8653] = 1364
mem[3767] = 6954112
mask = 01001X0011010X000111X0X0X1X011011XXX
mem[37908] = 88438829
mem[20630] = 618075182
mem[21520] = 101250753
mem[10703] = 475904
mask = 001001101XX10010111X1X10100111XX11X1
mem[17310] = 2889476
mem[2725] = 463419
mem[65001] = 910330085
mask = X1011011X111010101X110X1X1X0010110X0
mem[15999] = 18586203
mem[12825] = 51333145
mem[29966] = 596120517
mem[26866] = 141039
mem[24223] = 415414
mem[24403] = 16110598
mask = 0XX00X01111X01110X011010101X01101010
mem[43382] = 150995
mem[28011] = 1021785
mem[60339] = 7805893
mem[37197] = 268431
mem[17792] = 253366088
mem[21437] = 24057926
mask = XX1011X111100X00111X1100010111010011
mem[18006] = 265940517
mem[55921] = 1634
mem[27656] = 17058
mem[4911] = 3686
mem[33243] = 8125794
mem[47537] = 146165365
mask = 110111011X01X1X10100X000010110111X0X
mem[5775] = 176470
mem[63017] = 24003454
mask = 00011X001X11XX11111X01101010X0000010
mem[1604] = 174349
mem[42888] = 7159712
mem[26615] = 1487
mask = 01X11101100111111X000X1001110001011X
mem[5344] = 8563500
mem[21234] = 166162105
mem[48935] = 10849963
mask = 01000101XX0001111000XX0000X010010X00
mem[24149] = 127627213
mem[27338] = 43164114
mem[47215] = 252815
mem[47431] = 32732410
mask = 01011100000100011X0X0XX101X111111100
mem[13412] = 4193068
mem[45046] = 148
mem[63535] = 11659
mem[6518] = 471308933
mask = 111X111011X1X1X101111X000100001101X1
mem[31114] = 118512878
mem[41334] = 1604
mem[7338] = 571
mem[6001] = 4126415
mem[5215] = 4392
mem[47836] = 1862
mem[22064] = 30804845
mask = 0111010X11X1010X0101X1110011101X0111
mem[13321] = 22426593
mem[37095] = 5357
mem[44281] = 467020
mem[62680] = 2721559
mask = 010001X0010100XX10010000011000101X00
mem[30615] = 261491
mem[31097] = 46202501
mem[27880] = 6002395
mem[51385] = 2780
mem[51435] = 43181943
mem[42192] = 107728750
mask = 101011100X1100110X1X00X0101X10X11101
mem[48366] = 859523
mem[14111] = 859
mem[21668] = 292390073
mem[8073] = 858
mem[12920] = 662378
mask = X111X10011X10101X10101XX01111011X101
mem[20630] = 4051571
mem[55963] = 367
mem[379] = 10962356
mem[33028] = 37
mem[24035] = 9459
mem[50949] = 2030
mask = 001011100X110X111X10101100011X010X11
mem[8437] = 47226
mem[41248] = 319
mem[9624] = 3503
mem[6875] = 5282
mask = 11X111XX100101010100X01XX1X1001X1000
mem[21292] = 1673693
mem[51132] = 10346473
mem[7504] = 4325
mask = 111X010X1101011101X100010XX1X0111100
mem[35415] = 6296
mem[19215] = 1263591
mem[49977] = 379136185
mem[62950] = 28156510
mem[8265] = 28662942
mask = 01X110X01X1X0X11X1X00110000X01000100
mem[54672] = 131784041
mem[11394] = 24602
mem[24646] = 10584
mem[44349] = 4883
mem[54743] = 2940969
mem[8265] = 14841530
mask = 0X10111X11100X0011X011XX00X011011010
mem[49374] = 45910
mem[25923] = 368017518
mem[25114] = 8076340
mem[62690] = 904875563
mask = 010X11X0X1X1010X01010X01101001110101
mem[39408] = 3080
mem[6918] = 125955053
mem[27880] = 29186
mask = 01001101X101010X0101X1001111100010X1
mem[11813] = 153838914
mem[20585] = 1917
mem[21385] = 1881773
mem[8556] = 25758757
mem[22435] = 802061
mem[27631] = 13285866
mask = 01101110111X0001011X10100X0100X10101
mem[23441] = 186656612
mem[2186] = 189388742
mem[12866] = 874882
mem[12947] = 23895
mem[20630] = 77211
mem[42083] = 63015239
mem[51838] = 4984972
mask = 00101110X111001X1X10001XX0X111XXX101
mem[14789] = 244532376
mem[21292] = 736136092
mem[10874] = 513949
mem[16755] = 12361
mem[5416] = 22987
mem[39578] = 106587
mask = 010X11000X010001X1XXX0110011X1X1110X
mem[43479] = 61
mem[47199] = 15617564
mem[18265] = 6027808

133
2020/src/day14.rs Normal file
View File

@ -0,0 +1,133 @@
//! --- Day 14: Docking Data ---
//! As your ferry approaches the sea port, the captain asks for your help again. The computer system that runs this port isn't compatible with the docking program on the ferry, so the docking parameters aren't being correctly initialized in the docking program's memory.
//!
//! After a brief inspection, you discover that the sea port's computer system uses a strange bitmask system in its initialization program. Although you don't have the correct decoder chip handy, you can emulate it in software!
//!
//! The initialization program (your puzzle input) can either update the bitmask or write a value to memory. Values and memory addresses are both 36-bit unsigned integers. For example, ignoring bitmasks for a moment, a line like mem[8] = 11 would write the value 11 to memory address 8.
//!
//! The bitmask is always given as a string of 36 bits, written with the most significant bit (representing 2^35) on the left and the least significant bit (2^0, that is, the 1s bit) on the right. The current bitmask is applied to values immediately before they are written to memory: a 0 or 1 overwrites the corresponding bit in the value, while an X leaves the bit in the value unchanged.
//!
//! For example, consider the following program:
//!
//! mask = XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X
//! mem[8] = 11
//! mem[7] = 101
//! mem[8] = 0
//! This program starts by specifying a bitmask (mask = ....). The mask it specifies will overwrite two bits in every written value: the 2s bit is overwritten with 0, and the 64s bit is overwritten with 1.
//!
//! The program then attempts to write the value 11 to memory address 8. By expanding everything out to individual bits, the mask is applied as follows:
//!
//! value: 000000000000000000000000000000001011 (decimal 11)
//! mask: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X
//! result: 000000000000000000000000000001001001 (decimal 73)
//! So, because of the mask, the value 73 is written to memory address 8 instead. Then, the program tries to write 101 to address 7:
//!
//! value: 000000000000000000000000000001100101 (decimal 101)
//! mask: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X
//! result: 000000000000000000000000000001100101 (decimal 101)
//! This time, the mask has no effect, as the bits it overwrote were already the values the mask tried to set. Finally, the program tries to write 0 to address 8:
//!
//! value: 000000000000000000000000000000000000 (decimal 0)
//! mask: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X
//! result: 000000000000000000000000000001000000 (decimal 64)
//! 64 is written to address 8 instead, overwriting the value that was there previously.
//!
//! To initialize your ferry's docking program, you need the sum of all values left in memory after the initialization program completes. (The entire 36-bit address space begins initialized to the value 0 at every address.) In the above example, only two values in memory are not zero - 101 (at address 7) and 64 (at address 8) - producing a sum of 165.
//!
//! Execute the initialization program. What is the sum of all values left in memory after it completes?
use std::collections::HashMap;
use std::str::FromStr;
use aoc_runner_derive::aoc;
#[derive(Default, Debug)]
struct Mask {
mask: usize,
value: usize,
}
impl FromStr for Mask {
type Err = ();
fn from_str(s: &str) -> Result<Mask, ()> {
let mut mask = 0;
let mut value = 0;
s.bytes().for_each(|v| match v {
b'X' => {
mask <<= 1;
mask |= 1;
value <<= 1;
}
b'1' => {
mask <<= 1;
value <<= 1;
value |= 1;
}
b'0' => {
mask <<= 1;
value <<= 1;
}
c => panic!(format!("Unhandled mask character '{}'", c)),
});
Ok(Mask { mask, value })
}
}
impl Mask {
fn apply(&self, v: usize) -> usize {
v & self.mask | self.value
}
}
#[derive(Debug, Eq, PartialEq)]
struct Address(usize);
impl FromStr for Address {
type Err = ();
fn from_str(s: &str) -> Result<Address, ()> {
Ok(Address(
s.strip_prefix("mem[")
.ok_or(())?
.strip_suffix("]")
.ok_or(())?
.parse()
.map_err(|_| ())?,
))
}
}
#[aoc(day14, part1)]
fn solution1(input: &str) -> usize {
let mut mem: HashMap<usize, usize> = HashMap::new();
let mut mask = Mask::default();
input.split('\n').for_each(|l| {
let (cmd, arg) = l.split_at(l.find(" = ").expect("Couldn't find space wrapped ="));
let arg = &arg[3..];
match cmd {
"mask" => mask = arg.parse().expect("Couldn't parse mask"),
_ => {
let addr: Address = cmd.parse().expect("Couldn't parse address");
let val = mask.apply(arg.parse().expect("Couldn't pass arg"));
mem.insert(addr.0, val);
}
};
});
mem.values().fold(0, |acc, v| acc + v)
}
#[cfg(test)]
mod tests {
use super::*;
const INPUT: &'static str = r#"mask = XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X
mem[8] = 11
mem[7] = 101
mem[8] = 0"#;
#[test]
fn test_solution1() {
assert_eq!(solution1(INPUT), 165);
}
}

View File

@ -3,6 +3,7 @@ pub mod day10;
pub mod day11;
pub mod day12;
pub mod day13;
pub mod day14;
pub mod day2;
pub mod day3;
pub mod day4;