mirror of
https://github.com/kristoferssolo/Advent-of-Code.git
synced 2025-12-31 13:42:32 +00:00
Finish part-2
This commit is contained in:
parent
41d1feffc2
commit
6cac42e2df
@ -1,11 +1,55 @@
|
|||||||
use miette::Result;
|
use std::collections::HashMap;
|
||||||
|
use tracing::info;
|
||||||
|
|
||||||
|
type Column = usize;
|
||||||
|
type PathCount = usize;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
struct PathCounts {
|
||||||
|
positions: HashMap<Column, PathCount>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PathCounts {
|
||||||
|
fn new(start_column: Column) -> Self {
|
||||||
|
let mut positions = HashMap::new();
|
||||||
|
positions.insert(start_column, 1);
|
||||||
|
Self { positions }
|
||||||
|
}
|
||||||
|
fn apply_row(&self, line: &str) -> Self {
|
||||||
|
let mut new_positions = HashMap::new();
|
||||||
|
|
||||||
|
for (&column, &count) in &self.positions {
|
||||||
|
if line.as_bytes()[column] == b'^' {
|
||||||
|
info!(column, "split at");
|
||||||
|
*new_positions.entry(column - 1).or_insert(0) += count;
|
||||||
|
*new_positions.entry(column + 1).or_insert(0) += count;
|
||||||
|
} else {
|
||||||
|
*new_positions.entry(column).or_insert(0) += count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Self {
|
||||||
|
positions: new_positions,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn total_paths(&self) -> usize {
|
||||||
|
self.positions.values().sum()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[tracing::instrument]
|
#[tracing::instrument]
|
||||||
#[allow(clippy::missing_panics_doc)]
|
#[allow(clippy::missing_panics_doc)]
|
||||||
#[allow(clippy::missing_errors_doc)]
|
#[allow(clippy::missing_errors_doc)]
|
||||||
pub fn process(input: &str) -> Result<usize> {
|
pub fn process(input: &str) -> miette::Result<usize> {
|
||||||
todo!("day xx - part 2");
|
let mut lines = input.lines().enumerate();
|
||||||
Ok(0)
|
let (_, first_line) = lines.next().unwrap();
|
||||||
|
let start_column = first_line.chars().position(|ch| ch == 'S').unwrap();
|
||||||
|
|
||||||
|
let final_state = lines.fold(PathCounts::new(start_column), |state, (_, line)| {
|
||||||
|
state.apply_row(line)
|
||||||
|
});
|
||||||
|
Ok(final_state.total_paths())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -13,10 +57,25 @@ mod tests {
|
|||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_process() -> Result<()> {
|
fn test_process() -> miette::Result<()> {
|
||||||
let input = "";
|
let input = ".......S.......
|
||||||
todo!("haven't built test yet");
|
...............
|
||||||
let result = 0;
|
.......^.......
|
||||||
|
...............
|
||||||
|
......^.^......
|
||||||
|
...............
|
||||||
|
.....^.^.^.....
|
||||||
|
...............
|
||||||
|
....^.^...^....
|
||||||
|
...............
|
||||||
|
...^.^...^.^...
|
||||||
|
...............
|
||||||
|
..^...^.....^..
|
||||||
|
...............
|
||||||
|
.^.^.^.^.^...^.
|
||||||
|
...............
|
||||||
|
";
|
||||||
|
let result = 40;
|
||||||
assert_eq!(process(input)?, result);
|
assert_eq!(process(input)?, result);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user