day 14 solutions

Signed-off-by: Stephen Waits <swaits@amazon.com>
This commit is contained in:
Stephen Waits committed 2020-12-14 23:06:50 -08:00
1 parent aa332efa20
commit e56dff5a12
4 files changed
+739

No files matched your search

+594
View File
@@ -0,0 +1,594 @@
mask = 0010X01001X010000110100000X000010X11
mem[41717] = 288
mem[54146] = 1656
mem[30135] = 4799584
mask = 01X10101X11X01XX01X000011X1000110110
mem[29142] = 13227025
mem[32455] = 1814
mem[42522] = 385316684
mem[29904] = 5334
mem[51087] = 1492
mask = 01110X1X1XX0100011X0111X11001X1X1001
mem[16001] = 2818333
mem[896] = 152318161
mem[7380] = 1741200
mem[36363] = 3994854
mem[51852] = 5003
mem[31197] = 8946048
mem[38377] = 699057
mask = 00XX0X11111001001XX100X1010X00X10X01
mem[41981] = 8217309
mem[929] = 5355
mem[21551] = 1130885
mask = 111X01X111001X0XX11X110100X1101100XX
mem[38540] = 877233
mem[4594] = 156077284
mem[17004] = 12673792
mem[11717] = 12697488
mem[58553] = 890949
mask = 001101X101X1100001X0000X0X100001110X
mem[49613] = 14831731
mem[18410] = 386265
mem[11204] = 66992
mem[7462] = 330749684
mem[48489] = 186227974
mem[49880] = 13957
mem[37574] = 101061
mask = 0X11010101111000011XX00001X0101111X0
mem[43270] = 63321063
mem[8868] = 8357760
mem[51871] = 7561
mem[59958] = 76822813
mem[13346] = 298124646
mem[28205] = 1479
mem[20102] = 898175404
mask = 00X00X11111001001X1X0000011010000101
mem[39594] = 471
mem[23863] = 472
mem[45424] = 881
mem[5520] = 68851082
mask = 1111011X1XX01XX01110010X011010X01100
mem[7932] = 7104
mem[50570] = 521355116
mem[33698] = 77366694
mem[54041] = 1967898
mem[1940] = 272765
mem[42608] = 557758
mem[48653] = 95074
mask = 01110101011110001100100101X11000XX0X
mem[5032] = 324136
mem[19968] = 25
mem[37008] = 370
mem[51927] = 7820968
mem[3960] = 273343
mem[26318] = 9940851
mask = 11X1011X1X00111XX110X000011X10010001
mem[49437] = 13322545
mem[46843] = 690911
mem[58945] = 13770143
mem[4847] = 67337
mem[6128] = 371
mask = 1100X1X1X10011X01X100011110011110001
mem[6466] = 926046
mem[20503] = 8735222
mem[29727] = 18641
mem[20030] = 1090613
mem[54347] = 33354545
mask = 11XX01X111X011001110X0110101100XX011
mem[59773] = 1775
mem[31974] = 722
mem[15867] = 46611
mem[37151] = 3019104
mem[21915] = 96864303
mem[9222] = 10601111
mem[20777] = 1235555
mask = 0111010001111X00110X0X1011X0X1100000
mem[46581] = 20573
mem[32355] = 58869216
mem[45378] = 13272459
mem[22414] = 322109637
mem[34083] = 20766732
mem[63698] = 3924531
mask = 010101011X100X01011001X10X101X11011X
mem[57710] = 113212
mem[31202] = 231541678
mem[51278] = 219614
mem[63698] = 1042138
mem[15026] = 7000054
mem[51217] = 500505
mask = 0X100001000X0100XX1XX1101101001X1000
mem[7011] = 521173
mem[13238] = 157620
mem[30900] = 19373
mem[27810] = 163020969
mem[54982] = 96357825
mem[22824] = 408599
mem[12477] = 48103186
mask = 00000010111XX00XX110X010000000010111
mem[54146] = 17970
mem[41376] = 1503
mem[31900] = 438330985
mem[13355] = 435056
mem[64758] = 1052852148
mem[59142] = 1950135
mem[6781] = 13502
mask = 01X10X0111110X00X0XX010100X10X1X0101
mem[51107] = 13121312
mem[20134] = 243
mem[56802] = 24720
mask = 1111010111101100XX101111000000010X1X
mem[56384] = 729
mem[32508] = 258811315
mem[39920] = 252650
mem[54657] = 119337
mem[43559] = 1614394
mem[43973] = 36253
mask = 00100XXXXX1X10000110110100010001XX01
mem[33796] = 171340858
mem[62392] = 2042140
mem[21146] = 202316
mem[50189] = 17797984
mem[59958] = 3871673
mem[46838] = 7418
mask = X0100X0X111X11011110X0000001001X1111
mem[35424] = 14950493
mem[64240] = 40746
mem[22319] = 149408
mem[32929] = 57764
mem[4571] = 138473
mem[13202] = 6496022
mem[59210] = 24648253
mask = 00XX0001111011111110X1X0111010XX0X10
mem[31028] = 3706
mem[64362] = 57739
mem[22920] = 491669
mask = 011X0101X111XX000110XX01X110X001110X
mem[22272] = 22414
mem[59958] = 10131
mem[9299] = 59050364
mem[54292] = 185609950
mem[11363] = 679
mem[55554] = 127124
mask = 11110X0110X010101X10010X011010011011
mem[13140] = 23895
mem[54725] = 364383
mem[12768] = 29526
mem[21134] = 31494
mem[32345] = 13843
mem[38437] = 576352606
mem[35535] = 1948
mask = X111011111X100X001111111000X111000X0
mem[34738] = 395933
mem[33438] = 644
mem[34480] = 56137
mem[33415] = 71
mem[55820] = 40580559
mem[37978] = 104370
mem[60594] = 47366315
mask = 011X0X110110X000100X0X1110X00000XX00
mem[2065] = 5611
mem[42368] = 139274892
mem[11145] = 48456
mem[11668] = 5352867
mem[40280] = 864639
mask = 1XX1X00X11010X10011111XXX1101100111X
mem[39384] = 12733115
mem[48860] = 24406
mem[46230] = 13931503
mask = 00X001100X11100001101100001X1XX10001
mem[11204] = 11902
mem[42496] = 95479
mem[58594] = 120902
mem[62260] = 43802019
mem[41882] = 889
mask = 00X000X011111X0001100000000000X00001
mem[54549] = 73578351
mem[15308] = 225676
mask = 11110X011100100X11111111XX0101100111
mem[62902] = 115296396
mem[163] = 47992
mem[27595] = 1080625
mask = X01101X1111XX1X0111X0101000000111010
mem[45311] = 950513
mem[35853] = 3048594
mem[25353] = 42914232
mem[4595] = 165637540
mem[5173] = 4666
mem[27595] = 33115384
mask = 11XX0101X10010000111X111001000X00111
mem[5313] = 16770
mem[21570] = 21589452
mem[45537] = 25984
mem[7425] = 1016
mem[57579] = 4400441
mem[16371] = 27936
mem[29544] = 699
mask = 0011010X1X1010X111X10X0001010XX01001
mem[12546] = 66366447
mem[4594] = 660822686
mem[61425] = 3035
mem[16121] = 27102624
mem[1316] = 1781
mem[23623] = 572865256
mask = 0111X1011XX01X0101100100X110000X001X
mem[23341] = 6402065
mem[52500] = 1977612
mask = 00X0001011X1100001101100X01100X00111
mem[64017] = 31705
mem[35512] = 1445
mem[35781] = 5233653
mem[44050] = 40
mask = 01110100X11110X0X1000X11111X0X1X000X
mem[12867] = 190010
mem[36252] = 747672
mem[23167] = 204357
mem[27385] = 12016
mem[47464] = 784707845
mem[48043] = 627253
mask = 0111X0X0X100100X1110011X11000X000100
mem[37676] = 36371
mem[59916] = 3315
mem[29136] = 15854324
mem[37249] = 132828
mem[53802] = 79432
mask = X11X1101101X110X0X10X1000011000XXX00
mem[17461] = 8158
mem[33712] = 1029431
mem[1042] = 837675
mask = 00110X011010100X1101010100010XX11011
mem[16121] = 853733
mem[18346] = 5303
mem[60174] = 506801115
mem[1817] = 1868
mem[46166] = 168
mem[14602] = 1968
mem[5368] = 109371
mask = X1110XX111X100X0011X101111001101XX10
mem[21630] = 8667
mem[55820] = 200651
mem[11204] = 34034
mask = 1111011X10101X001110001X01XX00010101
mem[62846] = 105848
mem[43437] = 28568
mem[16213] = 724626106
mem[32677] = 149932
mem[23580] = 573
mem[22272] = 3393406
mem[64633] = 4838
mask = 011001010XX1X10001100X00X0010001X0X0
mem[23580] = 992
mem[7692] = 1236
mem[33389] = 560975
mem[7177] = 5868
mask = X1X10101X0101X0011101100111110100101
mem[99] = 6843772
mem[30553] = 554826032
mem[61798] = 5939100
mem[48169] = 2030
mask = 00XX000100000X0001110010X11001000101
mem[25353] = 78809
mem[10239] = 276125
mem[11223] = 13545
mem[57147] = 1433
mask = 001X010010011010X110101X11011X001010
mem[49575] = 152755
mem[26848] = 63016
mem[30880] = 1725364
mask = 011101X10XX01X0010X0XX01110000X11100
mem[41287] = 414662075
mem[28188] = 3477472
mem[36592] = 7996235
mem[49314] = 9140605
mem[47488] = 7769
mask = 01110X01X111010001X100101X0X10011100
mem[52240] = 192560204
mem[65031] = 701796
mem[14783] = 8161
mask = 0111010X011X1X001XX01001X1X00X0100X0
mem[49691] = 10412561
mem[915] = 134624030
mem[8606] = 736
mem[58998] = 1516
mem[61106] = 641573
mask = 01X1X1X111101011011X10100010000X01X1
mem[21630] = 19000288
mem[60944] = 213511689
mem[46464] = 59732
mem[32695] = 533
mem[27385] = 25467104
mem[62812] = 304550708
mask = 00110X010X1110X0X1111X00111X0001X100
mem[57194] = 24040
mem[20550] = 46674
mem[52168] = 23339025
mem[35512] = 68290970
mask = X111011X1010101011101X10000111000X11
mem[12546] = 102729072
mem[7304] = 110383
mem[59523] = 888
mem[21630] = 71914682
mem[19910] = 5863216
mask = 11X0010X1X101110111X01X0000111111001
mem[4963] = 173772407
mem[33919] = 81154860
mem[7928] = 4393
mem[59961] = 4977369
mem[22493] = 377398427
mask = 00X0010X10011X10X1X00001X10001101010
mem[17461] = 120207
mem[7618] = 54871412
mem[3960] = 25088
mem[4185] = 15852
mask = X0X00X00011010000100001X001110010101
mem[17246] = 10825
mem[61485] = 1220754
mem[37937] = 63325
mem[13776] = 44579590
mem[26933] = 467904
mask = 01X10X011XX101001001X101X11110100111
mem[51192] = 227116205
mem[8996] = 589323
mem[40539] = 2892
mem[18976] = 329283
mem[2942] = 13450
mem[59167] = 436935
mask = 0X11010101111000X11010XX011X1X010001
mem[31621] = 4166
mem[38132] = 66956
mem[4178] = 32378
mem[59276] = 448
mem[57505] = 202001993
mem[8239] = 69424389
mask = 0010X10001101000X1X00000001000001X00
mem[32804] = 120932430
mem[60447] = 305
mem[62385] = 5277
mem[54940] = 11685990
mem[48466] = 1956474
mem[38326] = 14070
mask = 1111010111X0101X11101000X0011X0000X0
mem[9957] = 794590
mem[43663] = 63819868
mem[59142] = 8388971
mem[41877] = 413661620
mask = X011X10X111XXX001111010101XXX0011001
mem[47] = 18787684
mem[17443] = 648
mem[4356] = 656
mem[65126] = 3205798
mem[38437] = 1762627
mem[43834] = 581
mask = 01110110X10010001100X01010101X0X1001
mem[38345] = 934
mem[58528] = 6065840
mem[33800] = 20485490
mem[48232] = 16644491
mask = 001X000X00X001000X11XX10101010X111X0
mem[22284] = 259142
mem[28461] = 974
mem[62938] = 449
mem[40024] = 598
mem[22913] = 650
mem[19996] = 5093
mask = 0X100X01X1X010XX01X00000010000100001
mem[29565] = 3981254
mem[55283] = 82851782
mem[36252] = 55697822
mask = 111101X11X101XX01110XX1010X101XX0101
mem[56566] = 29617152
mem[10468] = 2660883
mem[28055] = 1499
mem[35218] = 185790979
mem[22128] = 846102
mem[30117] = 560842
mem[58299] = 1012387364
mask = 111X010110X0X010111001X0X00X11011111
mem[48718] = 3937
mem[26689] = 501780
mem[30553] = 657149
mask = 001001XXX0X110X001100001X1X1111X0010
mem[1480] = 42916
mem[27601] = 42064531
mem[35919] = 6321
mem[57905] = 2686675
mask = X1110X1X110010X01X101111010110X0X101
mem[40159] = 28365
mem[50570] = 95027
mem[65427] = 4531
mem[7468] = 41
mem[49166] = 3783
mem[59623] = 258901051
mask = 1111011X1100100X111X0X0X11011X1001X0
mem[58839] = 103790
mem[44410] = 660
mask = 01X1010X0111100X0110001101XX00X1110X
mem[58804] = 116385
mem[57709] = 27103
mem[62492] = 11102
mem[62031] = 24113
mem[23580] = 101015510
mask = 0X110100011110010110111100X11X110X01
mem[45855] = 345
mem[33796] = 2069488
mem[61694] = 409
mem[42908] = 529
mem[54356] = 1540
mem[2931] = 6893
mem[13629] = 161
mask = 011X010111111000X11001010XX0100110X1
mem[48232] = 2748
mem[46818] = 1360569
mem[37978] = 59020939
mem[3596] = 13931
mask = 011X0101011110X00110110010X11100XX00
mem[8686] = 3043212
mem[99] = 1008741
mem[19665] = 4017
mem[57438] = 94605425
mem[55264] = 1505951
mask = 0010XX11X00X1X000110X0X101X1010000X1
mem[38124] = 952
mem[24080] = 109634238
mem[9221] = 3755102
mem[6097] = 7229649
mem[44702] = 6963
mem[4664] = 75052121
mem[54208] = 50749
mask = 001X000100X001000111X0XX101110X0X00X
mem[29210] = 30278
mem[34588] = 8139931
mem[4262] = 170
mem[30822] = 116256036
mem[35104] = 2105
mem[53802] = 202809516
mem[34175] = 11635
mask = 10110111101X10X01110X0101X1101X1000X
mem[31068] = 8529566
mem[55554] = 1887440
mem[43973] = 711
mem[30117] = 89
mem[32710] = 6073240
mask = X11001011100110101X10X0X0X0111010000
mem[33533] = 67852
mem[41455] = 2159161
mem[61283] = 7275538
mem[26353] = 49998
mem[37978] = 396
mem[56038] = 27870483
mem[48893] = 2558
mask = 00110X0X10XX1001X101001001010XX10001
mem[15308] = 3190807
mem[29791] = 1689321
mem[23706] = 28489987
mem[52184] = 13941172
mask = 0111010111X010X1011011X01110X0X10111
mem[46818] = 3960
mem[896] = 8079
mem[51892] = 10813637
mem[40539] = 50432
mem[39200] = 405093301
mem[59082] = 24044094
mask = 0X11X00100110X0001111000X10000X01000
mem[18818] = 115548503
mem[3709] = 408
mem[28387] = 1517
mem[18617] = 82658
mask = 00100X0001X0100001X010100011X0XX0001
mem[16645] = 2580
mem[55034] = 1395
mem[24779] = 57573
mask = 010100X11111000010XXXX0X0X1XX0110010
mem[51498] = 514
mem[56424] = 27530520
mem[5657] = 5653
mem[60013] = 1759
mem[39685] = 48186
mask = X0100X0111101XX1111001X101110XXX11X0
mem[15867] = 15856896
mem[16645] = 22385
mem[11204] = 56370
mask = 0X1X0101X0101000111011110X111010X001
mem[30186] = 149471
mem[55297] = 6189241
mem[56429] = 7551
mem[35853] = 1943
mem[50590] = 3973692
mask = 0111010X011X10XXX100011XX11101X0X011
mem[41687] = 10091
mem[27747] = 12073
mem[41632] = 117
mem[53319] = 6596158
mask = 101001011110X1011110001X11111XX01001
mem[8898] = 350890
mem[61425] = 11351
mem[30900] = 62547453
mem[32345] = 4152907
mem[53681] = 15100
mask = 0X10010X1X0110X0011001101001X010XX11
mem[46274] = 266245793
mem[51690] = 6210475
mem[31828] = 50916780
mem[40159] = 1305075
mask = X1110X0001XX11001100111111X0100X00X0
mem[13308] = 2061153
mem[21134] = 100
mem[22800] = 43346237
mem[63215] = 1528
mem[3115] = 159268
mem[51760] = 3390
mask = 011X0101011100000110X1X1X1101X1100X1
mem[3709] = 1727
mem[30692] = 4483
mem[4143] = 22098690
mem[8978] = 536
mask = 1X1X01011X10X101X110000X11111010X100
mem[1983] = 1355679
mem[18831] = 4847364
mem[26861] = 6413
mask = 111XXX10X11010001X10X10X0111100X1X00
mem[1940] = 622180477
mem[33455] = 6793
mem[54070] = 74933929
mem[1936] = 6134620
mask = 1X1X010X111011XX1110010100X1X0X01X01
mem[4347] = 29272422
mem[26401] = 180116335
mem[53382] = 684
mem[29142] = 91826
mem[30] = 11042
mem[30490] = 92215
mask = 11X101111110110011100111X1X11X1001X1
mem[35424] = 3594
mem[54399] = 228781216
mem[33796] = 149514889
mem[29544] = 697176893
mem[38146] = 169131
mem[35144] = 33941748
mem[39849] = 293
mask = XX1101XX1X101000111011011110X0100101
mem[11432] = 76469
mem[19223] = 5525
mem[45424] = 201
mem[3709] = 5622752
mem[64781] = 8199
mask = 011001011X1110011111X0X00X1000000101
mem[54292] = 949
mem[26880] = 10542
mem[62098] = 860
mask = 111X010X111011111X10001X01X100X11001
mem[22272] = 951175
mem[20506] = 1133335
mem[57502] = 177607519
mask = 01100X0101X1110X01X01101X11XX1X111X0
mem[30880] = 1070
mem[25208] = 25110
mem[29830] = 43106
mem[44754] = 7361
mask = 0X1X0101111X100XX11X0100010100X00101
mem[57107] = 9040
mem[19968] = 326431400
mem[30553] = 2988
mem[1096] = 54078
mem[5657] = 822343
mem[24080] = 241413
mem[54292] = 14129212
mask = 0X110X010X1XXX00011111X001X010X10000
mem[43660] = 37456160
mem[51849] = 1253870
mask = 111001X0X1X01000111000X00XX00010X000
mem[11663] = 66023717
mem[26130] = 503044
mem[44779] = 44698095
mem[12702] = 53757
mem[22414] = 1795507
mask = 0111X1010111X1X0X1100X010001X0011010
mem[39200] = 4090252
mem[31845] = 2782402
mem[22284] = 429
mem[29279] = 16254306
mask = 01010101111X0X000X1011X11XX11X1XX111
mem[50705] = 1963
mem[40289] = 71985
mem[43716] = 411505145
mem[3338] = 661
mem[2430] = 2635
+2
View File
@@ -0,0 +1,2 @@
11884151942312
2625449018811
+141
View File
@@ -0,0 +1,141 @@
// ==== day 12
use crate::utils;
use anyhow::Result;
use std::collections::HashMap;
#[derive(Copy, Clone, Debug)]
enum Instruction {
Mask {
exes_mask: u64,
ones_mask: u64,
zeroes_mask: u64,
},
Write {
address: u64,
value: u64,
},
}
fn parse_mask(s: &str) -> Instruction {
let maskstr = &s[s.find(" = ").unwrap() + 3..];
let ones_str = maskstr.replace('X', "0");
let zeroes_str = maskstr
.replace('1', "X")
.replace('0', "1")
.replace('X', "0");
let exes_str = maskstr.replace('1', "0").replace('X', "1");
Instruction::Mask {
exes_mask: u64::from_str_radix(&exes_str, 2).unwrap(),
ones_mask: u64::from_str_radix(&ones_str, 2).unwrap(),
zeroes_mask: u64::from_str_radix(&zeroes_str, 2).unwrap(),
}
}
fn parse_write(s: &str) -> Instruction {
Instruction::Write {
address: s[4..s.find(']').unwrap()].parse().unwrap(),
value: s[s.find(" = ").unwrap() + 3..].parse().unwrap(),
}
}
fn parse(input: &str) -> Vec<Instruction> {
input
.lines()
.map(|l| l.trim())
.map(|l| match &l[0..4] {
"mask" => parse_mask(l),
"mem[" => parse_write(l),
_ => unreachable!("bad input"),
})
.collect()
}
fn simulate1(program: &[Instruction]) -> u64 {
let mut memory: HashMap<u64, u64> = HashMap::new();
let (mut cur_ones, mut cur_zeroes) = (0, 0);
program.iter().for_each(|i| {
match i {
Instruction::Mask {
ones_mask,
zeroes_mask,
..
} => {
cur_ones = *ones_mask;
cur_zeroes = *zeroes_mask;
}
Instruction::Write { address, value } => {
memory.insert(*address, (value | cur_ones) & !cur_zeroes);
}
};
});
memory.values().sum()
}
#[inline(always)]
fn set_bit(n: u64, bit: usize, value: bool) -> u64 {
if value {
n | (1 << bit)
} else {
n & !(1 << bit)
}
}
fn address_masks_from_float_mask(float_mask: u64) -> impl Iterator<Item = u64> {
let possibilities = 2_u64.pow(float_mask.count_ones());
let one_positions: Vec<usize> = (0..36).filter(|i| float_mask & (1 << i) != 0).collect();
(0..possibilities).map(move |i| {
one_positions
.iter()
.enumerate()
.fold(0, |result, (j, pos)| {
set_bit(result, *pos, (i & (1 << j)) != 0)
})
})
}
fn simulate2(program: &[Instruction]) -> u64 {
let mut memory: HashMap<u64, u64> = HashMap::new();
let (mut cur_exes, mut cur_ones, mut cur_zeroes) = (0, 0, 0);
program.iter().for_each(|i| {
match i {
Instruction::Mask {
exes_mask,
ones_mask,
zeroes_mask,
} => {
cur_exes = *exes_mask;
cur_ones = *ones_mask;
cur_zeroes = *zeroes_mask;
}
Instruction::Write { address, value } => {
let base_address = (*address | cur_ones) & !cur_exes;
address_masks_from_float_mask(cur_exes)
.map(|a| a | base_address)
.for_each(|a| {
memory.insert(a, *value);
});
}
};
});
memory.values().sum()
}
// main
pub fn run() -> Result<(u64, u64)> {
let data = utils::read_file("data/input-14.txt")?;
let answers = utils::read_i64s("data/output-14.txt")?;
let parsed = parse(&data);
let p1 = simulate1(&parsed);
let p2 = simulate2(&parsed);
assert_eq!(p1, answers[0] as u64);
assert_eq!(p2, answers[1] as u64);
Ok((p1, p2))
}
+2
View File
@@ -12,6 +12,7 @@ mod day09;
mod day10;
mod day11;
mod day12;
mod day14;
mod utils;
// TODO
@@ -37,5 +38,6 @@ fn main() -> Result<()> {
println!("Day 10: {:?}", day10::run()?);
println!("Day 11: {:?}", day11::run()?);
println!("Day 12: {:?}", day12::run()?);
println!("Day 14: {:?}", day14::run()?);
Ok(())
}