From 6b89133a79e798edadca7eb59800441535e97670 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Wed, 2 Jul 2025 14:45:11 +0200 Subject: Day 15 2022 --- 2022/15/common.rs | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 2022/15/common.rs (limited to '2022/15/common.rs') diff --git a/2022/15/common.rs b/2022/15/common.rs new file mode 100644 index 0000000..bece484 --- /dev/null +++ b/2022/15/common.rs @@ -0,0 +1,65 @@ +#[derive(Copy, Clone, Hash, Eq, PartialEq)] +pub struct Pos { + pub x: i64, + pub y: i64 +} + +#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq)] +pub struct Range { + pub left: i64, + pub right: i64 +} + +#[derive(Copy, Clone, Hash, Eq, PartialEq)] +pub struct Sensor { + pub s: Pos, + pub b: Pos, + pub d: i64 +} + +pub fn distance(p: Pos, q: Pos) -> i64 { + (p.x-q.x).abs() + (p.y-q.y).abs() +} + +impl Sensor { + pub fn from_line(line: &str) -> Sensor { + let mut i = 1 + line.find('=').unwrap(); + let mut j = line.find(',').unwrap(); + let sx = line[i..j].parse::().unwrap(); + + i = j+4; + j = line.find(':').unwrap(); + let sy = line[i..j].parse::().unwrap(); + + i = 1 + j + line[j..].find('=').unwrap(); + j = i + line[i..].find(',').unwrap(); + let bx = line[i..j].parse::().unwrap(); + + i = j+4; + j = line.len()-1; + let by = line[i..j].parse::().unwrap(); + + let s = Pos { x: sx, y: sy }; + let b = Pos { x: bx, y: by }; + let d = distance(s, b); + Sensor { s, b, d } + } + + pub fn get_range(&self, y: i64) -> Range { + let d = distance(self.s, Pos { x: self.s.x, y }); + Range { + left: self.s.x - self.d + d, + right: self.s.x + self.d - d + } + } +} + +pub fn read_sensors_from_stdin() -> Vec { + let mut v = Vec::::new(); + let mut line = String::new(); + while std::io::stdin().read_line(&mut line).unwrap() > 0 { + v.push(Sensor::from_line(&line)); + line.clear(); + } + v +} -- cgit v1.3