Add 2020/08

This commit is contained in:
kageru 2020-12-08 10:58:41 +01:00
parent 60d2a911b9
commit b266fc0287
Signed by: kageru
GPG Key ID: 8282A2BEA4ADA3D2
4 changed files with 771 additions and 3 deletions

10
2020/08/Cargo.toml Normal file
View File

@ -0,0 +1,10 @@
[package]
name = "day08"
version = "0.1.0"
authors = ["kageru <kageru@encode.moe>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
itertools = "0.9.0"

626
2020/08/input Normal file
View File

@ -0,0 +1,626 @@
acc +48
nop +308
acc +33
acc +48
jmp +379
acc +27
acc +23
acc +29
acc +3
jmp +326
acc -12
nop +248
nop +146
jmp +293
acc +8
acc -16
acc +18
jmp +255
jmp +390
jmp +442
acc +38
jmp +451
jmp +499
acc +41
acc +44
nop +298
acc +31
jmp +337
acc -3
acc +34
nop +266
acc -19
jmp +281
jmp +232
acc -9
acc +25
acc -8
nop +228
jmp +79
jmp +58
acc +38
nop +318
jmp +17
acc +44
jmp +298
acc -4
jmp +196
jmp +249
acc -9
acc -3
acc +17
jmp +556
jmp +1
acc -15
jmp +166
acc +23
acc +10
acc +39
jmp +475
acc +28
jmp +41
jmp +322
acc +48
acc -11
acc -13
acc +12
jmp +92
jmp +1
acc +9
jmp -26
acc +4
acc -8
nop +484
acc -14
jmp +526
acc -13
acc -2
acc -13
jmp +419
acc +22
acc -17
jmp +1
jmp +151
acc +3
acc +2
acc -13
acc -11
jmp +352
acc +24
jmp -27
nop +206
acc +22
nop +225
jmp +360
acc +48
jmp +105
jmp +80
acc -16
jmp +89
acc +0
jmp +339
acc +37
acc +41
nop +156
jmp +452
jmp +208
nop +60
jmp +155
acc -16
jmp +274
nop -77
acc -16
acc +21
jmp +508
acc -7
acc -1
jmp -83
acc -11
jmp +28
acc +3
acc +32
acc -18
jmp -89
acc +4
acc -14
acc -1
acc +33
jmp -75
nop +185
acc +8
acc +22
acc +26
jmp +164
acc -19
jmp +260
jmp +174
acc +2
acc +34
jmp -120
acc -15
acc +48
jmp +165
acc +5
nop +240
jmp -121
jmp +114
jmp -36
nop +432
jmp +1
acc -18
jmp +429
acc +44
nop +110
jmp +198
acc -18
acc +32
acc +41
jmp +102
nop +177
acc +35
acc +24
acc +46
jmp +121
acc +20
jmp +1
jmp +407
jmp +1
acc +35
acc +46
nop -18
jmp +6
jmp +422
acc -19
jmp -85
acc +33
jmp -116
nop +79
jmp +284
acc +3
acc +49
nop +317
jmp +6
acc +6
jmp +295
nop -141
acc -4
jmp -44
nop +155
acc +48
acc -17
jmp +188
acc +22
jmp +286
nop +103
acc -2
acc +45
jmp +20
acc +21
acc +37
jmp +235
jmp +42
acc -11
nop -15
acc -5
jmp +235
jmp +178
acc +12
acc -15
jmp +25
acc +9
acc +11
nop +389
acc +50
jmp +146
acc +26
jmp +144
acc -14
jmp +304
nop +254
jmp +337
jmp +17
jmp +1
acc +6
acc -4
acc +42
jmp +117
acc +25
acc +50
acc +45
jmp -112
acc +14
acc +27
jmp +347
nop +15
jmp +14
acc +29
jmp +236
jmp -71
acc -11
acc +21
nop +32
jmp -162
acc -15
jmp +322
acc -4
acc +16
jmp +1
jmp +100
jmp +1
jmp -77
acc +21
nop -199
acc +49
acc -1
jmp -231
jmp +230
acc -19
jmp +1
jmp -49
jmp -11
acc +6
jmp -110
jmp +331
acc +44
jmp +292
acc -7
acc -18
acc +50
jmp +221
acc +33
acc +7
jmp -45
jmp +342
acc -19
acc +36
acc +15
jmp -229
nop -5
jmp +57
acc +26
acc +43
nop -175
jmp +82
acc +45
jmp -161
acc -16
acc +35
acc +46
acc +43
jmp +1
nop +195
acc +39
acc +27
acc +32
jmp +227
jmp -272
nop +201
acc +6
acc +13
acc +12
jmp -177
acc -9
acc +46
nop +199
acc -1
jmp +1
jmp +3
acc +42
jmp +75
jmp +305
acc +49
acc -16
jmp -92
acc +3
nop +279
jmp +54
jmp +31
acc +50
jmp -125
acc +21
nop -178
acc +40
jmp +193
acc +39
acc -5
jmp +261
nop -3
acc -13
jmp -310
acc +6
acc -17
acc +12
acc +38
jmp +267
jmp -311
acc -2
jmp -7
nop +77
acc -2
acc +39
acc -16
jmp +10
nop +59
jmp -296
acc -4
acc +41
jmp -249
acc +43
nop +35
jmp +95
jmp +171
acc +10
nop +169
acc -17
jmp +47
acc +49
acc +38
nop +199
jmp +249
jmp -53
nop -194
acc +19
acc +18
jmp -16
acc +33
jmp +194
nop -194
acc +49
jmp +85
acc +50
nop -318
acc -7
jmp -49
acc -6
acc +48
acc -13
acc -14
jmp +67
acc +12
acc +19
acc +3
jmp -371
jmp -149
acc +49
nop -202
jmp -315
acc -6
jmp -171
acc -7
jmp +113
acc +34
acc +36
acc +17
jmp -97
acc +3
jmp -244
acc +25
acc +30
acc +25
acc -19
jmp +44
nop +84
jmp +124
nop +17
acc -11
acc -8
acc +4
jmp +193
jmp -388
acc +36
acc +17
jmp +1
acc -5
jmp +166
acc +39
acc -10
jmp -280
acc +15
jmp +1
jmp -396
jmp +113
acc +37
acc +13
jmp -35
nop +109
acc +8
acc +6
acc +19
jmp +39
jmp +1
jmp +1
acc +39
acc -14
jmp -291
acc +39
acc +31
jmp -231
acc +41
jmp -55
nop -167
jmp +105
acc -8
acc +34
jmp -114
nop +58
jmp +1
nop -270
acc +31
jmp -135
acc +8
acc +33
jmp +1
jmp -64
acc +24
acc +16
jmp +117
acc +35
acc -11
nop +44
acc +18
jmp +1
jmp +88
acc +29
nop +34
jmp +1
nop -118
jmp -404
jmp -144
acc -12
nop -372
acc -14
jmp -209
acc +12
jmp +1
acc -1
jmp +132
nop -93
jmp -130
acc +23
acc +30
acc +3
jmp -209
nop -381
acc -19
jmp +23
nop +87
jmp -277
acc +39
jmp -391
acc +14
acc +18
acc +24
nop -459
jmp -267
acc +35
nop +84
jmp -231
acc +5
acc +0
acc +45
jmp -210
jmp -211
acc +7
acc +8
nop -249
jmp -8
jmp -105
nop -455
acc -19
acc +36
jmp -368
acc +33
acc +10
acc +9
jmp -259
nop +41
acc -14
acc +2
jmp -336
acc +46
jmp -261
nop -284
acc +21
nop -154
jmp -485
jmp -505
acc +32
nop -327
acc +1
nop +43
jmp -23
acc -7
jmp -88
acc +10
jmp -440
acc +12
jmp -430
jmp +1
acc +46
nop -105
jmp -87
acc +49
acc -10
acc -6
jmp -411
jmp -268
acc +35
acc +15
jmp +45
acc -14
acc +0
jmp -234
nop -67
acc +32
acc +1
jmp -476
jmp -297
nop -274
jmp -435
acc +36
acc -2
acc +33
acc +9
jmp -26
jmp +50
acc +23
jmp -172
jmp +1
acc +34
acc +32
acc -4
jmp -312
acc -11
acc +26
jmp -150
acc +41
nop -79
acc +25
jmp -76
acc -2
acc +29
acc +12
jmp -549
nop -357
nop -438
jmp -320
acc +7
acc -6
jmp -149
nop -74
acc +7
acc +45
jmp -383
acc -8
acc +5
acc +12
jmp -463
acc -17
acc +5
jmp -34
jmp +1
acc +18
jmp -523
acc +38
acc +35
nop -222
jmp -424
nop -365
jmp -188
acc +0
acc +7
nop -167
acc +27
jmp -351
acc +26
jmp -201
nop -208
nop -466
acc +50
nop -531
jmp -273
acc +21
acc +25
nop -397
acc +29
jmp +1

132
2020/08/src/main.rs Normal file
View File

@ -0,0 +1,132 @@
#![feature(test, str_split_once)]
extern crate test;
use std::env;
#[derive(Debug, PartialEq)]
enum Command {
NOP(i32),
ACC(i32),
JMP(i32),
}
fn read_input() -> String {
std::fs::read_to_string(env::args().nth(1).filter(|n| n != "--bench").unwrap_or(String::from("input"))).unwrap()
}
fn parse_input(raw: &str) -> Vec<Command> {
raw.lines()
.map(|l| match l.split_once(' ') {
Some(("nop", x)) => Command::NOP(x.parse().unwrap()),
Some(("acc", x)) => Command::ACC(x.parse().unwrap()),
Some(("jmp", x)) => Command::JMP(x.parse().unwrap()),
_ => unreachable!(),
})
.collect()
}
fn main() {
let commands = parse_input(&read_input());
println!("Part 1: {}", part1(&commands));
println!("Part 2: {}", part2(&commands, vec![false; commands.len()], 0, 0, false).unwrap());
}
fn part1(commands: &Vec<Command>) -> i32 {
let mut seen = vec![false; commands.len()];
let mut index = 0i32;
let mut acc = 0;
loop {
if seen[index as usize] {
return acc;
}
seen[index as usize] = true;
match commands[index as usize] {
Command::NOP(_) => index += 1,
Command::ACC(x) => {
acc += x;
index += 1
}
Command::JMP(x) => index += x,
}
}
}
fn part2(commands: &Vec<Command>, mut seen: Vec<bool>, mut index: i32, mut acc: i32, changed: bool) -> Option<i32> {
loop {
if index as usize >= commands.len() {
return Some(acc);
}
if seen[index as usize] {
return None;
}
seen[index as usize] = true;
match commands[index as usize] {
Command::NOP(x) => {
if !changed {
if let Some(n) = part2(commands, seen.clone(), index + x, acc, true) {
return Some(n);
}
}
index += 1;
}
Command::ACC(x) => {
acc += x;
index += 1
}
Command::JMP(x) => {
// is there no way to have regular if and if let in one statement?
if !changed {
if let Some(n) = part2(commands, seen.clone(), index + 1, acc, true) {
return Some(n);
}
}
index += x;
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use test::black_box;
const TEST_INPUT: &str = "nop +0
acc +1
jmp +4
acc +3
jmp -3
acc -99
acc +1
jmp -4
acc +6";
#[test]
fn part1_test() {
let commands = parse_input(TEST_INPUT);
assert_eq!(part1(&commands), 5);
}
#[test]
fn part2_test() {
let commands = parse_input(TEST_INPUT);
assert_eq!(part2(&commands, vec![false; commands.len()], 0, 0, false), Some(8));
}
#[bench]
fn bench_part1(b: &mut test::Bencher) {
let commands = parse_input(&read_input());
b.iter(|| assert_eq!(part1(black_box(&commands)), 1317));
}
#[bench]
fn bench_part2(b: &mut test::Bencher) {
let commands = parse_input(&read_input());
b.iter(|| assert_eq!(part2(black_box(&commands), vec![false; commands.len()], 0, 0, false), Some(1033)));
}
#[bench]
fn bench_input_parsing(b: &mut test::Bencher) {
let raw = read_input();
b.iter(|| assert_eq!(parse_input(black_box(&raw)).len(), 626))
}
}

View File

@ -18,10 +18,10 @@ extern crate test;
use std::env;
fn read_input() -> String {
std::fs::read_to_string(env::args().nth(1).unwrap_or(String::from("input"))).unwrap()
std::fs::read_to_string(env::args().nth(1).filter(|n| n != "--bench").unwrap_or(String::from("input"))).unwrap()
}
fn parse_input(raw: &str) -> ! {
fn parse_input(raw: &str) -> Vec<!> {
unimplemented!()
}
@ -38,4 +38,4 @@ mod tests {
const TEST_INPUT: &str = "";
}' >> src/main.rs
}' > src/main.rs