mirror of
https://github.com/RussellChamp/advent-of-code-2024-rust.git
synced 2026-10-27 23:52:29 +00:00
day 8 pt1
This commit is contained in:
1 parent
9cacd9db7e
commit
125bd67bb7
2 files changed
+99
No files matched your search
@@ -0,0 +1,12 @@
|
||||
............
|
||||
........0...
|
||||
.....0......
|
||||
.......0....
|
||||
....0.......
|
||||
......A.....
|
||||
............
|
||||
............
|
||||
........A...
|
||||
.........A..
|
||||
............
|
||||
............
|
||||
@@ -0,0 +1,87 @@
|
||||
use std::collections::HashMap;
|
||||
|
||||
use itertools::Itertools;
|
||||
|
||||
advent_of_code::solution!(8);
|
||||
|
||||
pub fn part_one(input: &str) -> Option<u32> {
|
||||
let mut grid_size: (u32, u32) = (input.lines().count() as u32, 0);
|
||||
|
||||
let mut antennas: HashMap<char, Vec<(u32, u32)>> = HashMap::new();
|
||||
|
||||
for (row_idx, line) in input.lines().enumerate() {
|
||||
if row_idx == 0 { grid_size.1 = line.chars().count() as u32; }
|
||||
|
||||
for (col_idx, c) in line.chars().enumerate(){
|
||||
if c != '.' {
|
||||
if antennas.contains_key(&c) {
|
||||
antennas.entry(c).and_modify(|v| v.push((row_idx as u32, col_idx as u32)));
|
||||
} else {
|
||||
antennas.insert(c, vec![(row_idx as u32, col_idx as u32)]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// let locations = HashSet::new();
|
||||
|
||||
let locations = antennas.iter().flat_map(|(_key, values)| {
|
||||
// println!("GROUP {} VALUE {:?}", _key, values);
|
||||
|
||||
values.iter().permutations(2).flat_map(|points| {
|
||||
assert_eq!(points.len(), 2);
|
||||
get_antinodes(points[0], points[1], grid_size)
|
||||
}).unique().collect_vec()
|
||||
}).unique();
|
||||
|
||||
// println!("ALL LOCATIONS: {:?}", locations.clone().collect_vec());
|
||||
|
||||
Some(locations.count() as u32)
|
||||
}
|
||||
|
||||
pub fn part_two(input: &str) -> Option<u32> {
|
||||
None
|
||||
}
|
||||
|
||||
fn get_antinodes(p1: &(u32, u32), p2: &(u32, u32), grid_size: (u32, u32)) -> Vec<(u32, u32)> {
|
||||
let diff = (p1.0 as isize - p2.0 as isize, p1.1 as isize - p2.1 as isize);
|
||||
|
||||
let a1 = (p1.0 as isize + diff.0, p1.1 as isize + diff.1);
|
||||
let a2 = (p2.0 as isize - diff.0, p2.1 as isize - diff.1);
|
||||
|
||||
let is_valid = |p: (isize, isize)| (0..grid_size.0 as isize).contains(&p.0) && (0..grid_size.1 as isize).contains(&p.1);
|
||||
|
||||
let mut results = vec![];
|
||||
|
||||
if is_valid(a1) { results.push((a1.0 as u32, a1.1 as u32)) };
|
||||
if is_valid(a2) { results.push((a2.0 as u32, a2.1 as u32)) };
|
||||
|
||||
results
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_get_antinodes() {
|
||||
let p1 = (5, 6);
|
||||
let p2 = (8, 8);
|
||||
let grid_size = (12, 12);
|
||||
|
||||
let result = get_antinodes(&p1, &p2, grid_size);
|
||||
assert_eq!(result, vec![(2, 4), (11, 10)]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_part_one() {
|
||||
let result = part_one(&advent_of_code::template::read_file("examples", DAY));
|
||||
assert_eq!(result, Some(14));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_part_two() {
|
||||
let result = part_two(&advent_of_code::template::read_file("examples", DAY));
|
||||
assert_eq!(result, None);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user