generated from janezicmatej/aoc-template
solution: day 8
This commit is contained in:
parent
0000010070
commit
0000011041
|
@ -0,0 +1,12 @@
|
|||
............
|
||||
........0...
|
||||
.....0......
|
||||
.......0....
|
||||
....0.......
|
||||
......A.....
|
||||
............
|
||||
............
|
||||
........A...
|
||||
.........A..
|
||||
............
|
||||
............
|
|
@ -0,0 +1,104 @@
|
|||
use hashbrown::{HashMap, HashSet};
|
||||
use itertools::Itertools;
|
||||
|
||||
#[allow(clippy::type_complexity)]
|
||||
fn parse_input(input: &str) -> (Vec<Vec<char>>, HashMap<char, Vec<(isize, isize)>>) {
|
||||
let grid = input.lines().map(|s| s.chars().collect_vec()).collect_vec();
|
||||
|
||||
let mut antennas: HashMap<char, Vec<(isize, isize)>> = HashMap::new();
|
||||
for (i, row) in grid.iter().enumerate() {
|
||||
for (j, cell) in row.iter().copied().enumerate().filter(|(_, c)| *c != '.') {
|
||||
antennas
|
||||
.entry(cell)
|
||||
.or_default()
|
||||
.push((i as isize, j as isize));
|
||||
}
|
||||
}
|
||||
|
||||
(grid, antennas)
|
||||
}
|
||||
|
||||
pub fn part_one(input: &str) -> Option<usize> {
|
||||
let (grid, antennas) = parse_input(input);
|
||||
|
||||
let mut set = HashSet::new();
|
||||
for v in antennas.values() {
|
||||
for (s, (i, j)) in v.iter().copied().enumerate() {
|
||||
for (ii, jj) in v.iter().copied().skip(s + 1) {
|
||||
let (di, dj) = (i - ii, j - jj);
|
||||
|
||||
let (a00, a01) = (i + di, j + dj);
|
||||
let (a10, a11) = (ii - di, jj - dj);
|
||||
|
||||
if grid
|
||||
.get(a00 as usize)
|
||||
.and_then(|row| row.get(a01 as usize))
|
||||
.is_some()
|
||||
{
|
||||
set.insert((a00, a01));
|
||||
}
|
||||
|
||||
if grid
|
||||
.get(a10 as usize)
|
||||
.and_then(|row| row.get(a11 as usize))
|
||||
.is_some()
|
||||
{
|
||||
set.insert((a10, a11));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
set.len().into()
|
||||
}
|
||||
|
||||
pub fn part_two(input: &str) -> Option<usize> {
|
||||
let (grid, antennas) = parse_input(input);
|
||||
|
||||
let mut set = HashSet::new();
|
||||
for v in antennas.values() {
|
||||
for (s, (i, j)) in v.iter().copied().enumerate() {
|
||||
for (ii, jj) in v.iter().copied().skip(s + 1) {
|
||||
let (di, dj) = (i - ii, j - jj);
|
||||
|
||||
let (mut a00, mut a01) = (i, j);
|
||||
let (mut a10, mut a11) = (ii, jj);
|
||||
|
||||
while grid
|
||||
.get(a00 as usize)
|
||||
.and_then(|r| r.get(a01 as usize))
|
||||
.is_some()
|
||||
{
|
||||
set.insert((a00, a01));
|
||||
(a00, a01) = (a00 + di, a01 + dj);
|
||||
}
|
||||
|
||||
while grid
|
||||
.get(a10 as usize)
|
||||
.and_then(|r| r.get(a11 as usize))
|
||||
.is_some()
|
||||
{
|
||||
set.insert((a10, a11));
|
||||
(a10, a11) = (a10 - di, a11 - dj);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
set.len().into()
|
||||
}
|
||||
|
||||
aoc::solution!(8);
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
#[test]
|
||||
fn test_part_one() {
|
||||
assert_eq!(part_one(&aoc::template::read_file("examples", 8)), Some(14));
|
||||
}
|
||||
#[test]
|
||||
fn test_part_two() {
|
||||
assert_eq!(part_two(&aoc::template::read_file("examples", 8)), Some(34));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue