Skip to content
Snippets Groups Projects
Commit 577cd494 authored by Philip Molares's avatar Philip Molares :popcorn:
Browse files

added day08

parent aa0d2e69
No related branches found
No related tags found
No related merge requests found
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "day08"
version = "0.1.0"
[package]
name = "day08"
version = "0.1.0"
authors = ["Philip Molares <philip.molares@udo.edu>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
jmp +248
acc +11
acc +50
acc +44
jmp +531
acc -17
jmp +572
acc +19
acc +9
jmp +221
nop +373
acc +7
jmp +502
acc +39
jmp +12
acc +7
nop +482
jmp +144
acc -4
jmp +85
acc +12
nop +446
nop +162
jmp +270
acc -19
jmp +402
acc +8
acc +28
acc -13
acc +30
jmp +81
acc -15
jmp +20
acc +28
jmp -19
nop +190
acc +2
jmp +61
nop +237
jmp +421
acc +24
jmp +221
acc +1
jmp +1
jmp +265
nop +94
jmp +1
jmp +370
acc +19
nop +39
jmp +454
jmp +162
jmp +196
jmp +7
acc +37
acc +14
jmp +542
acc -10
acc +1
jmp +324
nop -45
acc -5
jmp +303
acc +25
acc +17
nop +74
nop +330
jmp -7
acc +45
jmp +483
acc -4
jmp +230
jmp +61
jmp +1
nop +440
jmp +104
acc +33
jmp +140
acc -8
jmp +19
acc -10
acc +0
acc +8
acc +30
jmp +37
jmp +457
jmp +108
jmp +182
acc +23
acc +38
acc -1
acc +8
jmp +330
acc +2
acc -2
nop +483
acc +31
jmp +426
acc +25
acc +1
jmp +296
acc +10
acc +32
jmp +223
acc +3
nop +350
acc +29
acc +4
jmp +427
acc +42
jmp +312
acc +7
acc -6
nop +366
nop +409
jmp +364
jmp -78
acc +42
jmp +159
acc +33
jmp +128
nop +86
acc +5
jmp +1
acc +47
jmp +150
acc -8
jmp -101
acc +31
nop +55
acc +2
jmp +39
jmp +12
acc +5
jmp +1
jmp -115
nop +141
nop +418
jmp +75
nop +430
acc -19
acc -12
jmp +83
jmp +82
acc +27
jmp -65
acc -5
jmp +422
acc +16
acc +20
jmp +336
acc +29
jmp -110
acc +1
acc +13
acc +37
jmp +38
acc +45
acc +2
acc +45
jmp -12
acc +36
acc +26
acc +50
jmp +343
acc -17
acc -18
acc +34
acc +23
jmp +274
acc +20
acc +12
nop +129
acc -1
jmp +5
acc +39
acc +40
acc +28
jmp +272
jmp +147
acc +50
jmp +1
acc +17
jmp -131
acc +8
acc -17
acc -16
acc +7
jmp +25
acc +47
acc +14
acc +27
acc -2
jmp +224
acc -6
acc -10
acc +23
jmp -109
acc -1
jmp -145
acc +40
nop +275
jmp +420
nop -92
nop -43
jmp +1
jmp -134
nop +297
acc +14
jmp +60
nop +412
nop +14
jmp -79
jmp +1
acc +25
jmp +176
jmp -206
acc +50
acc +17
jmp +271
acc +9
nop -82
acc +6
acc +19
jmp +184
acc +34
acc +32
acc -6
jmp -21
jmp -4
nop -154
acc +38
jmp +10
acc +25
acc +46
acc +32
jmp +65
acc -3
acc +44
jmp -153
acc +31
jmp +21
acc +31
acc +40
jmp +137
nop +307
acc -10
jmp -193
acc +5
acc +0
acc +42
acc -7
jmp -104
jmp +233
acc +41
acc +42
acc +43
jmp +358
acc +13
nop +140
acc +20
jmp +337
acc +18
acc -7
acc -14
jmp -213
nop +142
acc +13
jmp +115
acc +48
acc +30
acc +15
jmp +283
acc -14
jmp -153
jmp -75
jmp -178
acc +36
acc +9
jmp +32
acc +28
jmp -229
jmp +93
acc +41
jmp +91
acc -17
acc +3
jmp +163
nop +129
acc +0
nop -169
acc -11
jmp -23
acc +8
acc -8
jmp +106
acc +8
acc +43
acc -3
acc +25
jmp -15
nop -296
acc -4
jmp +220
nop -244
acc +38
acc -3
nop -163
jmp -169
jmp -304
jmp +169
acc +22
acc -5
acc +21
acc +7
jmp -162
acc +17
jmp -229
nop +35
acc +42
acc +12
acc +12
jmp +95
acc -7
nop +136
jmp +130
acc +0
acc +0
acc +16
acc +50
jmp -297
nop +183
nop +104
acc +18
jmp -65
acc -4
jmp +1
jmp +227
nop -76
jmp -109
acc +27
acc -2
acc -9
jmp +16
nop +99
acc +46
acc -7
nop +2
jmp +258
acc -10
jmp +122
acc -19
jmp +23
nop -205
acc -16
jmp +81
nop +235
acc -16
jmp +69
acc -11
acc +4
jmp +1
jmp -80
acc -19
jmp +108
acc +31
acc -7
nop -137
acc +26
jmp -185
acc -3
acc +44
acc -2
acc +43
jmp -137
acc +14
nop +96
jmp -28
acc +5
acc +19
jmp -31
jmp +18
jmp -356
acc +34
acc +45
jmp +170
acc +39
acc +3
acc +22
acc +23
jmp -370
jmp -73
acc +23
acc +46
acc +8
jmp -297
acc +46
jmp -387
jmp -312
jmp -345
jmp +229
acc -6
jmp +74
nop -209
acc +43
nop -151
acc +41
jmp -182
acc -12
acc -5
acc -13
acc +3
jmp -386
acc +45
acc +9
nop -97
jmp -411
acc +0
jmp +151
nop +150
acc +17
jmp -144
acc +3
acc +12
nop +55
jmp -377
jmp -421
nop +52
acc -18
acc -9
jmp -77
acc -14
acc +33
nop -316
acc +44
jmp -193
nop +150
acc -16
jmp -294
acc +26
acc -14
acc -7
jmp -61
nop -84
acc +0
jmp -105
acc +48
jmp +1
acc -6
jmp -109
acc -12
acc +37
acc +24
jmp +73
jmp -275
acc +14
acc -19
jmp -156
nop -147
jmp -94
acc -4
acc +50
acc +26
acc -1
jmp -392
nop +58
jmp -440
acc -1
jmp -85
acc +39
acc +8
jmp -318
nop -123
jmp +133
acc -18
jmp +131
acc +50
jmp -401
jmp -458
acc -9
acc +23
jmp +26
acc +15
acc -5
nop -236
jmp -89
acc -3
acc +28
jmp +98
jmp -413
acc -19
acc +41
acc +21
jmp -365
nop +97
acc +18
acc +44
jmp -186
acc -3
acc +31
nop -356
acc +26
jmp -217
jmp -13
acc +42
jmp -437
jmp -322
jmp +1
jmp -81
acc +28
acc +0
acc +45
acc +36
jmp -441
acc +50
acc +23
acc +1
acc +45
jmp -11
acc +16
acc -13
acc +16
jmp +13
jmp -419
jmp +1
jmp +66
acc +40
acc -5
acc -8
acc +39
jmp +61
acc +8
acc +25
acc +41
jmp -395
acc +5
acc +28
jmp -70
jmp +1
acc +15
acc -11
jmp -437
acc +17
acc +30
acc -15
acc +22
jmp -91
acc +44
acc +47
acc +0
acc +39
jmp -258
jmp -514
acc +46
jmp -478
acc +38
acc +12
acc +44
jmp -167
acc +41
jmp +1
acc +30
nop -337
jmp -521
acc -11
nop -426
jmp -68
acc -11
jmp -331
acc +44
acc +6
acc +13
jmp +1
jmp -519
acc +48
acc +13
acc +34
jmp -51
acc +19
acc +46
acc +26
acc +35
jmp -345
acc +20
jmp +1
jmp -220
acc +18
acc +43
nop -65
jmp -335
jmp -305
acc +19
acc -1
jmp -551
acc +40
acc +11
acc -13
jmp -196
acc +18
nop -460
acc +28
jmp -266
acc +41
nop -450
acc +20
jmp -380
acc +24
acc +44
acc +2
acc +0
jmp +22
acc -10
acc +0
acc -8
jmp -255
nop -80
acc +24
jmp -513
acc +23
nop -238
acc +31
jmp -504
nop -461
acc +40
acc +39
jmp +4
acc +2
acc +18
jmp -359
jmp -143
acc -5
jmp -117
acc -12
acc +40
jmp +1
acc +15
jmp +1
\ No newline at end of file
use std::fs::File;
use std::io::{self, prelude::*, BufReader};
#[derive(Debug, Clone)]
struct Instruction {
operation: Operation,
argument: i64,
}
#[derive(Debug, Clone, PartialEq)]
enum Operation {
Increment,
Jump,
Nothing,
}
#[derive(Debug, PartialEq)]
enum Reason {
LoopDetected,
Terminated,
}
impl Instruction {
fn from_str(input: &str) -> Self {
let (op, arg) = input.split_at(4);
let operation = match op {
"acc " => Operation::Increment,
"jmp " => Operation::Jump,
"nop " => Operation::Nothing,
_ => panic!(),
};
let argument = arg.parse::<i64>().unwrap();
Instruction {
operation: operation,
argument: argument,
}
}
pub fn apply(&self, accumulator: i64, index: isize) -> (i64, isize) {
match self.operation {
Operation::Increment => (accumulator + self.argument, index.checked_add(1).unwrap()),
Operation::Jump => (accumulator, index.checked_add(self.argument as isize).unwrap()),
Operation::Nothing => (accumulator, index.checked_add(1).unwrap()),
}
}
}
fn compute(instructions: &Vec<Instruction>) -> (Reason, i64) {
let mut accumulator = 0;
let mut index: isize = 0;
let mut visited_indices = vec![];
loop {
if visited_indices.contains(&index) {
// prevent looping
return (Reason::LoopDetected, accumulator);
}
visited_indices.push(index);
if index as usize == instructions.len() {
// code run through
return (Reason::Terminated, accumulator);
}
let result = instructions[index as usize].apply(accumulator, index);
accumulator = result.0;
index = result.1;
}
}
fn main() -> io::Result<()> {
println!("Advent of Code 2020 – Day 8:");
let file = File::open("input.txt")?;
let reader = BufReader::new(file);
let instructions = reader
.lines()
.map(|l| Instruction::from_str(&l.unwrap()))
.collect::<Vec<Instruction>>();
let answer1: i64 = compute(&instructions).1;
println!("Answer Part 1: {}", answer1);
let mut answer2: i64 = 100;
for index in 0..(instructions.len()-1) {
let mut instruction = instructions[index].clone();
if instruction.operation == Operation::Increment {
// don't need to change and don't need to run
continue;
}
instruction = match instruction.operation {
Operation::Jump => Instruction {
operation: Operation::Nothing,
argument: instruction.argument,
},
Operation::Nothing => Instruction {
operation: Operation::Jump,
argument: instruction.argument,
},
_ => unimplemented!()
};
let mut mutated_instructions = instructions.clone();
mutated_instructions[index] = instruction;
let value = compute(&mutated_instructions);
if value.0 == Reason::Terminated {
// answer found
answer2 = value.1;
break;
}
}
println!("Answer Part 2: {}", answer2);
Ok(())
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment