diff options
Diffstat (limited to 'src/bin/day_1.rs')
-rw-r--r-- | src/bin/day_1.rs | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/bin/day_1.rs b/src/bin/day_1.rs new file mode 100644 index 0000000..7b89d69 --- /dev/null +++ b/src/bin/day_1.rs @@ -0,0 +1,78 @@ +use aoc2021::parsers; +use nom::{character::complete::line_ending, combinator::map, multi::separated_list1, IResult}; +use std::fs; + +fn main() -> Result<(), Box<dyn std::error::Error>> { + let input = fs::read_to_string("inputs/day_1.txt")?; + let sonar_scan = parse_sonar_scan(&input).unwrap().1; + + { + let mut simple_increase_counter = DepthIncreaseCounter::default(); + for (depth, next_depth) in sonar_scan.iter().zip(sonar_scan.iter().skip(1)) { + if next_depth > depth { + simple_increase_counter.increment(); + } + } + dbg!(simple_increase_counter); + } + + { + let windowed_sonar_scan = sonar_scan + .iter() + .zip(sonar_scan.iter().skip(1)) + .zip(sonar_scan.iter().skip(2)) + .map(|((depth1, depth2), depth3)| ThreeDepthWindowSum::new([*depth1, *depth2, *depth3])) + .collect::<Vec<_>>(); + + let mut windowed_increase_counter = DepthIncreaseCounter::default(); + for (depth, next_depth) in windowed_sonar_scan + .iter() + .zip(windowed_sonar_scan.iter().skip(1)) + { + if next_depth > depth { + windowed_increase_counter.increment(); + } + } + dbg!(windowed_increase_counter); + } + + Ok(()) +} + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)] +struct Depth(u64); + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)] +struct ThreeDepthWindowSum(u64); + +impl ThreeDepthWindowSum { + fn new(depths: [Depth; 3]) -> ThreeDepthWindowSum { + ThreeDepthWindowSum(depths.into_iter().map(|d| d.0).sum()) + } +} + +fn parse_sonar_scan(input: &str) -> IResult<&str, Vec<Depth>> { + separated_list1(line_ending, parse_depth)(input) +} + +fn parse_depth(input: &str) -> IResult<&str, Depth> { + map(parsers::u64, |number| Depth(number))(input) +} + +#[derive(Default, Debug)] +struct DepthIncreaseCounter(u64); + +impl DepthIncreaseCounter { + fn increment(&mut self) { + self.0 += 1; + } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn parses_a_depth() { + assert_eq!(parse_depth("96\n"), Ok(("\n", Depth(96)))); + } +} |