diff --git a/src/tasks/day11.rs b/src/tasks/day11.rs index bc76b11..bd187ae 100644 --- a/src/tasks/day11.rs +++ b/src/tasks/day11.rs @@ -10,6 +10,7 @@ pub fn run() { .map(|(i, s)| (i, s.parse::().unwrap())) .collect(); task1(ram.clone()); + task2(ram.clone()); } fn task1(ram: RAM) { @@ -52,3 +53,54 @@ fn task1(ram: RAM) { } println!("Task 1: {} positions were painted", painted_positions.len()); } + +fn task2(ram: RAM) { + let directions: HashMap<_, _> = + vec![('^', (0, -1)), ('v', (0, 1)), ('<', (-1, 0)), ('>', (1, 0))] + .into_iter() + .collect(); + let turns: HashMap<_, _> = vec![ + (('^', 0), '<'), + (('^', 1), '>'), + (('v', 0), '>'), + (('v', 1), '<'), + (('<', 0), 'v'), + (('<', 1), '^'), + (('>', 0), '^'), + (('>', 1), 'v'), + ] + .into_iter() + .collect(); + + let mut colors: HashMap<(i32, i32), i128> = HashMap::new(); + colors.insert((0, 0), 1); + let mut painted_positions: HashSet<(i32, i32)> = HashSet::new(); + let get = |colors: &HashMap<_, _>, (x, y)| **colors.get(&(x, y)).get_or_insert(&0); + let turn = |(c, d)| turns.get(&(c, d)).unwrap(); + let mov = |(x0, y0), (x1, y1)| (x0 + x1, y0 + y1); + let mut done = false; + let mut computer = IntCodeComputer::new(vec![], ram); + let mut pos = (0, 0); + let mut dir = '^'; + while !done { + computer.set_input(&[get(&colors, pos)]); + computer.clear_output(); + done = computer.run_until_input_empty(); + let color = computer.get_output()[0]; + let turn_indicator = computer.get_output()[1]; + colors.insert(pos, color); + painted_positions.insert(pos); + dir = *turn((dir, turn_indicator)); + pos = mov(pos, *directions.get(&dir).unwrap()); + } + let xmin = painted_positions.iter().min_by_key(|it| it.0).unwrap().0; + let xmax = painted_positions.iter().max_by_key(|it| it.0).unwrap().0; + let ymin = painted_positions.iter().min_by_key(|it| it.1).unwrap().1; + let ymax = painted_positions.iter().max_by_key(|it| it.1).unwrap().1; + (ymin..=ymax).into_iter().for_each(|y| { + (xmin..=xmax).into_iter().for_each(|x| { + print!("{}", if get(&colors, (x, y)) == 1 { '#' } else { ' ' }); + }); + println!("") + }) +}