From b8596fd912be1215f652431b79c01ca3d9818f07 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 21 Dec 2019 18:42:35 +0100 Subject: [PATCH] day2 works --- src/day2.rs | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 12 +++++++++ 2 files changed, 84 insertions(+) create mode 100644 src/day2.rs diff --git a/src/day2.rs b/src/day2.rs new file mode 100644 index 0000000..c184c82 --- /dev/null +++ b/src/day2.rs @@ -0,0 +1,72 @@ +// #[derive(Copy, Clone)] +pub struct Data { + pub program: Vec, +} + +impl Data { + pub fn new() -> Data { + Data { + program: Vec::new(), + } + } + + pub fn parse(&mut self, input: String) { + for line in input.split(",") { + let sline = line.to_string(); + // println!("{}", sline); + self.program.push(match sline.parse::() { + Ok(i) => i, + Err(_) => 0, + }); + } + } + + pub fn compute1(&mut self) -> u32 { + let mut pc: usize = 0; + while pc < self.program.len() { + let opcode = self.program[pc]; + match opcode { + 1 | 2 => { + if self.program.len() < pc + 3 { + break; + } + let arg1 = self.program[pc + 1] as usize; + let arg2 = self.program[pc + 2] as usize; + let res = self.program[pc + 3] as usize; + match opcode { + 1 => self.program[res] = self.program[arg1] + self.program[arg2], + 2 => self.program[res] = self.program[arg1] * self.program[arg2], + _ => {} + }; + } + 99 => break, + _ => { + println!( + "An Error happened: Instruction {} at pos {}", + self.program[pc], pc + ); + break; + } + } + pc += 4; + } + self.program[0] + } + + pub fn compute2(&self) -> u32 { + let mut result = 0u32; + let mut value = 0u32; + + while result != 19690720 && value < 10000 { + let mut data = Data::new(); + data.program = vec![0; self.program.len()]; + data.program.copy_from_slice(&self.program); + data.program[1] = value / 100 as u32; + data.program[2] = value % 100 as u32; + // println!("{:?}", data.program); + result = data.compute1(); + value += 1; + } + value - 1 + } +} diff --git a/src/main.rs b/src/main.rs index 3ed5574..bdcb3e6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,7 @@ use std::fs::File; use std::io::Read; mod day1; +mod day2; mod tests; fn main() { @@ -16,6 +17,17 @@ fn main() { println!("Error: {}", msg); } } + match read_file("../day2.txt") { + Ok(input) => { + let mut data = day2::Data::new(); + data.parse(input); + println!("Day2 Challenge1 result = {}", data.compute1()); + println!("Day2 Challenge2 result = {}", data.compute2()); + } + Err(msg) => { + println!("Error: {}", msg); + } + } } fn read_file(filename: &str) -> Result {