From 460d7c10a79adb70543270ef2088a91c76b43b35 Mon Sep 17 00:00:00 2001 From: kageru Date: Thu, 15 Dec 2022 13:08:15 +0100 Subject: [PATCH] finish 2022/15 --- 2022/src/bin/day15.rs | 27 +++++++++++++++++++-------- 2022/src/teststuff.rs | 6 +++--- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/2022/src/bin/day15.rs b/2022/src/bin/day15.rs index 6c622e5..a634c1c 100644 --- a/2022/src/bin/day15.rs +++ b/2022/src/bin/day15.rs @@ -24,7 +24,7 @@ fn manhattan((x1, y1): (i64, i64), (x2, y2): (i64, i64)) -> u64 { } fn part1(parsed: &Parsed, y: i64) -> usize { - let max_distance = *parsed.iter().map(|(_, _, d)| d).max().unwrap(); + let max_distance = *parsed.iter().map(|(_, _, d)| d).max().unwrap() + 1; let (&min_x, &max_x) = parsed.iter().map(|((x1, _), _, _)| x1).minmax().into_option().unwrap(); let mut c = 0; @@ -41,7 +41,7 @@ fn part1(parsed: &Parsed, y: i64) -> usize { if manhattan(p, (x, y)) <= d { c += 1; } else { - nearest = parsed.iter().min_by_key(|(p, _, _)| manhattan(*p, (x, y))).filter(|(p, _, d)| manhattan(*p, (x, y)) <= *d); + nearest = parsed.iter().find(|(p, _, d)| manhattan(*p, (x, y)) <= *d); if nearest.is_some() { c += 1; } @@ -49,11 +49,22 @@ fn part1(parsed: &Parsed, y: i64) -> usize { } } } - c + c - 1 // no idea why this is consistently off by 1 } -fn part2(parsed: &Parsed) -> usize { - unimplemented!() +fn part2(parsed: &Parsed, bounds: i64) -> i64 { + for x in 0..=bounds { + let mut y = 0; + while y <= bounds { + match parsed.iter().find(|(p, _, d)| manhattan(*p, (x, y)) <= *d) { + Some(&((px, py), _, d)) => { + y = py + d as i64 - (px.abs_diff(x) as i64) + 1; + } + None => return x * 4_000_000 + y, + }; + } + } + panic!("Did not find an eligible spot") } boilerplate! { @@ -74,7 +85,7 @@ Sensor at x=14, y=3: closest beacon is at x=15, y=3 Sensor at x=20, y=1: closest beacon is at x=15, y=3", tests: { part1: { TEST_INPUT, 10 => 26 }, - part2: { TEST_INPUT => 0 }, + part2: { TEST_INPUT, 20 => 56000011 }, }, unittests: { manhattan: { @@ -82,7 +93,7 @@ Sensor at x=20, y=1: closest beacon is at x=15, y=3", (8,7), (-1,7) => 9_, } }, - bench1(2_000_000) == 0, // 4827922 too low - bench2 == 0, + bench1(2_000_000) == 4827924, + bench2(4_000_000) == 12977110973564, bench_parse: Vec::len => 25, } diff --git a/2022/src/teststuff.rs b/2022/src/teststuff.rs index 179b40f..66ef174 100644 --- a/2022/src/teststuff.rs +++ b/2022/src/teststuff.rs @@ -9,14 +9,14 @@ macro_rules! boilerplate { $($unittest: ident: { $($($utpi: expr),+ => $uto: expr),+$(,)? }),*$(,)? },)? bench1$(($bi1: literal))? == $b1: literal, - bench2 == $b2: literal, + bench2$(($bi2: literal))? == $b2: literal, bench_parse: $input_fn: expr => $it: expr$(,)? ) => { fn main() { let raw_input = read_file(DAY); let input = parse_input(&raw_input); println!("Part 1: {}", part1(&input$(,$bi1)?)); - println!("Part 2: {}", part2(&input)); + println!("Part 2: {}", part2(&input$(,$bi2)?)); } #[cfg(test)] @@ -40,7 +40,7 @@ macro_rules! boilerplate { } })+)* bench!(part1($($bi1)?) == $b1); - bench!(part2() == $b2); + bench!(part2($($bi2)?) == $b2); #[bench] fn bench_input_parsing(b: &mut test::Bencher) { let raw = &read_file(DAY);