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