aboutsummaryrefslogtreecommitdiff
path: root/2022/15/common.rs
diff options
context:
space:
mode:
Diffstat (limited to '2022/15/common.rs')
-rw-r--r--2022/15/common.rs65
1 files changed, 65 insertions, 0 deletions
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 @@
1#[derive(Copy, Clone, Hash, Eq, PartialEq)]
2pub struct Pos {
3 pub x: i64,
4 pub y: i64
5}
6
7#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq)]
8pub struct Range {
9 pub left: i64,
10 pub right: i64
11}
12
13#[derive(Copy, Clone, Hash, Eq, PartialEq)]
14pub struct Sensor {
15 pub s: Pos,
16 pub b: Pos,
17 pub d: i64
18}
19
20pub fn distance(p: Pos, q: Pos) -> i64 {
21 (p.x-q.x).abs() + (p.y-q.y).abs()
22}
23
24impl Sensor {
25 pub fn from_line(line: &str) -> Sensor {
26 let mut i = 1 + line.find('=').unwrap();
27 let mut j = line.find(',').unwrap();
28 let sx = line[i..j].parse::<i64>().unwrap();
29
30 i = j+4;
31 j = line.find(':').unwrap();
32 let sy = line[i..j].parse::<i64>().unwrap();
33
34 i = 1 + j + line[j..].find('=').unwrap();
35 j = i + line[i..].find(',').unwrap();
36 let bx = line[i..j].parse::<i64>().unwrap();
37
38 i = j+4;
39 j = line.len()-1;
40 let by = line[i..j].parse::<i64>().unwrap();
41
42 let s = Pos { x: sx, y: sy };
43 let b = Pos { x: bx, y: by };
44 let d = distance(s, b);
45 Sensor { s, b, d }
46 }
47
48 pub fn get_range(&self, y: i64) -> Range {
49 let d = distance(self.s, Pos { x: self.s.x, y });
50 Range {
51 left: self.s.x - self.d + d,
52 right: self.s.x + self.d - d
53 }
54 }
55}
56
57pub fn read_sensors_from_stdin() -> Vec<Sensor> {
58 let mut v = Vec::<Sensor>::new();
59 let mut line = String::new();
60 while std::io::stdin().read_line(&mut line).unwrap() > 0 {
61 v.push(Sensor::from_line(&line));
62 line.clear();
63 }
64 v
65}

Generated with cgit - Back to sebastiano.tronto.net