From 577cd494b3eaa9f2b63fc4dc2ab1c387ef967a41 Mon Sep 17 00:00:00 2001 From: Philip Molares <philip.molares@udo.edu> Date: Tue, 15 Dec 2020 21:33:14 +0100 Subject: [PATCH] added day08 Signed-off-by: Philip Molares <philip.molares@udo.edu> --- day08/Cargo.lock | 5 + day08/Cargo.toml | 9 + day08/input.txt | 637 ++++++++++++++++++++++++++++++++++++++++++++++ day08/src/main.rs | 124 +++++++++ 4 files changed, 775 insertions(+) create mode 100644 day08/Cargo.lock create mode 100644 day08/Cargo.toml create mode 100644 day08/input.txt create mode 100644 day08/src/main.rs diff --git a/day08/Cargo.lock b/day08/Cargo.lock new file mode 100644 index 0000000..f19080f --- /dev/null +++ b/day08/Cargo.lock @@ -0,0 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "day08" +version = "0.1.0" diff --git a/day08/Cargo.toml b/day08/Cargo.toml new file mode 100644 index 0000000..d0e5527 --- /dev/null +++ b/day08/Cargo.toml @@ -0,0 +1,9 @@ +[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] diff --git a/day08/input.txt b/day08/input.txt new file mode 100644 index 0000000..e04b7b6 --- /dev/null +++ b/day08/input.txt @@ -0,0 +1,637 @@ +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 diff --git a/day08/src/main.rs b/day08/src/main.rs new file mode 100644 index 0000000..b95ee0a --- /dev/null +++ b/day08/src/main.rs @@ -0,0 +1,124 @@ +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(()) +} -- GitLab