Completed day 8
This commit is contained in:
parent
88ae26c6cc
commit
af802bb140
14
day08/Cargo.lock
generated
Normal file
14
day08/Cargo.lock
generated
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
[[package]]
|
||||||
|
name = "anyhow"
|
||||||
|
version = "1.0.35"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2c0df63cb2955042487fad3aefd2c6e3ae7389ac5dc1beb28921de0b69f779d4"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "day08"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"anyhow",
|
||||||
|
]
|
10
day08/Cargo.toml
Normal file
10
day08/Cargo.toml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
[package]
|
||||||
|
name = "day08"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Tyler Hallada <tyler@hallada.net>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
anyhow = "1.0"
|
633
day08/input/input.txt
Executable file
633
day08/input/input.txt
Executable file
@ -0,0 +1,633 @@
|
|||||||
|
acc +33
|
||||||
|
acc -7
|
||||||
|
acc +39
|
||||||
|
jmp +214
|
||||||
|
jmp +250
|
||||||
|
jmp +51
|
||||||
|
acc +29
|
||||||
|
acc +6
|
||||||
|
acc +20
|
||||||
|
jmp +489
|
||||||
|
nop +181
|
||||||
|
acc +4
|
||||||
|
jmp +187
|
||||||
|
nop +454
|
||||||
|
acc -10
|
||||||
|
acc +44
|
||||||
|
jmp +343
|
||||||
|
acc +14
|
||||||
|
acc +24
|
||||||
|
acc +37
|
||||||
|
acc -12
|
||||||
|
jmp +596
|
||||||
|
acc +21
|
||||||
|
acc +39
|
||||||
|
jmp +601
|
||||||
|
acc -15
|
||||||
|
jmp +304
|
||||||
|
acc -7
|
||||||
|
jmp +302
|
||||||
|
acc +38
|
||||||
|
jmp +148
|
||||||
|
acc -6
|
||||||
|
jmp +235
|
||||||
|
acc +6
|
||||||
|
nop +429
|
||||||
|
acc +49
|
||||||
|
acc +3
|
||||||
|
jmp +255
|
||||||
|
acc +2
|
||||||
|
jmp +10
|
||||||
|
acc +27
|
||||||
|
acc +0
|
||||||
|
acc -3
|
||||||
|
acc +28
|
||||||
|
jmp +565
|
||||||
|
acc -16
|
||||||
|
acc +39
|
||||||
|
acc -5
|
||||||
|
jmp +513
|
||||||
|
acc +43
|
||||||
|
acc +24
|
||||||
|
jmp +26
|
||||||
|
nop +19
|
||||||
|
nop +71
|
||||||
|
nop +182
|
||||||
|
jmp +477
|
||||||
|
acc +42
|
||||||
|
jmp +535
|
||||||
|
acc +38
|
||||||
|
acc +29
|
||||||
|
acc +1
|
||||||
|
jmp +1
|
||||||
|
jmp +72
|
||||||
|
acc +25
|
||||||
|
acc +43
|
||||||
|
acc +6
|
||||||
|
jmp +1
|
||||||
|
jmp +111
|
||||||
|
acc +43
|
||||||
|
acc +13
|
||||||
|
jmp +30
|
||||||
|
acc +4
|
||||||
|
acc +24
|
||||||
|
acc +20
|
||||||
|
acc -14
|
||||||
|
jmp +161
|
||||||
|
jmp +73
|
||||||
|
nop +108
|
||||||
|
jmp +547
|
||||||
|
nop +273
|
||||||
|
acc -8
|
||||||
|
nop +358
|
||||||
|
nop +284
|
||||||
|
jmp +526
|
||||||
|
acc +50
|
||||||
|
jmp +274
|
||||||
|
jmp +486
|
||||||
|
nop +167
|
||||||
|
acc -13
|
||||||
|
jmp +11
|
||||||
|
acc +10
|
||||||
|
jmp +508
|
||||||
|
acc -11
|
||||||
|
acc +46
|
||||||
|
acc +44
|
||||||
|
jmp +335
|
||||||
|
jmp +1
|
||||||
|
acc -16
|
||||||
|
acc +30
|
||||||
|
jmp +289
|
||||||
|
acc +15
|
||||||
|
nop +265
|
||||||
|
jmp +1
|
||||||
|
nop +68
|
||||||
|
jmp +107
|
||||||
|
acc -15
|
||||||
|
jmp -101
|
||||||
|
acc +28
|
||||||
|
acc -13
|
||||||
|
jmp +17
|
||||||
|
acc +21
|
||||||
|
acc +46
|
||||||
|
acc +19
|
||||||
|
acc -8
|
||||||
|
jmp +274
|
||||||
|
nop +237
|
||||||
|
jmp -111
|
||||||
|
nop +419
|
||||||
|
acc +28
|
||||||
|
acc +26
|
||||||
|
jmp +275
|
||||||
|
acc -4
|
||||||
|
jmp +483
|
||||||
|
jmp +1
|
||||||
|
jmp +201
|
||||||
|
jmp +234
|
||||||
|
acc +26
|
||||||
|
acc +21
|
||||||
|
acc +18
|
||||||
|
jmp +149
|
||||||
|
acc +0
|
||||||
|
acc +29
|
||||||
|
acc +11
|
||||||
|
jmp -41
|
||||||
|
nop +111
|
||||||
|
nop +212
|
||||||
|
jmp +172
|
||||||
|
acc +31
|
||||||
|
acc +17
|
||||||
|
acc +6
|
||||||
|
jmp -40
|
||||||
|
acc +7
|
||||||
|
acc +44
|
||||||
|
acc +41
|
||||||
|
acc +4
|
||||||
|
jmp -74
|
||||||
|
acc -16
|
||||||
|
acc +37
|
||||||
|
jmp +119
|
||||||
|
acc -13
|
||||||
|
acc +44
|
||||||
|
acc +21
|
||||||
|
acc +38
|
||||||
|
jmp +92
|
||||||
|
acc +30
|
||||||
|
jmp +444
|
||||||
|
jmp +35
|
||||||
|
acc +3
|
||||||
|
acc +11
|
||||||
|
acc +31
|
||||||
|
jmp -104
|
||||||
|
acc -10
|
||||||
|
acc +5
|
||||||
|
acc +8
|
||||||
|
acc +31
|
||||||
|
jmp +127
|
||||||
|
nop +168
|
||||||
|
acc +16
|
||||||
|
acc +6
|
||||||
|
acc +0
|
||||||
|
jmp +455
|
||||||
|
acc +15
|
||||||
|
acc +0
|
||||||
|
acc +22
|
||||||
|
acc -1
|
||||||
|
jmp +191
|
||||||
|
acc +16
|
||||||
|
jmp +56
|
||||||
|
acc -12
|
||||||
|
acc +40
|
||||||
|
nop -140
|
||||||
|
acc +44
|
||||||
|
jmp +138
|
||||||
|
acc +44
|
||||||
|
jmp +237
|
||||||
|
acc +15
|
||||||
|
acc +40
|
||||||
|
jmp +360
|
||||||
|
acc +14
|
||||||
|
acc +14
|
||||||
|
jmp +185
|
||||||
|
nop +211
|
||||||
|
acc +27
|
||||||
|
acc -8
|
||||||
|
acc +17
|
||||||
|
jmp +247
|
||||||
|
acc +50
|
||||||
|
acc -2
|
||||||
|
jmp -49
|
||||||
|
acc +37
|
||||||
|
jmp +330
|
||||||
|
acc +14
|
||||||
|
acc +44
|
||||||
|
acc +15
|
||||||
|
nop -43
|
||||||
|
jmp +382
|
||||||
|
jmp -45
|
||||||
|
acc +46
|
||||||
|
acc -11
|
||||||
|
acc +47
|
||||||
|
jmp +61
|
||||||
|
nop +252
|
||||||
|
acc +44
|
||||||
|
acc -13
|
||||||
|
jmp +292
|
||||||
|
acc -6
|
||||||
|
jmp +199
|
||||||
|
acc +44
|
||||||
|
acc +28
|
||||||
|
acc +17
|
||||||
|
acc +31
|
||||||
|
jmp -158
|
||||||
|
acc -8
|
||||||
|
jmp +338
|
||||||
|
acc +0
|
||||||
|
acc -2
|
||||||
|
nop +306
|
||||||
|
jmp -78
|
||||||
|
acc +11
|
||||||
|
acc +33
|
||||||
|
acc +40
|
||||||
|
acc +33
|
||||||
|
jmp -169
|
||||||
|
jmp +273
|
||||||
|
acc +8
|
||||||
|
jmp -135
|
||||||
|
acc +20
|
||||||
|
acc -14
|
||||||
|
acc -15
|
||||||
|
nop +370
|
||||||
|
jmp +20
|
||||||
|
nop +51
|
||||||
|
acc -4
|
||||||
|
acc -10
|
||||||
|
jmp -215
|
||||||
|
acc +22
|
||||||
|
acc +22
|
||||||
|
jmp +209
|
||||||
|
acc +40
|
||||||
|
acc -18
|
||||||
|
jmp -158
|
||||||
|
jmp -130
|
||||||
|
acc +13
|
||||||
|
jmp -169
|
||||||
|
nop +225
|
||||||
|
acc +7
|
||||||
|
jmp -23
|
||||||
|
acc +21
|
||||||
|
acc +0
|
||||||
|
jmp +273
|
||||||
|
jmp +293
|
||||||
|
acc +39
|
||||||
|
jmp -71
|
||||||
|
acc +20
|
||||||
|
jmp +49
|
||||||
|
acc +6
|
||||||
|
jmp -60
|
||||||
|
acc +35
|
||||||
|
jmp +84
|
||||||
|
acc +14
|
||||||
|
jmp +266
|
||||||
|
acc +47
|
||||||
|
jmp -247
|
||||||
|
acc -3
|
||||||
|
acc +47
|
||||||
|
acc +23
|
||||||
|
acc +30
|
||||||
|
jmp +105
|
||||||
|
acc +18
|
||||||
|
jmp +109
|
||||||
|
jmp -188
|
||||||
|
nop -70
|
||||||
|
acc -2
|
||||||
|
acc +0
|
||||||
|
jmp +195
|
||||||
|
acc +15
|
||||||
|
jmp +246
|
||||||
|
acc +49
|
||||||
|
acc +28
|
||||||
|
jmp -18
|
||||||
|
nop +120
|
||||||
|
jmp +91
|
||||||
|
acc -15
|
||||||
|
acc +15
|
||||||
|
acc +30
|
||||||
|
jmp +39
|
||||||
|
acc +46
|
||||||
|
nop +250
|
||||||
|
acc +49
|
||||||
|
jmp -250
|
||||||
|
acc -10
|
||||||
|
acc +0
|
||||||
|
acc +39
|
||||||
|
jmp -254
|
||||||
|
nop +55
|
||||||
|
acc -4
|
||||||
|
acc -3
|
||||||
|
jmp +88
|
||||||
|
jmp +35
|
||||||
|
acc +47
|
||||||
|
nop -154
|
||||||
|
acc -16
|
||||||
|
jmp +271
|
||||||
|
nop +253
|
||||||
|
jmp -199
|
||||||
|
acc +5
|
||||||
|
acc +35
|
||||||
|
jmp +1
|
||||||
|
acc +49
|
||||||
|
jmp +234
|
||||||
|
acc +27
|
||||||
|
acc +33
|
||||||
|
acc -3
|
||||||
|
jmp -138
|
||||||
|
jmp -107
|
||||||
|
acc -11
|
||||||
|
acc +47
|
||||||
|
acc +14
|
||||||
|
jmp -288
|
||||||
|
jmp -205
|
||||||
|
acc +0
|
||||||
|
jmp +191
|
||||||
|
acc -15
|
||||||
|
jmp -116
|
||||||
|
acc +35
|
||||||
|
nop +121
|
||||||
|
acc +2
|
||||||
|
acc -14
|
||||||
|
jmp +223
|
||||||
|
acc +33
|
||||||
|
acc -10
|
||||||
|
acc +24
|
||||||
|
jmp +73
|
||||||
|
acc +39
|
||||||
|
jmp +255
|
||||||
|
acc +19
|
||||||
|
jmp -16
|
||||||
|
nop +1
|
||||||
|
jmp -177
|
||||||
|
nop +107
|
||||||
|
nop -194
|
||||||
|
jmp +260
|
||||||
|
acc -16
|
||||||
|
acc -12
|
||||||
|
jmp -148
|
||||||
|
acc +11
|
||||||
|
acc +18
|
||||||
|
acc +33
|
||||||
|
jmp +84
|
||||||
|
acc +27
|
||||||
|
acc -13
|
||||||
|
acc +36
|
||||||
|
acc +26
|
||||||
|
jmp +100
|
||||||
|
nop -110
|
||||||
|
jmp -98
|
||||||
|
acc -2
|
||||||
|
acc +29
|
||||||
|
acc +25
|
||||||
|
acc -8
|
||||||
|
jmp +128
|
||||||
|
acc +16
|
||||||
|
acc +1
|
||||||
|
acc +7
|
||||||
|
jmp -290
|
||||||
|
acc +18
|
||||||
|
nop -235
|
||||||
|
acc +0
|
||||||
|
jmp -127
|
||||||
|
acc -18
|
||||||
|
acc +38
|
||||||
|
jmp -297
|
||||||
|
acc +19
|
||||||
|
acc -8
|
||||||
|
acc +20
|
||||||
|
acc +3
|
||||||
|
jmp -230
|
||||||
|
jmp -67
|
||||||
|
jmp +124
|
||||||
|
acc -15
|
||||||
|
acc +26
|
||||||
|
acc -19
|
||||||
|
jmp +120
|
||||||
|
jmp +173
|
||||||
|
jmp -338
|
||||||
|
acc -15
|
||||||
|
jmp -309
|
||||||
|
acc +19
|
||||||
|
acc +26
|
||||||
|
acc +18
|
||||||
|
acc +8
|
||||||
|
jmp -6
|
||||||
|
acc -7
|
||||||
|
acc +10
|
||||||
|
jmp -375
|
||||||
|
acc +5
|
||||||
|
acc -16
|
||||||
|
acc +18
|
||||||
|
acc +46
|
||||||
|
jmp -309
|
||||||
|
acc +48
|
||||||
|
acc +40
|
||||||
|
nop -227
|
||||||
|
jmp -380
|
||||||
|
jmp -290
|
||||||
|
acc +46
|
||||||
|
acc +5
|
||||||
|
jmp -154
|
||||||
|
acc -9
|
||||||
|
acc +15
|
||||||
|
jmp -187
|
||||||
|
acc -10
|
||||||
|
acc +0
|
||||||
|
acc +28
|
||||||
|
acc +30
|
||||||
|
jmp -284
|
||||||
|
acc +43
|
||||||
|
acc +25
|
||||||
|
acc +14
|
||||||
|
jmp -205
|
||||||
|
acc -13
|
||||||
|
acc +1
|
||||||
|
nop -340
|
||||||
|
jmp -326
|
||||||
|
jmp +1
|
||||||
|
acc +9
|
||||||
|
acc +17
|
||||||
|
acc +1
|
||||||
|
jmp -346
|
||||||
|
jmp -158
|
||||||
|
acc +23
|
||||||
|
jmp -26
|
||||||
|
nop -257
|
||||||
|
jmp +140
|
||||||
|
acc +11
|
||||||
|
acc +10
|
||||||
|
acc +29
|
||||||
|
acc +48
|
||||||
|
jmp +177
|
||||||
|
acc +28
|
||||||
|
acc -12
|
||||||
|
acc -19
|
||||||
|
acc +37
|
||||||
|
jmp +79
|
||||||
|
acc -14
|
||||||
|
jmp -184
|
||||||
|
nop +153
|
||||||
|
jmp -170
|
||||||
|
acc -17
|
||||||
|
acc +10
|
||||||
|
acc -6
|
||||||
|
nop -174
|
||||||
|
jmp -391
|
||||||
|
jmp +148
|
||||||
|
acc +50
|
||||||
|
acc -8
|
||||||
|
jmp -426
|
||||||
|
jmp +1
|
||||||
|
acc +16
|
||||||
|
jmp +20
|
||||||
|
jmp +1
|
||||||
|
jmp -217
|
||||||
|
nop +84
|
||||||
|
jmp +71
|
||||||
|
acc +16
|
||||||
|
acc -7
|
||||||
|
acc +23
|
||||||
|
acc +24
|
||||||
|
jmp -329
|
||||||
|
acc +9
|
||||||
|
acc -7
|
||||||
|
acc -4
|
||||||
|
nop +117
|
||||||
|
jmp -16
|
||||||
|
acc +30
|
||||||
|
nop -222
|
||||||
|
acc +32
|
||||||
|
acc +9
|
||||||
|
jmp -175
|
||||||
|
acc +18
|
||||||
|
acc +15
|
||||||
|
acc +41
|
||||||
|
jmp -192
|
||||||
|
acc -3
|
||||||
|
acc +8
|
||||||
|
acc -13
|
||||||
|
acc +24
|
||||||
|
jmp -210
|
||||||
|
acc +17
|
||||||
|
acc -7
|
||||||
|
acc -19
|
||||||
|
jmp +76
|
||||||
|
acc +26
|
||||||
|
acc +2
|
||||||
|
acc +4
|
||||||
|
jmp +27
|
||||||
|
jmp -104
|
||||||
|
acc +38
|
||||||
|
acc +46
|
||||||
|
nop -67
|
||||||
|
nop +37
|
||||||
|
jmp -186
|
||||||
|
jmp +5
|
||||||
|
acc +37
|
||||||
|
acc +8
|
||||||
|
acc +30
|
||||||
|
jmp -409
|
||||||
|
acc +44
|
||||||
|
acc +4
|
||||||
|
jmp +109
|
||||||
|
nop -8
|
||||||
|
jmp -395
|
||||||
|
acc +20
|
||||||
|
acc +12
|
||||||
|
acc +16
|
||||||
|
acc +9
|
||||||
|
jmp -87
|
||||||
|
nop -406
|
||||||
|
acc -8
|
||||||
|
jmp -209
|
||||||
|
jmp -137
|
||||||
|
jmp -179
|
||||||
|
acc +44
|
||||||
|
jmp -399
|
||||||
|
nop -141
|
||||||
|
jmp +18
|
||||||
|
jmp +1
|
||||||
|
nop +55
|
||||||
|
jmp +39
|
||||||
|
acc +20
|
||||||
|
acc +40
|
||||||
|
acc +44
|
||||||
|
acc +45
|
||||||
|
jmp +74
|
||||||
|
acc -16
|
||||||
|
jmp -170
|
||||||
|
jmp -48
|
||||||
|
jmp -537
|
||||||
|
acc -9
|
||||||
|
acc +6
|
||||||
|
nop -101
|
||||||
|
acc +2
|
||||||
|
jmp -418
|
||||||
|
jmp -81
|
||||||
|
jmp +1
|
||||||
|
jmp -338
|
||||||
|
nop +43
|
||||||
|
acc +20
|
||||||
|
jmp -109
|
||||||
|
acc -1
|
||||||
|
jmp -343
|
||||||
|
acc +29
|
||||||
|
acc +11
|
||||||
|
nop -439
|
||||||
|
jmp -310
|
||||||
|
jmp -374
|
||||||
|
acc +33
|
||||||
|
nop +25
|
||||||
|
acc -16
|
||||||
|
nop -333
|
||||||
|
jmp -14
|
||||||
|
jmp -5
|
||||||
|
jmp -162
|
||||||
|
nop -432
|
||||||
|
acc +16
|
||||||
|
acc +17
|
||||||
|
jmp -87
|
||||||
|
acc -16
|
||||||
|
nop -265
|
||||||
|
acc +20
|
||||||
|
jmp -356
|
||||||
|
acc +0
|
||||||
|
jmp +5
|
||||||
|
acc +39
|
||||||
|
acc -15
|
||||||
|
jmp -325
|
||||||
|
jmp -39
|
||||||
|
nop -376
|
||||||
|
nop -116
|
||||||
|
acc +38
|
||||||
|
jmp -175
|
||||||
|
jmp -450
|
||||||
|
jmp +1
|
||||||
|
acc +19
|
||||||
|
jmp -58
|
||||||
|
nop -39
|
||||||
|
acc +40
|
||||||
|
acc +42
|
||||||
|
jmp -232
|
||||||
|
acc -14
|
||||||
|
jmp -17
|
||||||
|
acc +4
|
||||||
|
acc -9
|
||||||
|
acc +45
|
||||||
|
jmp -229
|
||||||
|
jmp -18
|
||||||
|
acc +13
|
||||||
|
acc +17
|
||||||
|
jmp -591
|
||||||
|
jmp -604
|
||||||
|
jmp -356
|
||||||
|
acc +1
|
||||||
|
acc +18
|
||||||
|
nop -52
|
||||||
|
acc +39
|
||||||
|
jmp -361
|
||||||
|
jmp -303
|
||||||
|
acc +8
|
||||||
|
nop -477
|
||||||
|
acc +3
|
||||||
|
acc -8
|
||||||
|
jmp -404
|
||||||
|
acc +24
|
||||||
|
acc +5
|
||||||
|
jmp -88
|
||||||
|
acc +27
|
||||||
|
jmp -54
|
||||||
|
jmp -18
|
||||||
|
acc +31
|
||||||
|
acc +40
|
||||||
|
acc +18
|
||||||
|
acc -16
|
||||||
|
jmp +1
|
9
day08/input/test.txt
Normal file
9
day08/input/test.txt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
nop +0
|
||||||
|
acc +1
|
||||||
|
jmp +4
|
||||||
|
acc +3
|
||||||
|
jmp -3
|
||||||
|
acc -99
|
||||||
|
acc +1
|
||||||
|
jmp -4
|
||||||
|
acc +6
|
156
day08/src/main.rs
Normal file
156
day08/src/main.rs
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
use anyhow::{anyhow, Context, Error, Result};
|
||||||
|
|
||||||
|
use std::collections::HashSet;
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::prelude::*;
|
||||||
|
use std::io::BufReader;
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
const INPUT: &str = "input/input.txt";
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
enum Operation {
|
||||||
|
Nop(i32),
|
||||||
|
Acc(i32),
|
||||||
|
Jmp(i32),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for Operation {
|
||||||
|
type Err = Error;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self> {
|
||||||
|
let mut instruction = s.split(" ");
|
||||||
|
let op = instruction.next().context("Failed to parse operation")?;
|
||||||
|
let offset: i32 = instruction
|
||||||
|
.next()
|
||||||
|
.context("Failed to parse operation offset")?
|
||||||
|
.parse()?;
|
||||||
|
match op {
|
||||||
|
"nop" => Ok(Operation::Nop(offset)),
|
||||||
|
"acc" => Ok(Operation::Acc(offset)),
|
||||||
|
"jmp" => Ok(Operation::Jmp(offset)),
|
||||||
|
_ => Err(anyhow!("Unrecognized operation: {}", op)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_infinite_loop(program: &Vec<Operation>) -> i32 {
|
||||||
|
let mut accumulator: i32 = 0;
|
||||||
|
let mut pointer: i32 = 0;
|
||||||
|
let mut visited = HashSet::new();
|
||||||
|
while !visited.contains(&pointer) {
|
||||||
|
visited.insert(pointer);
|
||||||
|
match program[pointer as usize] {
|
||||||
|
Operation::Nop(_) => pointer += 1,
|
||||||
|
Operation::Acc(offset) => {
|
||||||
|
accumulator += offset;
|
||||||
|
pointer += 1;
|
||||||
|
}
|
||||||
|
Operation::Jmp(offset) => pointer += offset,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
accumulator
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_terminated_value(program: &Vec<Operation>, flip_pointer: i32) -> Option<i32> {
|
||||||
|
let mut accumulator: i32 = 0;
|
||||||
|
let mut pointer: i32 = 0;
|
||||||
|
let mut visited = HashSet::new();
|
||||||
|
while !visited.contains(&pointer) {
|
||||||
|
if pointer == program.len() as i32 {
|
||||||
|
return Some(accumulator);
|
||||||
|
} else if pointer >= program.len() as i32 || pointer < 0 {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
visited.insert(pointer);
|
||||||
|
match program[pointer as usize] {
|
||||||
|
Operation::Nop(offset) if flip_pointer == pointer => pointer += offset,
|
||||||
|
Operation::Nop(_) => pointer += 1,
|
||||||
|
Operation::Acc(offset) => {
|
||||||
|
accumulator += offset;
|
||||||
|
pointer += 1;
|
||||||
|
}
|
||||||
|
Operation::Jmp(_) if flip_pointer == pointer => pointer += 1,
|
||||||
|
Operation::Jmp(offset) => pointer += offset,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
fn solve_part1(input_path: &str) -> Result<i32> {
|
||||||
|
let file = File::open(input_path)?;
|
||||||
|
let reader = BufReader::new(file);
|
||||||
|
let program: Vec<Operation> = reader
|
||||||
|
.lines()
|
||||||
|
.map(|line| Operation::from_str(&line.unwrap()).unwrap())
|
||||||
|
.collect();
|
||||||
|
Ok(find_infinite_loop(&program))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn solve_part2(input_path: &str) -> Result<i32> {
|
||||||
|
let file = File::open(input_path)?;
|
||||||
|
let reader = BufReader::new(file);
|
||||||
|
|
||||||
|
let program: Vec<Operation> = reader
|
||||||
|
.lines()
|
||||||
|
.map(|line| Operation::from_str(&line.unwrap()).unwrap())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let mut flip_pointer: i32 = 0;
|
||||||
|
while flip_pointer < program.len() as i32 {
|
||||||
|
if let Some(result) = find_terminated_value(&program, flip_pointer) {
|
||||||
|
return Ok(result);
|
||||||
|
} else {
|
||||||
|
flip_pointer += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(anyhow!("No fix found"))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("Part 1: {}", solve_part1(INPUT).unwrap());
|
||||||
|
println!("Part 2: {}", solve_part2(INPUT).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
const TEST_INPUT: &str = "input/test.txt";
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parses_input() {
|
||||||
|
let file = File::open(TEST_INPUT).unwrap();
|
||||||
|
let reader = BufReader::new(file);
|
||||||
|
|
||||||
|
let instructions: Vec<Operation> = reader
|
||||||
|
.lines()
|
||||||
|
.map(|line| Operation::from_str(&line.unwrap()).unwrap())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
instructions,
|
||||||
|
vec![
|
||||||
|
Operation::Nop(0),
|
||||||
|
Operation::Acc(1),
|
||||||
|
Operation::Jmp(4),
|
||||||
|
Operation::Acc(3),
|
||||||
|
Operation::Jmp(-3),
|
||||||
|
Operation::Acc(-99),
|
||||||
|
Operation::Acc(1),
|
||||||
|
Operation::Jmp(-4),
|
||||||
|
Operation::Acc(6),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn solves_part1() {
|
||||||
|
assert_eq!(solve_part1(TEST_INPUT).unwrap(), 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn solves_part2() {
|
||||||
|
assert_eq!(solve_part2(TEST_INPUT).unwrap(), 8);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user