From 3c72884fac04f0bda5572da8e9a4896da11e81a4 Mon Sep 17 00:00:00 2001 From: Johannes Date: Sat, 1 Oct 2022 22:43:37 +0200 Subject: [PATCH] day19 part 2 --- src/tasks/day19.rs | 63 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/src/tasks/day19.rs b/src/tasks/day19.rs index 69c6f01..4a1bceb 100644 --- a/src/tasks/day19.rs +++ b/src/tasks/day19.rs @@ -1,24 +1,75 @@ +use std::collections::HashMap; use super::day05::{IntCodeComputer, RAM}; use itertools::Itertools; pub fn run() { let program = super::day05::load_ram("input/day19.txt"); - part1(program, 50); + //part1(&program, 50); + part2(&program); // 8151016 too high } -fn part1(program: RAM, max: i128) { +fn part1(program: &RAM, max: i128) { let result = (0..max) .flat_map(|x| { (0..max) .map(|y| { - let mut computer = IntCodeComputer::new(vec![x, y], program.clone()); - computer.run_until_end(); - *computer.get_output().first().unwrap() + read_coordinate(program, x, y) }) .collect_vec() }) - .filter(|v| *v == 1) + .filter(|v| *v) .count(); println!("{result}"); } + +const W: i128 = 100; +const MAX_PERIMETER: i128 = 1_000_000_000; + +fn part2(program: &RAM) { + let mut map: HashMap<(i128, i128), bool> = HashMap::new(); + (0..W) + .for_each(|x| { + (0..W) + .for_each(|y| { + map.insert((x, y), read_coordinate(program, x, y)); + }) + }); + for starts in 0..=MAX_PERIMETER { + println!("checking perimeter {starts}"); + extend_horizon(program, &mut map, starts); + check_all_squares_at(&map, starts); + } +} + +fn check_all_squares_at(map: &HashMap<(i128, i128), bool>, starts: i128) { + (0..=starts).for_each(|i| { + check_fits(map, i, starts); + check_fits(map, starts, i); + }); +} + +fn check_fits(map: &HashMap<(i128, i128), bool>, x: i128, y: i128) { + let ul = map[&(x, y)]; + let ur = map[&(x + W - 1, y)]; + let ll = map[&(x, y + W - 1)]; + let lr = map[&(x + W, y + W - 1)]; + if ul && ur && ll && lr { + let result = x * 10_000 + y; + panic!("found it! starts at {x},{y} -> {}", result); + } +} + +fn extend_horizon(program: &RAM, map: &mut HashMap<(i128, i128), bool>, starts: i128) { + (0..=W + starts).for_each(|i| { + let j = W + starts; + map.insert((j, i), read_coordinate(program, j, i)); + map.insert((i, j), read_coordinate(program, i, j)); + }); +} + +fn read_coordinate(program: &RAM, x: i128, y: i128) -> bool { + let mut computer = IntCodeComputer::new(vec![x, y], program.clone()); + computer.run_until_end(); + *computer.get_output().first().unwrap() == 1 +} \ No newline at end of file