diff options
author | Justin Wernick <justin@worthe-it.co.za> | 2021-12-01 08:44:23 +0200 |
---|---|---|
committer | Justin Wernick <justin@worthe-it.co.za> | 2021-12-01 08:44:23 +0200 |
commit | 18bdad10c27d199a4085655ce93902d4bba0d534 (patch) | |
tree | 1cce82983b84a80b8b269fdaee88adbb90f2bee2 /src/bin/day_1.rs |
Day 1
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)))); + } +} |