1
0
Fork 0

Compare commits

...

2 Commits

Author SHA1 Message Date
chylex a9b398d1ad
Add 2020 - Day 8 - Part 2 2022-02-26 17:57:43 +01:00
chylex b5b7b9c4a0
Add 2020 - Day 8 - Part 1 2022-02-26 16:59:50 +01:00
5 changed files with 857 additions and 1 deletions

View File

@ -0,0 +1,18 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="2020 - Day 08" type="CargoCommandRunConfiguration" factoryName="Cargo Command">
<option name="command" value="run --bin 08" />
<option name="workingDirectory" value="file://$PROJECT_DIR$/2020/08" />
<option name="channel" value="DEFAULT" />
<option name="requiredFeatures" value="true" />
<option name="allFeatures" value="false" />
<option name="emulateTerminal" value="false" />
<option name="withSudo" value="false" />
<option name="backtrace" value="SHORT" />
<envs />
<option name="isRedirectInput" value="false" />
<option name="redirectInputPath" value="" />
<method v="2">
<option name="CARGO.BUILD_TASK_PROVIDER" enabled="true" />
</method>
</configuration>
</component>

675
2020/08/input/1.txt Normal file
View File

@ -0,0 +1,675 @@
acc -8
jmp +5
acc +0
acc +44
acc +42
jmp +324
acc -17
jmp +1
acc -17
jmp +51
acc -13
acc +4
jmp +1
nop +608
jmp +274
acc -17
jmp +169
acc +28
nop +508
jmp +1
jmp +570
acc +22
acc -14
jmp +377
acc -13
acc +27
jmp +474
acc -5
jmp +1
acc +12
jmp +37
jmp +184
acc +36
acc +32
acc -8
jmp +465
acc -13
acc +18
jmp +169
acc +20
acc +26
acc +23
jmp +333
jmp +584
acc +9
acc +28
acc +28
nop +571
jmp +143
acc +39
acc +39
acc -16
jmp +361
acc +48
acc +3
acc +15
nop +4
jmp +504
acc +6
jmp +285
acc +26
acc +33
jmp +1
acc +36
jmp +577
acc +36
jmp +6
nop +498
acc +42
jmp +496
acc +10
jmp +74
acc +17
acc +16
acc +30
jmp +254
acc -3
acc +16
acc -2
nop +106
jmp +541
acc -15
jmp +579
jmp +165
acc +22
acc -6
acc +29
acc -19
jmp +342
acc -19
jmp +340
acc +13
acc +25
acc +29
jmp +269
acc -14
acc +27
acc +41
acc +49
jmp +181
nop +350
jmp +1
nop +437
acc +34
jmp +494
acc +19
acc +2
acc +44
jmp +558
acc +10
jmp +44
nop +4
nop -80
nop +540
jmp +16
acc +28
jmp +14
acc +13
nop +399
acc +29
nop -60
jmp -6
acc +41
acc +30
jmp +232
acc +28
nop +495
acc +15
acc +48
jmp +157
nop +483
jmp -59
acc +5
acc +30
acc +30
acc +2
jmp +349
acc +11
acc +27
acc +1
jmp +367
acc +8
acc +45
acc +11
jmp +171
jmp -113
acc +48
jmp -38
acc +12
jmp +145
acc +8
nop +29
nop +319
jmp +154
nop +166
jmp +395
nop +15
jmp +237
acc +22
acc +3
acc +42
acc +1
jmp +288
jmp -63
nop +489
acc +33
jmp +247
jmp +1
acc -8
acc +9
jmp +413
acc -17
acc +3
acc +3
jmp +432
nop -17
acc +36
nop +198
acc +45
jmp +109
nop +242
acc +40
acc +11
jmp +448
jmp +437
acc +3
acc +49
acc +27
jmp +221
nop +158
jmp +143
acc +50
jmp -70
acc +46
acc +8
acc +35
acc -3
jmp +104
acc +11
acc +0
jmp +34
nop +132
jmp +425
jmp +219
acc -12
acc +48
jmp +21
jmp +434
acc +30
acc +1
acc +40
jmp +435
jmp +132
acc +40
jmp +236
jmp +179
jmp -149
acc +25
acc +40
acc -9
acc +49
jmp +445
nop +399
acc -14
nop +374
acc +0
jmp +152
acc +39
nop +322
acc +49
nop +117
jmp -19
acc +24
jmp +385
acc +17
acc +39
acc +44
acc -8
jmp -58
acc -18
nop -76
jmp +66
acc +14
jmp +427
acc +11
acc +47
acc +9
jmp +1
acc +42
jmp -7
acc -16
acc -13
jmp +409
acc +1
acc +35
acc +34
jmp +371
acc +24
acc +46
acc -4
jmp +367
acc +19
acc +27
acc -8
acc +41
jmp -184
nop -185
acc +23
acc -8
acc +35
jmp -9
acc -7
nop -101
nop +121
acc +37
jmp -72
acc +24
jmp +1
nop -124
jmp +163
acc +37
acc -12
jmp +331
acc -12
acc +1
jmp +232
jmp -233
jmp -72
acc +28
jmp +169
acc +43
acc +18
nop +108
jmp -184
acc -4
acc -10
nop +317
acc +48
jmp +173
nop +45
jmp -73
acc +35
jmp +198
acc -15
acc +46
acc +31
jmp +41
nop +169
jmp +1
nop -92
nop -271
jmp -113
jmp +1
nop -42
jmp +42
nop -283
acc +22
nop +200
jmp -17
jmp +1
acc +49
nop +35
nop -185
jmp +298
acc +1
jmp +1
nop +301
acc +19
jmp -34
jmp +163
jmp +1
acc +49
jmp -115
jmp -62
acc +8
acc +5
acc -6
jmp -146
acc -4
nop -202
acc +47
jmp -114
acc +8
jmp +57
acc +37
jmp +61
jmp +267
acc +2
acc +28
nop -20
jmp -186
acc +24
nop +269
acc +48
acc +45
jmp -22
acc +11
acc +36
jmp -267
acc +7
nop -45
nop -231
jmp +32
nop +220
acc +19
jmp -250
acc +33
jmp -169
acc +45
acc -13
acc +0
acc +44
jmp +6
acc +42
jmp +84
acc +48
jmp -332
jmp +213
acc -16
acc +31
acc +17
acc +3
jmp -75
jmp +1
acc +11
acc +4
jmp -271
acc -12
nop +97
nop +11
jmp -43
acc +30
jmp +1
jmp +49
jmp -379
nop -51
acc +0
acc -8
nop -191
jmp -346
jmp -255
acc +2
acc +21
acc -16
nop +217
jmp -30
acc +31
jmp -270
jmp -324
jmp +130
acc +49
nop +179
jmp -37
acc +11
acc +15
acc +29
acc +17
jmp -237
acc +47
acc -13
acc +6
jmp +169
nop +54
acc -12
jmp -233
nop +33
acc +17
acc +14
acc +21
jmp -275
acc -8
acc +1
nop +229
jmp +1
jmp +119
jmp -193
nop +217
jmp +95
acc -2
acc +1
acc +41
jmp -332
acc +44
nop -343
acc +23
jmp -165
acc +7
acc -12
nop -339
jmp +9
nop -390
acc -17
acc +43
jmp -138
nop -247
acc +42
acc +0
jmp +170
acc +48
jmp -139
acc +6
acc +13
acc +35
jmp -85
nop -117
jmp -307
acc +25
acc -10
acc -14
acc +0
jmp -355
jmp +102
acc -8
acc +47
acc +36
jmp +42
acc +33
acc +17
acc +46
jmp -331
jmp +1
acc -11
jmp +1
acc +27
jmp +147
acc -14
nop -28
acc +32
jmp -482
acc +11
nop -390
jmp -485
acc -12
acc +37
acc +33
acc +28
jmp -32
acc +42
acc -11
jmp -460
acc +36
acc +6
acc +39
jmp +80
nop +123
acc -13
jmp -97
acc +25
acc +46
acc +13
nop -450
jmp +84
acc +3
nop -260
jmp +1
acc +22
jmp -510
acc -4
acc +17
acc -19
jmp -420
acc -14
acc +26
acc +29
acc +17
jmp -458
acc -10
acc +23
nop -2
jmp -196
acc -5
jmp -416
acc +49
jmp -165
acc +4
acc +7
acc +20
nop -217
jmp +103
jmp +5
acc -1
acc +2
jmp +1
jmp +84
acc -14
jmp -518
jmp +1
acc +30
acc +21
jmp -202
nop -18
jmp -344
jmp -88
nop -472
acc -5
acc +13
jmp -295
nop -315
acc +41
nop -317
jmp -299
nop +105
jmp -86
acc +7
jmp -226
nop -277
acc +21
acc +13
acc +47
jmp -283
acc -11
acc -1
jmp -408
acc +47
nop -553
acc +37
acc -11
jmp -468
acc +43
nop -299
acc +40
acc +2
jmp -275
acc +24
acc -14
acc +13
acc +36
jmp -249
acc +35
jmp -45
acc +47
acc +31
acc -19
jmp -151
jmp -33
acc +6
jmp -160
jmp -553
acc +25
jmp +1
nop -267
jmp -430
acc +23
nop +63
acc +37
jmp -434
nop -579
jmp +11
acc +25
acc -17
acc +22
acc +27
jmp +15
jmp -546
acc -4
acc +41
acc +0
jmp -261
acc +20
jmp -404
jmp -408
acc +26
jmp -464
acc +34
nop -80
acc -12
jmp -43
jmp -410
acc -13
acc -3
jmp -310
nop -433
acc -7
acc -11
acc +9
jmp -29
nop -564
acc -5
acc -16
acc +36
jmp -587
jmp -115
acc +24
acc +35
nop -638
jmp -573
acc +31
acc +14
jmp -609
acc +25
acc -10
acc +18
jmp -308
acc +25
acc +33
acc +21
acc -12
jmp -172
nop -37
acc +12
jmp -316
acc +41
acc +14
jmp -415
acc +40
jmp -112
jmp -613
acc +26
nop -151
jmp -471
acc +50
acc +16
nop -119
acc +46
jmp +1

