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:
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