this repo has no description
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}