diff --git a/14input.txt b/14input.txt
new file mode 100644
index 0000000..8ef0a4b
--- /dev/null
+++ b/14input.txt
@@ -0,0 +1,580 @@
+mask = 1X000X0101XX101101X01X101X1000111X00
+mem[10004] = 3787163
+mem[18866] = 665403
+mem[13466] = 175657346
+mem[21836] = 99681152
+mask = 110X1001110110X10100010X0000X010X11X
+mem[14957] = 51287
+mem[47879] = 1706397
+mem[60036] = 139731
+mask = 0100X011110X11111100000010X1XXX1X100
+mem[13312] = 473519
+mem[45712] = 11576
+mem[65077] = 499111
+mem[20582] = 970
+mem[57647] = 30626762
+mem[5265] = 14655010
+mask = 11X010010X010011X110X00X1XX0001101X1
+mem[45904] = 324397
+mem[33792] = 56494291
+mem[35775] = 597
+mem[58036] = 267391350
+mem[10448] = 77300
+mem[49376] = 12095094
+mask = XX000001100001100X0X10000X010X111110
+mem[17484] = 382723
+mem[58181] = 58
+mem[51203] = 253
+mem[36984] = 552006
+mask = 110XXX010X011X100X00110X101010110000
+mem[46734] = 272208
+mem[50532] = 1071505732
+mem[42057] = 18023379
+mem[40723] = 203396667
+mem[60376] = 24255
+mask = 1110X001010010110X00XX0110X1X00000X0
+mem[6373] = 509708
+mem[12417] = 1586323
+mem[35427] = 457
+mem[14175] = 2420631
+mem[28822] = 749
+mem[52248] = 12324270
+mask = X1X000111X0100100X00XX10X00011X1X000
+mem[26803] = 500540
+mem[7065] = 8843071
+mem[55118] = 40141309
+mem[2804] = 3136584
+mask = 110X1X0001XX100101001110XX0010X100X0
+mem[19256] = 7428
+mem[13879] = 1353915
+mem[43372] = 5882
+mem[6447] = 4535
+mask = 100X11X01001XX01110X001001000X010X10
+mem[55173] = 21377
+mem[12745] = 125083
+mem[311] = 602879
+mem[39306] = 2711255
+mask = 1X10X001100010110100101100110X0X0111
+mem[65528] = 672476373
+mem[40933] = 15862
+mem[20739] = 128727771
+mem[30419] = 29600646
+mem[26253] = 3206153
+mask = 1XX00X011101X01101X0X001110X1XX10100
+mem[59482] = 66620
+mem[41885] = 399931609
+mem[22336] = 62900
+mem[8106] = 1106171
+mem[5796] = 37170431
+mem[17413] = 15524
+mem[15447] = 28761
+mask = 11000001X10X00110XX1100000011011X100
+mem[43397] = 16642
+mem[24122] = 173985292
+mem[10901] = 6397292
+mem[7385] = 7495847
+mask = X1000001X00010110100X0010000111X0100
+mem[38664] = 43195
+mem[17708] = 56326435
+mem[47879] = 3654030
+mem[26738] = 6346961
+mem[22210] = 118801717
+mem[56703] = 13588355
+mem[65252] = 262312
+mask = 1X0XXX000100X0X101001100001X101X1X00
+mem[62976] = 82374293
+mem[64638] = 14434
+mem[43964] = 13761
+mask = 01000001X00110110X00XX00X10010X10X11
+mem[4724] = 2903
+mem[5158] = 164937
+mem[35328] = 30334
+mem[46966] = 2759991
+mem[52761] = 25675
+mask = X1101000XX1X00X10100001011X01101XXX1
+mem[4392] = 118555033
+mem[23892] = 4622396
+mem[65088] = 1887562
+mem[13476] = 226944
+mask = 11X0X001X1X1001101101X0X110X000X01X0
+mem[311] = 290524064
+mem[54164] = 1109593
+mask = 100X100001000X0101000X010XX11011110X
+mem[62632] = 2370
+mem[52805] = 3829934
+mem[40012] = 9175340
+mem[37847] = 117719078
+mask = X110000X010000X10100001X1011010X0X00
+mem[37404] = 3551660
+mem[15104] = 527114796
+mem[49376] = 968
+mem[56095] = 316752
+mem[6747] = 1807
+mask = 11000X010101101X01000X001X011XXX10X0
+mem[41840] = 2775
+mem[60125] = 182425209
+mask = 10011000010XX011X100101010XX1X1X0100
+mem[6747] = 4044
+mem[16920] = 114852
+mem[4128] = 41260
+mask = X10000X11001X01X010000X000XX10X0X111
+mem[14175] = 16258730
+mem[41484] = 2757
+mem[37593] = 33406295
+mem[8317] = 415217155
+mem[51008] = 2636
+mem[21446] = 259080582
+mem[15515] = 2734
+mask = 11X0X001X10X100X01000110101X101X00X0
+mem[61143] = 129
+mem[23860] = 247
+mem[47879] = 22784315
+mask = 01000011110X111XX1000XX0110100X10X0X
+mem[2435] = 1973
+mem[23908] = 133875113
+mem[12460] = 103067
+mem[6211] = 1359103
+mem[7534] = 23782
+mask = 111000010100X0X10100001010X1XX000XXX
+mem[53221] = 4273517
+mem[13255] = 3334
+mem[31239] = 113778111
+mem[32900] = 6938492
+mask = 1110XX010110X1XX011011000111100X1101
+mem[9359] = 8377654
+mem[52805] = 3549344
+mask = 0X1000X01100X1XXX00X0011001010000101
+mem[28303] = 227915
+mem[257] = 1876777
+mem[63555] = 192083072
+mem[56391] = 147544840
+mem[63072] = 6915
+mask = XX0000111X011111010X0001100000010110
+mem[10311] = 16038309
+mem[41484] = 30818
+mem[54410] = 3229
+mem[2435] = 10793289
+mem[26631] = 87736025
+mem[13639] = 7253
+mask = 0100101XX1X01111X1XXX0001100010101X0
+mem[2028] = 6656580
+mem[29799] = 2772
+mem[64020] = 958010
+mem[5974] = 569
+mem[8667] = 2023725
+mem[16595] = 25313923
+mem[35402] = 558
+mask = 1X0X00001X01100X1X0000010100001111X1
+mem[41459] = 12342565
+mem[23672] = 36167
+mem[10300] = 65046557
+mem[56503] = 62989647
+mem[37993] = 217162
+mask = 1111101100000X01X1011X111111X1100X10
+mem[21085] = 15851
+mem[25194] = 6075854
+mem[42984] = 435548
+mem[8346] = 978945
+mem[5661] = 4981
+mask = 0X0000011X0X0010010X1XXXX01010001X01
+mem[27985] = 234997
+mem[14463] = 45760
+mem[15023] = 17580
+mask = 110000110X01X00101X01X1X10001101X000
+mem[63245] = 6018482
+mem[30940] = 257367431
+mem[10617] = 1134348
+mem[57343] = 284899785
+mem[21373] = 1004097
+mask = 1100100XX10X00111X101001X10100101101
+mem[54836] = 45353796
+mem[43493] = 1827049
+mem[790] = 48270178
+mem[42104] = 67747
+mem[33977] = 222196
+mem[56552] = 21306885
+mem[63222] = 64849326
+mask = XXX00101011110110100010010111000X01X
+mem[33756] = 4616
+mem[44216] = 6220360
+mem[25526] = 811292762
+mem[59209] = 6509
+mem[13255] = 2140854
+mask = 1110000110X0X11X0100000110100X010110
+mem[7764] = 3574
+mem[872] = 16596
+mem[5555] = 763
+mem[59969] = 25416012
+mask = 0X000001100X0010010X1X1110X0X0101010
+mem[64638] = 2350
+mem[36949] = 3170
+mem[41641] = 2041278
+mask = 11101001X1X01X0X01X01000101110000101
+mem[63222] = 998162428
+mem[36105] = 58286575
+mem[36644] = 6605534
+mem[64290] = 352783
+mem[52428] = 72931
+mem[1450] = 460492
+mask = 00X0000111X10XX00101111XX00001XX001X
+mem[47375] = 1428142
+mem[12574] = 262115
+mem[1393] = 215199811
+mem[2729] = 53399
+mem[1417] = 163417802
+mem[13888] = 30705
+mem[52121] = 629932866
+mask = 1X00010X01X01X01010X10111X1100101000
+mem[63515] = 22411
+mem[23091] = 909249
+mem[21738] = 438843570
+mem[44851] = 181
+mem[10095] = 4014
+mask = 010X0X11100X1X100100000101000111011X
+mem[19759] = 29570
+mem[2970] = 191037
+mem[9604] = 4079
+mem[657] = 465
+mask = 1X000X01X1X10011010X1XX11100X0111100
+mem[43949] = 478212819
+mem[5597] = 63092
+mem[58361] = 5457568
+mem[41459] = 187363
+mask = XX1X0011X100011X00101X11000XX101100X
+mem[13888] = 638337993
+mem[37934] = 4985
+mem[55575] = 76330
+mem[10257] = 3056
+mem[9744] = 4917501
+mem[32361] = 63127
+mask = 11X00011X001001X010001000010011X0X0X
+mem[43761] = 6764398
+mem[24646] = 30592
+mem[36456] = 799
+mem[42057] = 1771
+mem[35165] = 2871
+mask = 110000010X01X00101X01XX01X1001X00100
+mem[30294] = 30942244
+mem[34398] = 1382102
+mem[63222] = 260411654
+mem[39566] = 133753617
+mem[4818] = 4462832
+mem[36866] = 52
+mem[14603] = 244236
+mask = 1100010XX101101X01XX111X0001X1111110
+mem[33984] = 490757
+mem[29144] = 42516
+mem[12171] = 11800
+mem[35282] = 19533
+mem[30399] = 14796
+mem[19650] = 158686001
+mem[6447] = 177
+mask = X100001X1001X011X10001000110111001X0
+mem[62632] = 98281297
+mem[57359] = 3527162
+mem[12082] = 171252979
+mask = 11000011110100XX0X000001X11000100000
+mem[35211] = 130598799
+mem[28482] = 85586
+mem[55217] = 240324
+mem[6740] = 92413135
+mem[1291] = 79746542
+mask = 1000010XX101101101X000101X0010010110
+mem[45328] = 3595262
+mem[3490] = 877
+mem[36826] = 11235
+mem[110] = 1713
+mem[7313] = 13261628
+mem[17524] = 263660940
+mem[40227] = 14071730
+mask = 1101110X00011X10000001011110X10X0100
+mem[26215] = 3075603
+mem[2028] = 2167
+mem[36320] = 586
+mem[8270] = 71526
+mem[44216] = 5252007
+mask = 1110100100010011111X00X0X000X0000111
+mem[50149] = 58998983
+mem[47879] = 1944464
+mem[19922] = 3875
+mem[42517] = 43875909
+mem[18735] = 7318682
+mem[26678] = 17877212
+mask = 0100001101X1X10101001011011X0X000100
+mem[56402] = 14747004
+mem[29737] = 15131100
+mem[15515] = 2942003
+mask = 110000X10XX110X10110111110XX01000110
+mem[54032] = 100009547
+mem[15057] = 5910646
+mem[62982] = 135495807
+mem[41840] = 44565248
+mem[43139] = 14110
+mem[37411] = 434104731
+mask = 1100000XX10110X101000XX11010XX100100
+mem[29795] = 954605601
+mem[13364] = 402011
+mem[22468] = 778482653
+mem[46818] = 25125
+mem[5527] = 101
+mem[9814] = 306208600
+mem[43397] = 239110
+mask = X1X00011X10100X10100111010X110X00X00
+mem[43405] = 4234874
+mem[49758] = 5465414
+mem[20027] = 12031953
+mem[52428] = 2873
+mem[23261] = 117091570
+mem[54960] = 1624
+mem[1039] = 22719
+mask = X1101001011X110001X011110101011X0011
+mem[14463] = 92010258
+mem[61143] = 11340
+mem[1450] = 15947
+mask = X10000X1X1010011X10000X01011X0X1010X
+mem[45367] = 1060810121
+mem[26527] = 23928
+mem[15407] = 30081582
+mem[8768] = 7626
+mask = 100X1X001001000111000011X001XX0X1X1X
+mem[57779] = 1222
+mem[60458] = 507523
+mem[9438] = 2655
+mem[11306] = 32130962
+mem[13120] = 212870
+mem[18699] = 32470
+mask = 11X0XXX0110100X101000100100000100111
+mem[50532] = 6760
+mem[65458] = 1921851
+mem[50231] = 1055316713
+mem[11611] = 82996
+mem[32408] = 1879545
+mem[56334] = 6421
+mem[19546] = 1572
+mask = 0101101101011001X0001X111X1100010X00
+mem[11808] = 39158
+mem[13364] = 3686
+mem[58181] = 3954
+mask = 11X000110X0100110100X1XXX010011001X0
+mem[18996] = 10869875
+mem[9359] = 11905624
+mem[10037] = 675
+mem[63666] = 1335625
+mask = 10011000100X000111000XX000010000X110
+mem[30987] = 168211
+mem[2059] = 19013
+mem[36287] = 21065
+mem[55613] = 24671374
+mask = 01110X11000X0XX101100111111101X11010
+mem[27985] = 1661941
+mem[33107] = 921718
+mem[23617] = 16368
+mem[41120] = 74
+mask = 11000001100X1X11010000X001X0X1X101X0
+mem[39739] = 63291061
+mem[52804] = 15173
+mem[14981] = 648
+mem[65088] = 1644
+mem[47873] = 43267217
+mask = 11X000XX100X11110XX01X001X0001010000
+mem[39631] = 19215077
+mem[17524] = 513536515
+mem[49990] = 109517
+mask = X000X000100X0001110000X1010011010001
+mem[13466] = 124984033
+mem[12574] = 260829
+mem[1403] = 115889305
+mask = 0110XX1X11010X10000X00XX01X01011001X
+mem[37593] = 173042
+mem[49988] = 200423
+mem[52823] = 7747994
+mem[2391] = 611579
+mask = X01XX00X11X100100X011111010011000010
+mem[50986] = 277302
+mem[48505] = 2276386
+mem[28286] = 12419937
+mem[35832] = 7585
+mem[44379] = 340032079
+mask = X1X0X011000111110X000001111000100100
+mem[26228] = 1347384
+mem[46316] = 35047
+mem[50294] = 7049
+mem[31571] = 5511
+mem[6747] = 2881667
+mem[55522] = 239714
+mask = X11XX0100101X110001001100010X1X01X00
+mem[63523] = 3173
+mem[15717] = 1059
+mem[1039] = 1756
+mem[652] = 74372
+mem[52561] = 1253065
+mem[34744] = 12
+mem[36103] = 67545913
+mask = X11X001X0X0X00110100010X0101X101X100
+mem[43915] = 2312924
+mem[625] = 52614
+mem[16137] = 3337
+mem[33395] = 56449350
+mem[57004] = 9401213
+mem[22475] = 273016261
+mask = 11X000X1100X1X110100X10000XX0X000111
+mem[17020] = 461488870
+mem[64339] = 76903
+mem[12489] = 1867
+mem[40021] = 416088
+mem[45893] = 941080
+mask = 010XX0110X0X1XX10X000111101000X101X0
+mem[1347] = 27142438
+mem[56404] = 28056
+mem[15515] = 13463506
+mem[34610] = 408788
+mem[23768] = 4390
+mask = 0X0X000X10000X100X000001X0X00X11111X
+mem[34140] = 2486
+mem[45229] = 219957
+mask = 1X010X0X11X1100X01000001010100110000
+mem[63207] = 214605819
+mem[3120] = 975024
+mask = X100000100011XXX00000000110010X0X010
+mem[36039] = 1351
+mem[24280] = 1529
+mem[54240] = 438022
+mem[49990] = 7079087
+mem[21713] = 14792683
+mem[52177] = 1961
+mem[7345] = 406699254
+mask = 1X00010X01X010110X001110100X00101100
+mem[27536] = 12551
+mem[7678] = 10576
+mem[17936] = 1475
+mem[9814] = 99131792
+mem[41885] = 96156
+mem[13120] = 35225
+mask = X111X011000X00X101XX01X10111X1X11010
+mem[60152] = 82433112
+mem[22477] = 4090530
+mem[16768] = 58352433
+mem[7764] = 192408366
+mem[51535] = 69751
+mem[850] = 131
+mem[48467] = 377832323
+mask = 0100001110010010X10X1X111101001100X1
+mem[23672] = 1931
+mem[6708] = 469
+mem[16775] = 2368
+mem[12502] = 115896934
+mask = 100X0000X00XX0011100X01X010111X11011
+mem[24733] = 936
+mem[269] = 362232
+mem[60475] = 322199998
+mem[14404] = 1261
+mem[42303] = 27351706
+mem[13699] = 34315
+mask = 0111101100X10X11010X010X0101X00X10X0
+mem[11893] = 62548
+mem[57647] = 237349
+mem[21200] = 14649
+mem[27128] = 80169
+mem[32969] = 725133
+mem[31032] = 131322
+mask = 0100XX01100X1010010000000X01X0110110
+mem[18930] = 68333625
+mem[6819] = 341
+mem[26253] = 220435
+mem[15909] = 79688
+mem[21059] = 2671693
+mask = X11XX00X11XX001101X00XX0110000100111
+mem[34832] = 248
+mem[11532] = 708205
+mem[654] = 7796300
+mem[46941] = 94124
+mem[49206] = 109
+mem[31987] = 1877
+mask = 11000X01X1001X0X01X011X00000X0000101
+mem[60475] = 67279
+mem[14929] = 3073
+mem[38463] = 6762244
+mem[47778] = 173399092
+mem[62317] = 57461236
+mask = 110XX000110X1001X100000001000X110000
+mem[15407] = 249
+mem[7202] = 55714
+mem[48800] = 25528109
+mem[20959] = 4106091
+mem[6496] = 1976005
+mem[6708] = 3013607
+mask = 110000011XX1X011X1001101010XXX010X10
+mem[64787] = 469608465
+mem[41416] = 59853
+mem[10680] = 16299
+mem[19394] = 56413
+mem[39572] = 25343
+mem[19686] = 277550
+mask = 01X0001X1100001X00101110111X1001X000
+mem[4228] = 590408603
+mem[62269] = 394
+mem[60694] = 483056
+mem[25301] = 664548494
+mask = 110X00001101100101000101X1X1X00100X1
+mem[29136] = 3854559
+mem[24118] = 486135
+mem[34398] = 430609446
+mem[12782] = 3721785
+mask = 110001001101X0X10100110000X0010100X0
+mem[5661] = 13272
+mem[2012] = 38954
+mem[60732] = 7014
+mask = 0100X0X1X00100100100100111111001100X
+mem[49716] = 284158681
+mem[12224] = 10628127
+mem[32900] = 7796903
+mask = 0110001XX10X0X1000X0011X00X0110X00X0
+mem[8844] = 26023958
+mem[65175] = 81386046
+mem[54410] = 4119058
+mask = X10000X1XX01X01X0100000X1X0001010100
+mem[62976] = 29914819
+mem[7792] = 49702987
+mem[61389] = 124692445
+mem[10004] = 29696422
+mem[61943] = 43748477
+mem[61040] = 199512596
+mask = 0X00XX11110X10X1010101010X0011X00X1X
+mem[10880] = 91763
+mem[93] = 46698
+mask = X100XX111X01001101000X00101000000000
+mem[30458] = 4474263
+mem[2932] = 25975
+mem[25986] = 106060
+mem[20974] = 20857
+mem[23672] = 853256
+mask = 11000011010XX01101X000XX10111001X11X
+mem[39572] = 24316000
+mem[14981] = 41633461
+mem[41885] = 3807449
+mem[49990] = 31780591
+mem[2414] = 5032671
+mask = 111010XXX110X1010110100001111010X101
+mem[26803] = 474
+mem[15407] = 33070532
+mem[35211] = 24880155
+mem[52428] = 396521
+mem[9814] = 252376513
+mask = 01000011XX011011X10XX000X11010000010
+mem[20974] = 101
+mem[13535] = 632
+mem[12489] = 58930152
+mem[61506] = 681
+mem[18309] = 8028011
+mem[33984] = 7404765
+mask = 1100X01X01X1101101100011100X01000111
+mem[15864] = 413
+mem[15023] = 7825
+mem[60154] = 451000
+mem[53862] = 240968
+mem[63761] = 5500
+mem[8136] = 5727
+mask = 01000X1XX101001111X00000101X110X0X00
+mem[884] = 1258
+mem[12502] = 150248279
+mem[63] = 1403008
\ No newline at end of file
diff --git a/2020.csproj b/2020.csproj
index 99f0fef..a2edf80 100644
--- a/2020.csproj
+++ b/2020.csproj
@@ -50,6 +50,9 @@
PreserveNewest
+
+ PreserveNewest
+
diff --git a/Program.cs b/Program.cs
index 6394332..5a0ab1a 100644
--- a/Program.cs
+++ b/Program.cs
@@ -18,6 +18,7 @@
Q11.Go();
Q12.Go();
Q13.Go();
+ Q14.Go();
Util.Log($"Total time={(System.DateTime.Now - start).TotalMilliseconds}ms");
}
}
diff --git a/Q14.cs b/Q14.cs
new file mode 100644
index 0000000..e1d21a0
--- /dev/null
+++ b/Q14.cs
@@ -0,0 +1,176 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+
+namespace _2020
+{
+ class Q14
+ {
+ [DebuggerDisplay("mask = [...], {writeInstructions.Count} writes")]
+ class Instruction
+ {
+ [DebuggerDisplay("mem[{idx}] = {value}")]
+ public class WriteInstruction
+ {
+ public ulong idx;
+ public ulong value;
+ }
+
+ public List mask = new List();
+ public List writeInstructions = new List();
+ }
+ static List instructions = new List();
+
+ public static void Go()
+ {
+ var start = DateTime.Now;
+ MakeList();
+ Util.Log($"Q14 MakeList took {(DateTime.Now - start).TotalMilliseconds}ms");
+ var p1start = DateTime.Now;
+ Part1();
+ Util.Log($"Q14 part1 took {(DateTime.Now - p1start).TotalMilliseconds}ms");
+ var p2start = DateTime.Now;
+ Part2();
+ Util.Log($"Q14 part2 took {(DateTime.Now - p2start).TotalMilliseconds}ms");
+
+ Util.Log($"Q14 took {(DateTime.Now - start).TotalMilliseconds}ms");
+ }
+
+ static void MakeList()
+ {
+ foreach (var line in File.ReadAllLines("14input.txt"))
+ {
+ if (line.StartsWith("mask = "))
+ {
+ var inst = new Instruction();
+ var bits = line["mask = ".Length..];
+ foreach (var num in bits.Reverse())
+ {
+ if (num == 'X')
+ {
+ inst.mask.Add(byte.MaxValue);
+ }
+ else
+ {
+ inst.mask.Add(num == '0' ? 0 : 1);
+ }
+ }
+
+ instructions.Add(inst);
+ }
+ else if (line.StartsWith("mem["))
+ {
+ var inst = instructions[^1];
+
+ var writeInst = new Instruction.WriteInstruction();
+ writeInst.idx = Convert.ToUInt64(line["mem[".Length..line.IndexOf("]")]);
+ writeInst.value = Convert.ToUInt64(line[(line.IndexOf('=') + 1)..]);
+
+ inst.writeInstructions.Add(writeInst);
+ }
+ }
+ }
+
+ static ulong ReplaceBit(ulong val, byte bitVal, int bit)
+ {
+ if (bitVal == 0)
+ {
+ val &= (ulong)~(1L << bit);
+ }
+ else if (bitVal == 1)
+ {
+ val |= 1UL << bit;
+ }
+
+ return val;
+ }
+
+ static void Part1()
+ {
+ var memory = new Dictionary();
+
+ foreach (var inst in instructions)
+ {
+ foreach (var write in inst.writeInstructions)
+ {
+ if (!memory.ContainsKey(write.idx))
+ {
+ memory.Add(write.idx, 0);
+ }
+
+ var val = write.value;
+
+ for (int i = 0; i < inst.mask.Count; i++)
+ {
+ val = ReplaceBit(val, inst.mask[i], i);
+ }
+
+ memory[write.idx] = val;
+ }
+ }
+
+ long total = memory.Sum(pair => (long)pair.Value);
+
+ Util.Log($"Q14Part1: sum={total}");
+ }
+
+ static void ComputeAddresses(ulong baseAddr, ref List addrs, List mask, int startIdx)
+ {
+ for (int i = startIdx; i < mask.Count; i++)
+ {
+ if (mask[i] == byte.MaxValue)
+ {
+ // these Add()s can add duplicates, but it's faster to re-set an existing key in a dictionary than to ensure uniqueness in this list
+ var replacedAddr = ReplaceBit(baseAddr, 1, i);
+ addrs.Add(replacedAddr);
+ ComputeAddresses(replacedAddr, ref addrs, mask, i + 1);
+ addrs.Add(ReplaceBit(baseAddr, 0, i));
+ }
+ }
+ }
+
+ static void Part2()
+ {
+ var memory = new Dictionary();
+
+ foreach (var inst in instructions)
+ {
+ foreach (var write in inst.writeInstructions)
+ {
+ var addrs = new List();
+
+ var baseAddr = write.idx;
+ for (int i = 0; i < inst.mask.Count; i++)
+ {
+ if (inst.mask[i] == 1)
+ {
+ baseAddr = ReplaceBit(baseAddr, 1, i);
+ }
+ else if (inst.mask[i] == byte.MaxValue)
+ {
+ baseAddr = ReplaceBit(baseAddr, 0, i);
+ }
+ }
+
+ addrs.Add(baseAddr);
+ ComputeAddresses(baseAddr, ref addrs, inst.mask, 0);
+
+ foreach (var addr in addrs)
+ {
+ if (!memory.ContainsKey(addr))
+ {
+ memory.Add(addr, 0);
+ }
+
+ memory[addr] = write.value;
+ }
+ }
+ }
+
+ long total = memory.Sum(pair => (long)pair.Value);
+ Util.Log($"Q14Part2: sum={total}");
+ }
+ }
+}