This commit is contained in:
Jan-Bulthuis committed 2024-12-08 10:54:48 +01:00
1 parent 232f91920d
commit 1277882310
5 files changed
+207

No files matched your search

+8
View File
@@ -52,6 +52,10 @@ mod tests {
)),
161
);
assert_eq!(
part1(&parse(include_str!("../input/2024/day3.txt"))),
191183308
);
}
#[test]
@@ -62,5 +66,9 @@ mod tests {
)),
48
);
assert_eq!(
part2(&parse(include_str!("../input/2024/day3.txt"))),
92082041
);
}
}
+117
View File
@@ -0,0 +1,117 @@
use std::collections::{HashMap, HashSet};
use aoc_runner_derive::{aoc, aoc_generator};
use num::integer::gcd;
type Input = ((isize, isize), Vec<Vec<(isize, isize)>>);
#[aoc_generator(day8)]
fn parse(input: &str) -> Input {
let mut map = HashMap::new();
let h = input.lines().count();
let w = input.lines().find(|_| true).unwrap().len();
input.lines().enumerate().for_each(|(y, line)| {
line.chars()
.enumerate()
.filter(|(_, c)| c != &'.')
.for_each(|(x, c)| {
if let std::collections::hash_map::Entry::Vacant(e) = map.entry(c) {
e.insert(vec![(x as isize, y as isize)]);
} else {
map.get_mut(&c).unwrap().push((x as isize, y as isize));
}
});
});
let vec = map.into_values().collect();
((w as isize, h as isize), vec)
}
#[aoc(day8, part1)]
fn part1(input: &Input) -> usize {
let mut set = HashSet::new();
input.1.iter().for_each(|vec| {
for l in 0..vec.len() {
for r in l + 1..vec.len() {
let a1 = vec[l];
let a2 = vec[r];
let c1 = (2 * a1.0 - a2.0, 2 * a1.1 - a2.1);
let c2 = (2 * a2.0 - a1.0, 2 * a2.1 - a1.1);
if c1.0 >= 0 && c1.0 < input.0 .0 && c1.1 >= 0 && c1.1 < input.0 .1 {
set.insert(c1);
}
if c2.0 >= 0 && c2.0 < input.0 .0 && c2.1 >= 0 && c2.1 < input.0 .1 {
set.insert(c2);
}
}
}
});
set.len()
}
#[aoc(day8, part2)]
fn part2(input: &Input) -> usize {
let mut set = HashSet::new();
input.1.iter().for_each(|vec| {
for l in 0..vec.len() {
for r in l + 1..vec.len() {
let a1 = vec[l];
let a2 = vec[r];
let s = a1;
let v = (a2.0 - a1.0, a2.1 - a1.1);
let v = (v.0 / gcd(v.0, v.1), v.1 / gcd(v.0, v.1));
let mut d = 0;
loop {
let c = (s.0 + d * v.0, s.1 + d * v.1);
d += 1;
if c.0 >= 0 && c.0 < input.0 .0 && c.1 >= 0 && c.1 < input.0 .1 {
set.insert(c);
} else {
break;
}
}
let mut d = 0;
loop {
let c = (s.0 + d * v.0, s.1 + d * v.1);
d -= 1;
if c.0 >= 0 && c.0 < input.0 .0 && c.1 >= 0 && c.1 < input.0 .1 {
set.insert(c);
} else {
break;
}
}
}
}
});
// for y in 0..input.0 .1 {
// println!();
// for x in 0..input.0 .0 {
// print!("{}", if set.contains(&(x, y)) { '#' } else { '.' })
// }
// }
set.len()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn part1_example() {
assert_eq!(
part1(&parse(
"............\n........0...\n.....0......\n.......0....\n....0.......\n......A.....\n............\n............\n........A...\n.........A..\n............\n............"
)),
14
);
}
#[test]
fn part2_example() {
assert_eq!(
part2(&parse(
"............\n........0...\n.....0......\n.......0....\n....0.......\n......A.....\n............\n............\n........A...\n.........A..\n............\n............"
)),
34
);
}
}
+1
View File
@@ -1,3 +1,4 @@
mod day8;
mod day1;
mod day2;
mod day3;