mirror of
https://github.com/Rhelvetican/aoc2024.git
synced 2024-12-23 06:51:40 +00:00
day 10
This commit is contained in:
parent
15cf96bfb9
commit
a0653a8223
3 changed files with 132 additions and 6 deletions
|
@ -30,7 +30,8 @@ fn main() -> Result<()> {
|
||||||
6 => AocDaySixSolution,
|
6 => AocDaySixSolution,
|
||||||
7 => AocDaySevenSolution,
|
7 => AocDaySevenSolution,
|
||||||
8 => AocDayEightSolution,
|
8 => AocDayEightSolution,
|
||||||
9 => AocDayNineSolution
|
9 => AocDayNineSolution,
|
||||||
|
10 => AocDayTenSolution,
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -1,8 +1,120 @@
|
||||||
use std::{fs::read_to_string, path::Path};
|
use std::{
|
||||||
|
collections::{HashMap, HashSet},
|
||||||
|
fs::read_to_string,
|
||||||
|
path::Path,
|
||||||
|
};
|
||||||
|
|
||||||
use super::AocSolution;
|
use super::AocSolution;
|
||||||
use crate::utils::Result;
|
use crate::utils::{coord::Coord as Crd, Result};
|
||||||
|
|
||||||
|
type Coord = Crd<i8>;
|
||||||
|
|
||||||
|
struct HikingMap {
|
||||||
|
pub starting_points: HashSet<Coord>,
|
||||||
|
pub mountain: HashMap<Coord, u8>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl HikingMap {
|
||||||
|
fn new(src: &str) -> Self {
|
||||||
|
let (starting_points, mountain) = src
|
||||||
|
.lines()
|
||||||
|
.zip(0..)
|
||||||
|
.flat_map(|(line, y)| {
|
||||||
|
line.chars().zip(0..).filter_map(move |(ch, x)| match ch {
|
||||||
|
'0' => Some((Coord::new(x, y), 0)),
|
||||||
|
'1' => Some((Coord::new(x, y), 1)),
|
||||||
|
'2' => Some((Coord::new(x, y), 2)),
|
||||||
|
'3' => Some((Coord::new(x, y), 3)),
|
||||||
|
'4' => Some((Coord::new(x, y), 4)),
|
||||||
|
'5' => Some((Coord::new(x, y), 5)),
|
||||||
|
'6' => Some((Coord::new(x, y), 6)),
|
||||||
|
'7' => Some((Coord::new(x, y), 7)),
|
||||||
|
'8' => Some((Coord::new(x, y), 8)),
|
||||||
|
'9' => Some((Coord::new(x, y), 9)),
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.fold(
|
||||||
|
(HashSet::new(), HashMap::new()),
|
||||||
|
|(mut spos, mut map), (coord, heigh)| {
|
||||||
|
if heigh == 0 {
|
||||||
|
spos.insert(coord);
|
||||||
|
}
|
||||||
|
|
||||||
|
map.insert(coord, heigh);
|
||||||
|
|
||||||
|
(spos, map)
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
Self {
|
||||||
|
starting_points,
|
||||||
|
mountain,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn hike(&self) -> u64 {
|
||||||
|
fn _inner(map: &HashMap<Coord, u8>, start_pos: Coord) -> u64 {
|
||||||
|
fn _traverse(map: &HashMap<Coord, u8>, summits: &mut HashSet<Coord>, current: Coord) {
|
||||||
|
if map.get(¤t).is_some_and(|h| h == &9) {
|
||||||
|
summits.insert(current);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for dir in current.surround() {
|
||||||
|
if map.get(&dir).is_some_and(|&h| map[¤t] + 1 == h) {
|
||||||
|
_traverse(map, summits, dir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut visited = HashSet::new();
|
||||||
|
if map.contains_key(&start_pos) {
|
||||||
|
_traverse(map, &mut visited, start_pos);
|
||||||
|
visited.len() as u64
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.starting_points
|
||||||
|
.iter()
|
||||||
|
.map(|pos| _inner(&self.mountain, *pos))
|
||||||
|
.sum()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn hike_ver_two(&self) -> u64 {
|
||||||
|
fn _inner(map: &HashMap<Coord, u8>, start_pos: Coord) -> u64 {
|
||||||
|
fn _traverse(map: &HashMap<Crd<i8>, u8>, current: Coord, rate: &mut u64) {
|
||||||
|
if map.get(¤t).is_some_and(|h| h == &9) {
|
||||||
|
*rate += 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for dir in current.surround() {
|
||||||
|
if map.get(&dir).is_some_and(|&h| map[¤t] + 1 == h) {
|
||||||
|
_traverse(map, dir, rate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut rating = 0;
|
||||||
|
if map.contains_key(&start_pos) {
|
||||||
|
_traverse(map, start_pos, &mut rating);
|
||||||
|
rating
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.starting_points
|
||||||
|
.iter()
|
||||||
|
.map(|pos| _inner(&self.mountain, *pos))
|
||||||
|
.sum()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
pub struct AocDayTenSolution;
|
pub struct AocDayTenSolution;
|
||||||
|
|
||||||
impl AocSolution for AocDayTenSolution {
|
impl AocSolution for AocDayTenSolution {
|
||||||
|
@ -11,15 +123,17 @@ impl AocSolution for AocDayTenSolution {
|
||||||
fn get_input(&self, path: Option<&Path>) -> Result<String> {
|
fn get_input(&self, path: Option<&Path>) -> Result<String> {
|
||||||
Ok(match path {
|
Ok(match path {
|
||||||
Some(p) => read_to_string(p)?,
|
Some(p) => read_to_string(p)?,
|
||||||
None => read_to_string("./input/day_day_10.txt")?,
|
None => read_to_string("./input/day_10.txt")?,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn part_one(&self, input: &str) -> Result<Self::Output> {
|
fn part_one(&self, input: &str) -> Result<Self::Output> {
|
||||||
todo!()
|
let map = HikingMap::new(input);
|
||||||
|
Ok(map.hike())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn part_two(&self, input: &str) -> Result<Self::Output> {
|
fn part_two(&self, input: &str) -> Result<Self::Output> {
|
||||||
todo!()
|
let map = HikingMap::new(input);
|
||||||
|
Ok(map.hike_ver_two())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,9 +13,20 @@ pub struct Coord<U: Unit> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<U: Unit> Coord<U> {
|
impl<U: Unit> Coord<U> {
|
||||||
|
#[inline(always)]
|
||||||
pub const fn new(x: U, y: U) -> Self {
|
pub const fn new(x: U, y: U) -> Self {
|
||||||
Self { x, y }
|
Self { x, y }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn surround(&self) -> [Self; 4] {
|
||||||
|
[
|
||||||
|
Self::new(self.x - U::from(1), self.y),
|
||||||
|
Self::new(self.x, self.y + U::from(1)),
|
||||||
|
Self::new(self.x + U::from(1), self.y),
|
||||||
|
Self::new(self.x, self.y - U::from(1)),
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<U: Unit> Add for Coord<U> {
|
impl<U: Unit> Add for Coord<U> {
|
||||||
|
|
Loading…
Reference in a new issue