day 8
This commit is contained in:
parent
7d95539e66
commit
7cd9de454c
641
data/day8/input
Normal file
641
data/day8/input
Normal file
@ -0,0 +1,641 @@
|
||||
acc +3
|
||||
jmp +599
|
||||
nop +311
|
||||
jmp +605
|
||||
acc -3
|
||||
acc +50
|
||||
acc -6
|
||||
jmp +461
|
||||
jmp -4
|
||||
acc -7
|
||||
jmp +1
|
||||
acc +19
|
||||
acc -18
|
||||
jmp +485
|
||||
nop +182
|
||||
jmp +174
|
||||
acc +41
|
||||
acc +10
|
||||
nop +570
|
||||
jmp +428
|
||||
acc +18
|
||||
acc +33
|
||||
jmp +197
|
||||
jmp +202
|
||||
acc +43
|
||||
acc -19
|
||||
acc -12
|
||||
jmp +453
|
||||
acc +8
|
||||
jmp +55
|
||||
acc +5
|
||||
nop +482
|
||||
acc -11
|
||||
jmp +475
|
||||
acc -5
|
||||
acc +38
|
||||
acc -16
|
||||
nop +111
|
||||
jmp +230
|
||||
acc +41
|
||||
acc -4
|
||||
jmp +16
|
||||
nop +147
|
||||
jmp -15
|
||||
nop -28
|
||||
jmp +96
|
||||
acc +34
|
||||
acc +27
|
||||
jmp -25
|
||||
jmp +8
|
||||
acc +8
|
||||
nop +28
|
||||
jmp +515
|
||||
jmp +247
|
||||
jmp +474
|
||||
nop +392
|
||||
jmp +57
|
||||
nop +271
|
||||
acc +20
|
||||
jmp +514
|
||||
acc +22
|
||||
jmp +337
|
||||
acc +47
|
||||
acc +43
|
||||
acc +42
|
||||
nop +263
|
||||
jmp +144
|
||||
acc +26
|
||||
acc +49
|
||||
acc +22
|
||||
jmp +170
|
||||
nop +502
|
||||
acc +26
|
||||
acc -3
|
||||
jmp +96
|
||||
acc -9
|
||||
nop +213
|
||||
acc +1
|
||||
jmp +111
|
||||
nop +189
|
||||
jmp +533
|
||||
acc -18
|
||||
acc -15
|
||||
jmp +209
|
||||
nop +464
|
||||
jmp +463
|
||||
acc +16
|
||||
acc +39
|
||||
acc +36
|
||||
jmp +499
|
||||
acc +42
|
||||
jmp +1
|
||||
jmp +444
|
||||
acc +33
|
||||
acc -5
|
||||
nop +513
|
||||
acc +17
|
||||
jmp +377
|
||||
jmp +410
|
||||
acc -5
|
||||
jmp +312
|
||||
jmp +235
|
||||
acc -4
|
||||
acc +32
|
||||
acc +40
|
||||
jmp +477
|
||||
jmp +388
|
||||
jmp +112
|
||||
acc +45
|
||||
acc +36
|
||||
jmp -68
|
||||
nop +296
|
||||
jmp +496
|
||||
acc -19
|
||||
acc +1
|
||||
acc -8
|
||||
jmp +1
|
||||
jmp +479
|
||||
jmp +195
|
||||
acc -13
|
||||
acc +50
|
||||
acc +30
|
||||
jmp +167
|
||||
jmp +217
|
||||
acc +17
|
||||
acc +8
|
||||
jmp +22
|
||||
acc +46
|
||||
acc -5
|
||||
jmp +53
|
||||
jmp +152
|
||||
acc +29
|
||||
acc +1
|
||||
acc +24
|
||||
jmp +278
|
||||
acc +20
|
||||
jmp +95
|
||||
acc +15
|
||||
jmp +1
|
||||
acc +36
|
||||
jmp +286
|
||||
acc +44
|
||||
acc +33
|
||||
jmp +117
|
||||
acc +12
|
||||
acc +16
|
||||
jmp +1
|
||||
jmp +284
|
||||
acc -15
|
||||
nop +478
|
||||
acc -17
|
||||
jmp +13
|
||||
nop +274
|
||||
nop +217
|
||||
nop +91
|
||||
jmp -113
|
||||
nop -58
|
||||
acc +11
|
||||
acc +28
|
||||
nop +301
|
||||
jmp +132
|
||||
acc -7
|
||||
acc +18
|
||||
jmp +173
|
||||
acc +39
|
||||
nop +435
|
||||
jmp +388
|
||||
acc +15
|
||||
acc +50
|
||||
jmp +152
|
||||
acc -8
|
||||
acc -10
|
||||
acc +15
|
||||
acc +39
|
||||
jmp +166
|
||||
acc +14
|
||||
jmp +310
|
||||
nop +371
|
||||
acc +26
|
||||
jmp +161
|
||||
acc +37
|
||||
jmp -147
|
||||
acc -12
|
||||
acc +37
|
||||
nop -78
|
||||
jmp +11
|
||||
acc +5
|
||||
nop -130
|
||||
jmp +182
|
||||
acc +23
|
||||
acc +17
|
||||
jmp -14
|
||||
acc +42
|
||||
acc +16
|
||||
acc +40
|
||||
jmp -39
|
||||
nop +325
|
||||
acc +15
|
||||
jmp +70
|
||||
acc +39
|
||||
acc +13
|
||||
nop +211
|
||||
jmp +210
|
||||
acc -18
|
||||
nop +384
|
||||
acc +28
|
||||
jmp -98
|
||||
acc +21
|
||||
acc +12
|
||||
jmp +217
|
||||
acc +22
|
||||
acc +4
|
||||
acc +12
|
||||
jmp +421
|
||||
acc +26
|
||||
nop +298
|
||||
acc +1
|
||||
acc +43
|
||||
jmp -15
|
||||
acc +39
|
||||
nop +217
|
||||
nop +31
|
||||
acc +17
|
||||
jmp -189
|
||||
jmp -68
|
||||
acc -14
|
||||
jmp +287
|
||||
nop +62
|
||||
acc +20
|
||||
acc +50
|
||||
jmp -5
|
||||
acc +26
|
||||
acc -14
|
||||
acc +24
|
||||
acc -2
|
||||
jmp -181
|
||||
acc +12
|
||||
nop -89
|
||||
acc +13
|
||||
jmp -50
|
||||
acc +39
|
||||
jmp +233
|
||||
nop -214
|
||||
acc +47
|
||||
jmp +216
|
||||
acc +21
|
||||
acc +30
|
||||
nop +347
|
||||
acc +34
|
||||
jmp -240
|
||||
nop -196
|
||||
jmp +345
|
||||
acc +48
|
||||
acc +43
|
||||
acc +4
|
||||
nop +266
|
||||
jmp +72
|
||||
acc +7
|
||||
acc +43
|
||||
jmp +1
|
||||
acc +44
|
||||
acc +1
|
||||
acc +21
|
||||
jmp +358
|
||||
acc +20
|
||||
acc +28
|
||||
acc +48
|
||||
jmp +266
|
||||
acc +14
|
||||
acc +30
|
||||
jmp +167
|
||||
nop +18
|
||||
acc +17
|
||||
nop +125
|
||||
acc +14
|
||||
jmp -111
|
||||
nop +332
|
||||
acc -12
|
||||
nop -177
|
||||
jmp +355
|
||||
acc -8
|
||||
jmp -125
|
||||
acc +6
|
||||
jmp -185
|
||||
nop +270
|
||||
acc +32
|
||||
acc +19
|
||||
acc -9
|
||||
jmp +339
|
||||
jmp -13
|
||||
nop +23
|
||||
jmp -109
|
||||
acc -4
|
||||
acc +23
|
||||
acc +39
|
||||
nop +305
|
||||
jmp +130
|
||||
nop -57
|
||||
acc +46
|
||||
jmp +301
|
||||
jmp +1
|
||||
jmp +150
|
||||
acc -6
|
||||
nop -184
|
||||
acc +18
|
||||
jmp -123
|
||||
acc +11
|
||||
acc +40
|
||||
jmp -304
|
||||
acc +16
|
||||
acc +26
|
||||
nop -307
|
||||
jmp +3
|
||||
jmp -194
|
||||
jmp -224
|
||||
acc +8
|
||||
acc +22
|
||||
acc +1
|
||||
acc -1
|
||||
jmp +73
|
||||
jmp +41
|
||||
acc +40
|
||||
jmp +80
|
||||
acc +0
|
||||
acc +39
|
||||
acc +6
|
||||
acc +45
|
||||
jmp -186
|
||||
acc +32
|
||||
acc -5
|
||||
jmp -99
|
||||
acc +47
|
||||
acc +17
|
||||
acc +1
|
||||
acc +0
|
||||
jmp +265
|
||||
jmp +264
|
||||
nop +114
|
||||
acc +13
|
||||
jmp -108
|
||||
nop -278
|
||||
acc +29
|
||||
acc -14
|
||||
jmp -297
|
||||
acc +20
|
||||
acc +37
|
||||
nop +175
|
||||
acc -4
|
||||
jmp +9
|
||||
acc -11
|
||||
nop +136
|
||||
acc +2
|
||||
jmp -37
|
||||
acc +48
|
||||
acc +9
|
||||
acc -7
|
||||
jmp +36
|
||||
acc -15
|
||||
jmp -118
|
||||
acc -9
|
||||
jmp -68
|
||||
acc +26
|
||||
nop -1
|
||||
acc +9
|
||||
jmp -15
|
||||
acc +21
|
||||
acc +13
|
||||
acc -2
|
||||
acc -17
|
||||
jmp -365
|
||||
acc +5
|
||||
acc +8
|
||||
jmp +255
|
||||
acc +16
|
||||
nop -312
|
||||
acc -14
|
||||
jmp -19
|
||||
acc +32
|
||||
acc +37
|
||||
acc +9
|
||||
jmp +1
|
||||
jmp -302
|
||||
jmp +1
|
||||
acc +5
|
||||
acc +45
|
||||
acc +42
|
||||
jmp +61
|
||||
acc +20
|
||||
acc +36
|
||||
jmp +156
|
||||
acc -9
|
||||
jmp +117
|
||||
acc -1
|
||||
nop -389
|
||||
jmp +242
|
||||
acc +9
|
||||
acc -18
|
||||
jmp -5
|
||||
jmp -77
|
||||
acc +17
|
||||
acc +30
|
||||
jmp +172
|
||||
acc -1
|
||||
acc +11
|
||||
acc -6
|
||||
jmp -334
|
||||
jmp +215
|
||||
acc +3
|
||||
acc +24
|
||||
jmp +13
|
||||
jmp +1
|
||||
jmp -369
|
||||
acc +49
|
||||
acc -6
|
||||
acc -14
|
||||
acc -6
|
||||
jmp -234
|
||||
acc +13
|
||||
acc +9
|
||||
acc +11
|
||||
nop +78
|
||||
jmp +115
|
||||
nop -332
|
||||
nop +177
|
||||
jmp +109
|
||||
jmp +157
|
||||
nop -372
|
||||
acc +25
|
||||
jmp +166
|
||||
nop +171
|
||||
jmp -253
|
||||
acc +27
|
||||
acc -11
|
||||
acc -4
|
||||
acc +34
|
||||
jmp +98
|
||||
jmp -240
|
||||
acc +41
|
||||
nop -381
|
||||
acc -4
|
||||
nop -270
|
||||
jmp -328
|
||||
acc +31
|
||||
acc +11
|
||||
acc -2
|
||||
nop -163
|
||||
jmp +148
|
||||
jmp +1
|
||||
nop -91
|
||||
jmp -197
|
||||
jmp +132
|
||||
acc +31
|
||||
nop +109
|
||||
acc +43
|
||||
jmp -319
|
||||
acc -19
|
||||
acc +49
|
||||
acc +38
|
||||
acc +48
|
||||
jmp +86
|
||||
acc -1
|
||||
acc -11
|
||||
acc +2
|
||||
jmp -355
|
||||
acc -3
|
||||
acc +11
|
||||
acc +39
|
||||
jmp -110
|
||||
acc +10
|
||||
nop -465
|
||||
nop -121
|
||||
jmp -110
|
||||
acc +0
|
||||
jmp -5
|
||||
nop -278
|
||||
nop -199
|
||||
nop +118
|
||||
acc +6
|
||||
jmp -47
|
||||
jmp +129
|
||||
acc +26
|
||||
jmp -391
|
||||
acc -15
|
||||
acc +8
|
||||
nop -86
|
||||
jmp +115
|
||||
nop -94
|
||||
acc -7
|
||||
acc +14
|
||||
jmp -183
|
||||
acc -16
|
||||
acc +15
|
||||
acc +23
|
||||
jmp -178
|
||||
jmp +1
|
||||
jmp -365
|
||||
jmp +1
|
||||
jmp -320
|
||||
acc +42
|
||||
nop -289
|
||||
acc +21
|
||||
acc -17
|
||||
jmp -440
|
||||
acc +0
|
||||
acc +5
|
||||
acc +35
|
||||
acc +20
|
||||
jmp +29
|
||||
acc -1
|
||||
acc +20
|
||||
acc +44
|
||||
jmp +50
|
||||
jmp -61
|
||||
acc -2
|
||||
acc +41
|
||||
acc -5
|
||||
jmp -410
|
||||
acc +13
|
||||
nop -315
|
||||
acc -2
|
||||
jmp -46
|
||||
acc +20
|
||||
acc +9
|
||||
acc +38
|
||||
nop -279
|
||||
jmp -113
|
||||
acc +48
|
||||
jmp +86
|
||||
jmp -151
|
||||
jmp +1
|
||||
acc -18
|
||||
nop -291
|
||||
jmp -101
|
||||
jmp +49
|
||||
nop -378
|
||||
jmp -445
|
||||
acc +36
|
||||
acc +41
|
||||
nop -286
|
||||
acc -19
|
||||
jmp -142
|
||||
nop -393
|
||||
acc +0
|
||||
acc -3
|
||||
jmp +10
|
||||
acc +17
|
||||
jmp -327
|
||||
jmp -219
|
||||
acc -5
|
||||
nop -123
|
||||
acc +49
|
||||
acc +36
|
||||
jmp -145
|
||||
jmp -496
|
||||
jmp +48
|
||||
acc +10
|
||||
jmp +11
|
||||
jmp -97
|
||||
acc -8
|
||||
acc +22
|
||||
jmp +53
|
||||
jmp -316
|
||||
acc +32
|
||||
acc -15
|
||||
acc +27
|
||||
acc +33
|
||||
jmp -266
|
||||
jmp -10
|
||||
acc +48
|
||||
acc -10
|
||||
acc +7
|
||||
acc +5
|
||||
jmp +28
|
||||
acc -15
|
||||
acc -19
|
||||
acc -8
|
||||
nop -150
|
||||
jmp -388
|
||||
acc +14
|
||||
acc +45
|
||||
acc -11
|
||||
jmp -451
|
||||
acc +42
|
||||
acc -8
|
||||
jmp -104
|
||||
nop -228
|
||||
acc +0
|
||||
jmp -327
|
||||
acc +19
|
||||
acc -7
|
||||
jmp +1
|
||||
jmp -291
|
||||
acc -8
|
||||
jmp -495
|
||||
jmp -61
|
||||
jmp -392
|
||||
acc +1
|
||||
jmp -227
|
||||
acc -10
|
||||
jmp -286
|
||||
jmp -397
|
||||
jmp -539
|
||||
jmp -215
|
||||
acc +15
|
||||
acc +36
|
||||
acc -12
|
||||
acc +5
|
||||
jmp -147
|
||||
acc +28
|
||||
acc -15
|
||||
acc +19
|
||||
jmp +16
|
||||
jmp -493
|
||||
acc +7
|
||||
acc +40
|
||||
acc +23
|
||||
nop -122
|
||||
jmp -567
|
||||
acc -4
|
||||
acc +23
|
||||
jmp -218
|
||||
jmp -13
|
||||
acc -18
|
||||
acc -10
|
||||
acc -13
|
||||
nop -541
|
||||
jmp -105
|
||||
acc +14
|
||||
acc +40
|
||||
acc +0
|
||||
jmp -614
|
||||
acc +3
|
||||
acc +14
|
||||
jmp -357
|
||||
jmp -510
|
||||
jmp -416
|
||||
acc +12
|
||||
nop -245
|
||||
acc +26
|
||||
acc +15
|
||||
jmp +1
|
109
src/bin/day8.rs
Normal file
109
src/bin/day8.rs
Normal file
@ -0,0 +1,109 @@
|
||||
const INPUT: &str = include_str!("../../data/day8/input");
|
||||
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
||||
enum Instruction {
|
||||
Acc(i64),
|
||||
Jmp(isize),
|
||||
Nop(isize),
|
||||
}
|
||||
|
||||
impl Instruction {
|
||||
fn parse(line: &str) -> Self {
|
||||
let line = line.trim();
|
||||
if let Some(param) = line.strip_prefix("acc ") {
|
||||
Instruction::Acc(param.parse().unwrap())
|
||||
} else if let Some(param) = line.strip_prefix("jmp ") {
|
||||
Instruction::Jmp(param.parse().unwrap())
|
||||
} else if let Some(param) = line.strip_prefix("nop ") {
|
||||
Instruction::Nop(param.parse().unwrap())
|
||||
} else {
|
||||
panic!("Unknown instructin: {:?}", line);
|
||||
}
|
||||
}
|
||||
|
||||
fn parse_list(input: &str) -> Vec<Self> {
|
||||
input.lines().map(Self::parse).collect()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
||||
enum EmulationStepResult {
|
||||
Success,
|
||||
EndOfCode,
|
||||
InfiniteLoop,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
struct Emulator<'a> {
|
||||
instructions: &'a [Instruction],
|
||||
visited: Vec<bool>,
|
||||
accumulator: i64,
|
||||
next_instruction: usize,
|
||||
}
|
||||
|
||||
impl<'a> Emulator<'a> {
|
||||
fn new(instructions: &'a [Instruction]) -> Self {
|
||||
let mut visited = Vec::new();
|
||||
visited.resize(instructions.len(), false);
|
||||
Self { instructions, visited, accumulator: 0, next_instruction: 0 }
|
||||
}
|
||||
|
||||
fn step(&mut self) -> EmulationStepResult {
|
||||
if self.next_instruction >= self.instructions.len() {
|
||||
return EmulationStepResult::EndOfCode;
|
||||
}
|
||||
if self.visited[self.next_instruction] {
|
||||
return EmulationStepResult::InfiniteLoop;
|
||||
}
|
||||
self.visited[self.next_instruction] = true;
|
||||
match self.instructions[self.next_instruction] {
|
||||
Instruction::Acc(inc) => {
|
||||
self.accumulator += inc;
|
||||
},
|
||||
Instruction::Jmp(offset) => {
|
||||
let ip = self.next_instruction as isize + offset;
|
||||
assert!(ip >= 0);
|
||||
self.next_instruction = ip as usize;
|
||||
return EmulationStepResult::Success; // don't increment again below
|
||||
},
|
||||
Instruction::Nop(_) => (),
|
||||
}
|
||||
self.next_instruction += 1;
|
||||
EmulationStepResult::Success
|
||||
}
|
||||
|
||||
fn run(&mut self) -> bool {
|
||||
loop {
|
||||
match self.step() {
|
||||
EmulationStepResult::Success => (), // continue
|
||||
EmulationStepResult::InfiniteLoop => return false,
|
||||
EmulationStepResult::EndOfCode => return true,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut instructions = Instruction::parse_list(INPUT);
|
||||
{
|
||||
let mut emu = Emulator::new(&instructions);
|
||||
assert!(!emu.run()); // expecting infinite loop
|
||||
println!("Accumulator at loop: {}", emu.accumulator);
|
||||
}
|
||||
for i in 0..instructions.len() {
|
||||
let orig = instructions[i];
|
||||
instructions[i] = match orig {
|
||||
Instruction::Acc(_) => continue,
|
||||
Instruction::Jmp(a) => Instruction::Nop(a),
|
||||
Instruction::Nop(a) => Instruction::Jmp(a),
|
||||
};
|
||||
{
|
||||
let mut emu = Emulator::new(&instructions);
|
||||
if emu.run() {
|
||||
println!("Found fixed program (modified at {}), accumulator at end: {}", i, emu.accumulator);
|
||||
break;
|
||||
}
|
||||
}
|
||||
instructions[i] = orig;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user