159
2020/08/main.rs Normal file
View File

@ -0,0 +1,159 @@
use std::collections::HashSet;
use std::error::Error;
use std::str::FromStr;
use crate::utils::GenericError;
#[path = "../utils/mod.rs"]
mod utils;
fn main() -> Result<(), Box<dyn Error>> {
let instructions = utils::parse_input_lines::<Instruction>()?;
find_infinite_loop(&instructions);
fix_infinite_loop(&instructions);
Ok(())
}
fn find_infinite_loop(instructions: &Vec<Instruction>) {
let mut state = State::new();
if state.execute_program(&instructions) == ProgramExecutionResult::InfiniteLoop {
println!("State of accumulator before visiting instruction on line {} for the second time: {}", state.ip + 1, state.acc);
}
}
fn fix_infinite_loop(instructions: &Vec<Instruction>) {
let mut instructions = instructions.clone();
for i in 0..instructions.len() {
let instruction = instructions.get(i).unwrap();
let replacement_opcode = match instruction.opcode {
Opcode::Nop => Some(Opcode::Jmp),
Opcode::Acc => None,
Opcode::Jmp => Some(Opcode::Nop)
};
if let Some(replacement_opcode) = replacement_opcode {
let mut state = State::new();
let instruction = instruction.clone();
instructions[i] = Instruction {
opcode: replacement_opcode,
offset: instruction.offset
};
if state.execute_program(&instructions) == ProgramExecutionResult::SuccessfulTermination {
println!("State of accumulator after a successful termination with patched instruction on on line {}: {}", i + 1, state.acc);
return;
}
instructions[i] = instruction;
}
}
println!("No version of the program terminated successfully.");
}
#[derive(Copy, Clone)]
enum Opcode {
Nop,
Acc,
Jmp,
}
impl FromStr for Opcode {
type Err = GenericError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"nop" => Ok(Opcode::Nop),
"acc" => Ok(Opcode::Acc),
"jmp" => Ok(Opcode::Jmp),
_ => Err(GenericError::new(format!("Unknown opcode: {}", s)))
}
}
}
#[derive(Copy, Clone)]
struct Instruction {
opcode: Opcode,
offset: i32,
}
impl Instruction {
fn apply(&self, state: &mut State) {
match self.opcode {
Opcode::Nop => {
state.ip += 1;
}
Opcode::Acc => {
state.acc += self.offset;
state.ip += 1;
}
Opcode::Jmp => {
state.ip += self.offset;
}
}
}
}
impl FromStr for Instruction {
type Err = GenericError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let (opcode_str, offset_str) = s.split_once(' ').ok_or(GenericError::new(format!("Missing space in instruction: {}", s)))?;
let opcode = opcode_str.parse::<Opcode>()?;
let offset = offset_str.parse::<i32>().map_err(|_| GenericError::new(format!("Invalid offset: {}", offset_str)))?;
Ok(Instruction { opcode, offset })
}
}
#[derive(Eq, PartialEq)]
enum ProgramExecutionResult {
InvalidInstructionPointer,
SuccessfulTermination,
InfiniteLoop,
}
struct State {
ip: i32,
acc: i32,
visited_ips: HashSet<i32>,
}
impl State {
fn new() -> Self {
State {
acc: 0,
ip: 0,
visited_ips: HashSet::new(),
}
}
fn execute_instruction(&mut self, instructions: &Vec<Instruction>) -> Option<ProgramExecutionResult> {
return if !self.visited_ips.insert(self.ip) {
Some(ProgramExecutionResult::InfiniteLoop)
} else if self.ip < 0 {
Some(ProgramExecutionResult::InvalidInstructionPointer)
} else if let Some(instruction) = instructions.get(self.ip as usize) {
instruction.apply(self);
None
} else {
Some(ProgramExecutionResult::SuccessfulTermination)
};
}
fn execute_program(&mut self, instructions: &Vec<Instruction>) -> ProgramExecutionResult {
loop {
if let Some(result) = self.execute_instruction(&instructions) {
return result;
}
}
}
}

View File

@ -33,3 +33,7 @@ path = "06/main.rs"
[[bin]]
name = "07"
path = "07/main.rs"
[[bin]]
name = "08"
path = "08/main.rs"

View File

@ -42,4 +42,4 @@ The versions should not matter, but I used Visual Studio 2019 with `MSVC v142 (1
| | | | / | 2020 | 05 | Rust | / | 2021 | 05 | Kotlin |
| | | | / | 2020 | 06 | Rust | / | 2021 | 06 | Kotlin |
| | | | / | 2020 | 07 | Rust | / | 2021 | 07 | Kotlin |
| | | | / | | | | / | 2021 | 08 | Kotlin |
| | | | / | 2020 | 08 | Rust | / | 2021 | 08 | Kotlin |