aboutsummaryrefslogtreecommitdiff
path: root/2022
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2025-07-02 14:45:11 +0200
committerSebastiano Tronto <sebastiano@tronto.net>2025-07-02 14:45:11 +0200
commit6b89133a79e798edadca7eb59800441535e97670 (patch)
tree2ee1b25378fa235038f7ce28b5b7896c64bda259 /2022
parentd287854b301bb8b4726b50ac21513b658fe1fb6b (diff)
downloadaoc-6b89133a79e798edadca7eb59800441535e97670.tar.gz
aoc-6b89133a79e798edadca7eb59800441535e97670.zip
Day 15 2022
Diffstat (limited to '2022')
-rw-r--r--2022/15/a.rs30
-rw-r--r--2022/15/b.rs33
-rw-r--r--2022/15/common.rs65
3 files changed, 128 insertions, 0 deletions
diff --git a/2022/15/a.rs b/2022/15/a.rs
new file mode 100644
index 0000000..7b87150
--- /dev/null
+++ b/2022/15/a.rs
@@ -0,0 +1,30 @@
1use std::cmp::max;
2use std::collections::HashSet;
3mod common;
4use common::*;
5
6fn main() {
7 const Y: i64 = 2000000;
8 let sensors = read_sensors_from_stdin();
9 let mut ranges = sensors.iter()
10 .map(|s| s.get_range(Y))
11 .filter(|r| r.left <= r.right)
12 .collect::<Vec<_>>();
13 ranges.sort();
14 let mut current = Range { left: i64::MIN, right: i64::MIN };
15 let mut sum = 0;
16 for r in ranges {
17 current = Range {
18 left: max(current.right+1, r.left),
19 right: max(current.right, r.right)
20 };
21 sum += (current.right - current.left + 1) as usize;
22 }
23 sum -= sensors.iter()
24 .map(|s| s.b)
25 .collect::<HashSet<_>>() // Remove duplicates
26 .iter()
27 .filter(|b| b.y == Y)
28 .count();
29 println!("{sum}");
30}
diff --git a/2022/15/b.rs b/2022/15/b.rs
new file mode 100644
index 0000000..3c321e1
--- /dev/null
+++ b/2022/15/b.rs
@@ -0,0 +1,33 @@
1use std::cmp::max;
2mod common;
3use common::*;
4
5#[allow(non_snake_case)]
6fn get_pos(sensors: &Vec<Sensor>, N: i64) -> Pos {
7 for i in 0..=N {
8 let mut ranges = sensors.iter()
9 .map(|s| s.get_range(i))
10 .filter(|r| r.left <= r.right)
11 .collect::<Vec<_>>();
12 ranges.sort();
13 let mut lastr = ranges[0].right;
14 for j in 1..ranges.len() {
15 if lastr + 1 < ranges[j].left {
16 return Pos { x: lastr+1, y: i };
17 }
18 lastr = max(lastr, ranges[j].right);
19 }
20 if lastr < N {
21 return Pos { x: N, y: i };
22 }
23 }
24 panic!("Position not found");
25}
26
27fn main() {
28 const N: i64 = 4000000;
29 const M: i64 = 4000000;
30 let sensors = read_sensors_from_stdin();
31 let p = get_pos(&sensors, N);
32 println!("x = {}, y = {} -> {}", p.x, p.y, p.x * M + p.y);
33}
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