this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at d09cbade53a0d3e704dcbf42bd5df4d55ab4d307 61 lines 1.6 kB view raw
1use std::fs; 2use itertools::iproduct; 3 4struct State { 5 pos: usize, 6 codes: Vec<usize>, 7} 8 9impl Iterator for State { 10 type Item = Vec<usize>; 11 12 fn next(&mut self) -> Option<Self::Item> { 13 let (x, y) = (self.codes[self.pos+1], self.codes[self.pos+2]); 14 let update_at = self.codes[self.pos+3]; 15 16 match self.codes[self.pos] { 17 99 => return None, 18 1 => self.codes[update_at] = self.codes[x] + self.codes[y], 19 2 => self.codes[update_at] = self.codes[x] * self.codes[y], 20 _ => unreachable!(), 21 } 22 23 self.pos += 4; 24 Some(self.codes.clone()) 25 } 26} 27 28impl State { 29 fn set_init_params(&mut self, x: usize, y: usize) { 30 self.codes[1] = x; 31 self.codes[2] = y; 32 } 33} 34 35fn main() { 36 let raw_contents = fs::read_to_string("input.txt").expect("Error reading the file."); 37 let contents = raw_contents.trim(); // get rid of trailing \n 38 39 let intcodes: Vec<usize> = contents.split(",").map(|x| x.parse().unwrap()).collect(); 40 41 // Part 1 42 let mut s1: State = State{pos: 0, codes: intcodes.clone()}; 43 s1.set_init_params(12, 2); 44 45 let final_state: Vec<usize> = s1.last().unwrap(); 46 println!("Part 1: {}", final_state[0]); 47 48 // Part 2 49 let target = 19690720; 50 51 let (x, y) = iproduct!(0..100, 0..100).find(|(x, y)| { 52 let mut state: State = State{ pos: 0, codes: intcodes.clone() }; 53 54 state.set_init_params(*x, *y); 55 let final_state: Vec<usize> = state.last().unwrap(); 56 57 final_state[0] == target 58 }).unwrap(); 59 60 println!("Part 2: {}", (x * 100) + y); 61}