Added day 14

This commit is contained in:
Sebastian 2020-12-14 12:31:01 +01:00
parent 8c24b10fa4
commit e3d1d56d4c
4 changed files with 772 additions and 2 deletions

545
inputs/day14.txt Normal file
View File

@ -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

View File

@ -1,2 +1,4 @@
939
7,13,x,x,59,x,31,19
mask = 000000000000000000000000000000X1001X
mem[42] = 100
mask = 00000000000000000000000000000000X0XX
mem[26] = 1

102
src/bin/day14.rs Normal file
View File

@ -0,0 +1,102 @@
use itertools::Itertools;
use std::collections::HashMap;
use std::error::Error;
use std::fs::File;
use std::io::{self, BufRead};
use std::vec::Vec;
#[macro_use]
extern crate lazy_static;
extern crate regex;
use regex::Regex;
enum Command {
Mem(u64, u64),
Mask(u64, u64),
}
impl Command {
fn from_string(line: &str) -> Command {
lazy_static! {
static ref MASK_RE: Regex = Regex::new(r"^mask = ([X01]{36})$").unwrap();
static ref MEM_RE: Regex = Regex::new(r"^mem\[([0-9]*)\] = ([0-9]*)$").unwrap();
}
if let Some(cap) = MEM_RE.captures_iter(line).nth(0) {
let addr: u64 = cap[1].parse().unwrap();
let value: u64 = cap[2].parse().unwrap();
Command::Mem(addr, value)
} else if let Some(cap) = MASK_RE.captures_iter(line).nth(0) {
let mask = cap[1].to_string();
let mut set_mask: u64 = 0;
let mut unset_mask: u64 = 0;
let mut bit: u64 = 1 << 35;
for c in mask.chars() {
match c {
'0' => unset_mask |= bit,
'1' => set_mask |= bit,
'X' => {}
_ => panic!("Unsupported mask char: {}", c),
}
bit = bit >> 1;
}
Command::Mask(set_mask, unset_mask)
} else {
panic!("Unable to parse line: {}", line);
}
}
}
struct VM {
set_mask: u64,
unset_mask: u64,
memory: HashMap<u64, u64>,
}
impl VM {
fn new() -> VM {
VM {
set_mask: 0,
unset_mask: 0,
memory: HashMap::new(),
}
}
fn run(&mut self, programm: &Vec<Command>) {
for inst in programm {
match inst {
Command::Mask(set, unset) => {
self.set_mask = *set;
self.unset_mask = *unset;
}
Command::Mem(addr, value) => {
let set_value = value | self.set_mask;
let unset_value = set_value & !self.unset_mask;
self.memory.insert(*addr, unset_value);
}
}
}
}
fn compute_sum(&self) -> u64 {
self.memory.values().fold(0, |acc, x| acc + x)
}
}
fn main() -> Result<(), Box<dyn Error>> {
let file = File::open("inputs/day14.txt")?;
let lines = io::BufReader::new(file).lines().map(|l| l.unwrap());
let programm: Vec<Command> = lines.map(|l| Command::from_string(&l)).collect();
let mut vm = VM::new();
vm.run(&programm);
println!("Answer: {}", vm.compute_sum());
Ok(())
}

121
src/bin/day14_part2.rs Normal file
View File

@ -0,0 +1,121 @@
use itertools::Itertools;
use std::collections::HashMap;
use std::error::Error;
use std::fs::File;
use std::io::{self, BufRead};
use std::vec::Vec;
#[macro_use]
extern crate lazy_static;
extern crate regex;
use regex::Regex;
enum Command {
Mem(u64, u64),
Mask(String),
}
impl Command {
fn from_string(line: &str) -> Command {
lazy_static! {
static ref MASK_RE: Regex = Regex::new(r"^mask = ([X01]{36})$").unwrap();
static ref MEM_RE: Regex = Regex::new(r"^mem\[([0-9]*)\] = ([0-9]*)$").unwrap();
}
if let Some(cap) = MEM_RE.captures_iter(line).nth(0) {
let addr: u64 = cap[1].parse().unwrap();
let value: u64 = cap[2].parse().unwrap();
Command::Mem(addr, value)
} else if let Some(cap) = MASK_RE.captures_iter(line).nth(0) {
let mask = cap[1].to_string();
Command::Mask(mask)
} else {
panic!("Unable to parse line: {}", line);
}
}
}
struct VM {
mask: String,
memory: HashMap<u64, u64>,
}
impl VM {
fn new() -> VM {
VM {
mask: "000000000000000000000000000000000000".to_string(),
memory: HashMap::new(),
}
}
fn compute_addresses(&self, addr: u64) -> Vec<u64> {
fn enumerate_addresses(mask: String, bit: usize, addr: u64) -> Vec<u64> {
if bit == 0 {
match mask.chars().nth(0).unwrap() {
'0' => {
return vec![addr & 1];
}
'1' => {
return vec![1];
}
'X' => {
return vec![0, 1];
}
c => panic!("Unsupported mask bit: {}", c),
};
} else {
let lower_bits = enumerate_addresses(mask.clone(), bit - 1, addr);
let addr_bit = addr & (1 << bit as u64);
match mask.chars().nth(bit).unwrap() {
'0' => return lower_bits.iter().map(|b| b | addr_bit).collect(),
'1' => return lower_bits.iter().map(|b| b | (1 << bit as u64)).collect(),
'X' => {
let mut bit_zero = lower_bits.clone();
let mut bit_one: Vec<u64> =
lower_bits.iter().map(|b| b | (1 << bit as u64)).collect();
bit_zero.append(&mut bit_one);
return bit_zero;
}
c => panic!("Unsupported mask bit: {}", c),
};
}
}
enumerate_addresses(self.mask.chars().rev().collect(), 35, addr)
}
fn run(&mut self, programm: &Vec<Command>) {
for inst in programm {
match inst {
Command::Mask(mask) => {
self.mask = mask.clone();
}
Command::Mem(addr, value) => {
let addrs = self.compute_addresses(*addr);
for address in addrs {
self.memory.insert(address, *value);
}
}
}
}
}
fn compute_sum(&self) -> u64 {
self.memory.values().fold(0, |acc, x| acc + x)
}
}
fn main() -> Result<(), Box<dyn Error>> {
let file = File::open("inputs/day14.txt")?;
let lines = io::BufReader::new(file).lines().map(|l| l.unwrap());
let programm: Vec<Command> = lines.map(|l| Command::from_string(&l)).collect();
let mut vm = VM::new();
vm.run(&programm);
println!("Answer: {}", vm.compute_sum());
Ok(())
}