Skip to content

Instantly share code, notes, and snippets.

@Uriopass
Created December 16, 2022 17:40
Show Gist options
  • Save Uriopass/bce44e442f8a924e7b1b524c1df9bf9b to your computer and use it in GitHub Desktop.
Save Uriopass/bce44e442f8a924e7b1b524c1df9bf9b to your computer and use it in GitHub Desktop.
fn main() {
let fs = std::fs::read_to_string("in.txt").unwrap();
let mut sensors = vec![];
for line in fs.lines() {
let mut parts = line.split_whitespace();
let sensor: (i32, i32) = (parts.nth(2).unwrap().trim_matches(|c| c == 'x' || c == '=' || c == ',').parse().unwrap(),
parts.next().unwrap().trim_matches(|c| c == 'y' || c == '=' || c == ':').parse().unwrap());
let beacon: (i32, i32) = (parts.nth(4).unwrap().trim_matches(|c| c == 'x' || c == '=' || c == ',').parse().unwrap(),
parts.nth(0).unwrap().trim_matches(|c| c == 'y' || c == '=' || c == ',').parse().unwrap());
let distance = (sensor.0 - beacon.0).abs() + (sensor.1 - beacon.1).abs();
sensors.push((sensor.0, sensor.1, distance));
}
let mut events = Vec::with_capacity(2 * sensors.len());
for y in 0..4000000 {
events.clear();
for (sx, sy, distance) in &sensors {
let diffy = (sy - y).abs();
if diffy > *distance {
continue;
}
let span = distance - diffy;
events.push((sx - span, true));
events.push((sx + span + 1, false));
}
events.sort_by_key(|e| e.0);
let mut countopen = 0;
for i in 0..events.len() {
let (x, open) = events[i];
if open {
countopen += 1;
} else {
countopen -= 1;
}
if !open && ((i == events.len() - 1) || events[i+1].0 != x) && countopen == 0 && x >= 0 && x <= size {
println!("{} {} {}", x, y, x as i64 * 4000000 + y as i64);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment