Skip to content

Commit c03812d

Browse files
committed
solve: day8
1 parent 5373b55 commit c03812d

File tree

3 files changed

+102
-1
lines changed

3 files changed

+102
-1
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
resolver = "2"
33
members = [
44
"utils",
5-
"aoc_derive", "day1", "day2", "day3", "day4", "day5", "day6", "day7",
5+
"aoc_derive", "day1", "day2", "day3", "day4", "day5", "day6", "day7", "day8",
66
]
77

88
[workspace.dependencies]

day8/Cargo.toml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[package]
2+
name = "day8"
3+
version = "0.1.0"
4+
edition = "2024"
5+
6+
[dependencies]
7+
aoc_derive.path = '../aoc_derive'
8+
utils.path = '../utils'
9+
derive_more.workspace = true
10+
itertools.workspace = true
11+
lazy-regex.workspace = true
12+
parse-display.workspace = true
13+
rayon.workspace = true
14+
regex.workspace = true
15+
num.workspace = true
16+
17+
[dev-dependencies]
18+
pretty_assertions.workspace = true

day8/src/main.rs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
use std::{collections::HashMap, ops::ControlFlow};
2+
3+
use aoc_derive::aoc_main;
4+
use grid::Grid;
5+
use itertools::Itertools;
6+
use math::Vec2D;
7+
use utils::*;
8+
9+
fn antinodes_part2(a: Vec2D, b: Vec2D, grid: &Grid<char>) -> impl Iterator<Item = Vec2D> {
10+
let mut antinodes = vec![];
11+
let mut pos = a;
12+
while grid.contains(&pos) {
13+
antinodes.push(pos);
14+
pos += a - b;
15+
}
16+
antinodes.into_iter()
17+
}
18+
19+
#[aoc_main]
20+
fn solve(input: Input) -> impl Into<Solution> {
21+
let grid = input.char_grid();
22+
23+
let antenna_map = grid.iter().filter_map(|(pos, &c)| (c != '.').then_some((c, pos))).fold(
24+
HashMap::<_, Vec<_>>::new(),
25+
|mut map, (c, pos)| {
26+
map.entry(c).or_default().push(pos);
27+
map
28+
},
29+
);
30+
31+
let part1 = antenna_map
32+
.iter()
33+
.flat_map(|(_, antennas)| {
34+
antennas
35+
.clone()
36+
.into_iter()
37+
.combinations(2)
38+
.flat_map(|pair| [pair[0] + (pair[0] - pair[1]), pair[1] + (pair[1] - pair[0])])
39+
.filter(|antinode| grid.contains(antinode))
40+
})
41+
.unique()
42+
.count();
43+
44+
let part2 = antenna_map
45+
.into_iter()
46+
.flat_map(|(_, antennas)| {
47+
antennas.clone().into_iter().combinations(2).flat_map(|pair| {
48+
antinodes_part2(pair[0], pair[1], &grid)
49+
.chain(antinodes_part2(pair[1], pair[0], &grid))
50+
})
51+
})
52+
.unique()
53+
.count();
54+
55+
(part1, part2)
56+
}
57+
58+
#[cfg(test)]
59+
mod tests {
60+
use super::*;
61+
#[test]
62+
fn test_examples() {
63+
use utils::assert_example;
64+
assert_example!(
65+
r#"............
66+
........0...
67+
.....0......
68+
.......0....
69+
....0.......
70+
......A.....
71+
............
72+
............
73+
........A...
74+
.........A..
75+
............
76+
............
77+
78+
"#,
79+
14,
80+
34
81+
);
82+
}
83+
}

0 commit comments

Comments
 (0)