advent-of-code

Perserverance, or the lack thereof

git clone git://git.shimmy1996.com/advent-of-code.git
commit 45ade4d2a26c7d068bd599c6adbcf1e9aec96a8a
parent 1246bcf29d9f8af9415f7e8dc8ed620714adc9b2
Author: Shimmy Xu <shimmy.xu@shimmy1996.com>
Date:   Thu,  5 Dec 2019 09:34:06 -0500

Add Rust solution for day 05

Diffstat:
Aday-05/Makefile | 9+++++++++
Aday-05/day-05.rs | 109+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aday-05/input.txt | 1+
3 files changed, 119 insertions(+), 0 deletions(-)
diff --git a/day-05/Makefile b/day-05/Makefile
@@ -0,0 +1,9 @@
+CC := g++
+CCFLAGS := --std=c++17 -Wall
+
+all: day-05-rust day-05.jl
+	julia day-05.jl
+	./day-05-rust
+
+day-05-rust: day-05.rs
+	rustc $^ -o $@
diff --git a/day-05/day-05.rs b/day-05/day-05.rs
@@ -0,0 +1,109 @@
+fn main() {
+    let input = std::fs::read_to_string("input.txt")
+        .unwrap()
+        .trim()
+        .split(",")
+        .map(|op| op.parse::<i32>().unwrap())
+        .collect::<Vec<i32>>();
+    println!("Rust:");
+    println!("Part 1: {}", part_1(&input));
+    println!("Part 2: {}", part_2(&input));
+}
+
+fn computer(program: &Vec<i32>, input: i32) -> Vec<i32> {
+    let mut program = program.clone();
+    let mut output = vec![];
+    let mut pc = 0;
+
+    let get_param = |loc: usize, im_mode, program: &Vec<i32>| -> i32 {
+        if im_mode {
+            program[loc]
+        } else {
+            program[program[loc] as usize]
+        }
+    };
+
+    loop {
+        let op_code = program[pc] % 100;
+        let im_mode_1 = (program[pc] % 1000) / 100 > 0;
+        let im_mode_2 = (program[pc] % 10000) / 1000 > 0;
+        // Third parameter is location to write to, and will never be immediate
+        // mode.
+        match op_code {
+            1 => {
+                let res_loc = program[pc + 3];
+                let param_1 = get_param(pc + 1, im_mode_1, &program);
+                let param_2 = get_param(pc + 2, im_mode_2, &program);
+                program[res_loc as usize] = param_1 + param_2;
+                pc += 4;
+            }
+            2 => {
+                let res_loc = program[pc + 3];
+                let param_1 = get_param(pc + 1, im_mode_1, &program);
+                let param_2 = get_param(pc + 2, im_mode_2, &program);
+                program[res_loc as usize] = param_1 * param_2;
+                pc += 4;
+            }
+            3 => {
+                let res_loc = program[pc + 1];
+                program[res_loc as usize] = input;
+                pc += 2;
+            }
+            4 => {
+                let param_1 = get_param(pc + 1, im_mode_1, &program);
+                output.push(param_1);
+                pc += 2;
+            }
+            5 => {
+                let param_1 = get_param(pc + 1, im_mode_1, &program);
+                let param_2 = get_param(pc + 2, im_mode_2, &program);
+                if param_1 != 0 {
+                    pc = param_2 as usize;
+                } else {
+                    pc += 3;
+                }
+            }
+            6 => {
+                let param_1 = get_param(pc + 1, im_mode_1, &program);
+                let param_2 = get_param(pc + 2, im_mode_2, &program);
+                if param_1 == 0 {
+                    pc = param_2 as usize;
+                } else {
+                    pc += 3;
+                }
+            }
+            7 => {
+                let res_loc = program[pc + 3];
+                let param_1 = get_param(pc + 1, im_mode_1, &program);
+                let param_2 = get_param(pc + 2, im_mode_2, &program);
+                program[res_loc as usize] = if param_1 < param_2 { 1 } else { 0 };
+                pc += 4;
+            }
+            8 => {
+                let res_loc = program[pc + 3];
+                let param_1 = get_param(pc + 1, im_mode_1, &program);
+                let param_2 = get_param(pc + 2, im_mode_2, &program);
+                program[res_loc as usize] = if param_1 == param_2 { 1 } else { 0 };
+                pc += 4;
+            }
+            99 => {
+                break;
+            }
+            _ => {
+                println!("Unknown op {}", op_code);
+                println!("{}", program[pc]);
+                panic!();
+            }
+        }
+    }
+
+    output
+}
+
+fn part_1(input: &Vec<i32>) -> i32 {
+    *computer(&input, 1).last().unwrap()
+}
+
+fn part_2(input: &Vec<i32>) -> i32 {
+    *computer(&input, 5).last().unwrap()
+}
diff --git a/day-05/input.txt b/day-05/input.txt
@@ -0,0 +1 @@
+3,225,1,225,6,6,1100,1,238,225,104,0,1102,67,92,225,1101,14,84,225,1002,217,69,224,101,-5175,224,224,4,224,102,8,223,223,101,2,224,224,1,224,223,223,1,214,95,224,101,-127,224,224,4,224,102,8,223,223,101,3,224,224,1,223,224,223,1101,8,41,225,2,17,91,224,1001,224,-518,224,4,224,1002,223,8,223,101,2,224,224,1,223,224,223,1101,37,27,225,1101,61,11,225,101,44,66,224,101,-85,224,224,4,224,1002,223,8,223,101,6,224,224,1,224,223,223,1102,7,32,224,101,-224,224,224,4,224,102,8,223,223,1001,224,6,224,1,224,223,223,1001,14,82,224,101,-174,224,224,4,224,102,8,223,223,101,7,224,224,1,223,224,223,102,65,210,224,101,-5525,224,224,4,224,102,8,223,223,101,3,224,224,1,224,223,223,1101,81,9,224,101,-90,224,224,4,224,102,8,223,223,1001,224,3,224,1,224,223,223,1101,71,85,225,1102,61,66,225,1102,75,53,225,4,223,99,0,0,0,677,0,0,0,0,0,0,0,0,0,0,0,1105,0,99999,1105,227,247,1105,1,99999,1005,227,99999,1005,0,256,1105,1,99999,1106,227,99999,1106,0,265,1105,1,99999,1006,0,99999,1006,227,274,1105,1,99999,1105,1,280,1105,1,99999,1,225,225,225,1101,294,0,0,105,1,0,1105,1,99999,1106,0,300,1105,1,99999,1,225,225,225,1101,314,0,0,106,0,0,1105,1,99999,8,226,226,224,102,2,223,223,1005,224,329,1001,223,1,223,1108,677,677,224,1002,223,2,223,1006,224,344,101,1,223,223,1007,226,677,224,102,2,223,223,1005,224,359,101,1,223,223,1007,677,677,224,1002,223,2,223,1006,224,374,101,1,223,223,1108,677,226,224,1002,223,2,223,1005,224,389,1001,223,1,223,108,226,677,224,102,2,223,223,1006,224,404,101,1,223,223,1108,226,677,224,102,2,223,223,1005,224,419,101,1,223,223,1008,677,677,224,102,2,223,223,1005,224,434,101,1,223,223,7,677,226,224,1002,223,2,223,1005,224,449,101,1,223,223,1008,226,226,224,102,2,223,223,1005,224,464,1001,223,1,223,107,226,677,224,1002,223,2,223,1006,224,479,1001,223,1,223,107,677,677,224,102,2,223,223,1005,224,494,1001,223,1,223,1008,226,677,224,102,2,223,223,1006,224,509,1001,223,1,223,1107,677,226,224,102,2,223,223,1005,224,524,101,1,223,223,1007,226,226,224,1002,223,2,223,1006,224,539,1001,223,1,223,107,226,226,224,102,2,223,223,1006,224,554,101,1,223,223,108,677,677,224,1002,223,2,223,1006,224,569,1001,223,1,223,7,226,677,224,102,2,223,223,1006,224,584,1001,223,1,223,8,677,226,224,102,2,223,223,1005,224,599,101,1,223,223,1107,677,677,224,1002,223,2,223,1005,224,614,101,1,223,223,8,226,677,224,102,2,223,223,1005,224,629,1001,223,1,223,7,226,226,224,1002,223,2,223,1006,224,644,1001,223,1,223,108,226,226,224,1002,223,2,223,1006,224,659,101,1,223,223,1107,226,677,224,1002,223,2,223,1006,224,674,101,1,223,223,4,223,99,226