[rs] Solve 2022_15 part 1

This commit is contained in:
Joscha 2022-12-15 09:50:27 +01:00
parent faec68e1fb
commit a8291375ba
5 changed files with 75 additions and 0 deletions

View file

@ -65,6 +65,7 @@ days! {
Y2022D12: "2022_12" => y2022::d12::solve,
Y2022D13: "2022_13" => y2022::d13::solve,
Y2022D14: "2022_14" => y2022::d14::solve,
Y2022D15: "2022_15" => y2022::d15::solve,
}
#[derive(Parser)]

View file

@ -12,3 +12,4 @@ pub mod d11;
pub mod d12;
pub mod d13;
pub mod d14;
pub mod d15;

52
rs/src/y2022/d15.rs Normal file
View file

@ -0,0 +1,52 @@
use std::collections::HashSet;
struct Sensor {
pos: (i32, i32),
beac: (i32, i32),
dist: i32,
}
fn parse_coord(coord: &str) -> i32 {
let coord = coord.replace(|c| "xy=,:".contains(c), "");
coord.parse().unwrap()
}
pub fn solve(input: String) {
let sensors = input
.lines()
.map(|l| {
let parts = l.split_whitespace().collect::<Vec<_>>();
let pos = (parse_coord(parts[2]), parse_coord(parts[3]));
let beac = (parse_coord(parts[8]), parse_coord(parts[9]));
let dist = (pos.0 - beac.0).abs() + (pos.1 - beac.1).abs();
Sensor { pos, beac, dist }
})
.collect::<Vec<_>>();
// A beacon exactly dist away has 1 field, i. e. x±0
// A beacon exactly dist-1 away has 3 fields, i. e. x±1
// ...
// A beacon exactly 0 away has 2dist+1 fields, i. e. x±dist
//
// Formula: Go from x-(dist-dy) to x+(dist-dy)
let line_at_y = 2000000;
let mut part1 = HashSet::new();
for (i, sensor) in sensors.iter().enumerate() {
eprintln!("Sensor {}", i + 1);
let dy = (line_at_y - sensor.pos.1).abs();
if dy > sensor.dist {
continue;
}
let dx = sensor.dist - dy;
for x in (sensor.pos.0 - dx)..=(sensor.pos.0 + dx) {
part1.insert(x);
}
}
for sensor in &sensors {
if sensor.beac.1 == line_at_y {
part1.remove(&sensor.beac.0);
}
}
println!("Part 1: {}", part1.len());
}