From 98559e201024df8d7625371c40956dcb0e80f7b6 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Fri, 1 Dec 2023 10:19:55 +0100 Subject: [PATCH] Day 1 2023 part 1 --- 2023/src/day01.rs | 50 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/2023/src/day01.rs b/2023/src/day01.rs index 7c1760f..f783805 100644 --- a/2023/src/day01.rs +++ b/2023/src/day01.rs @@ -1,7 +1,51 @@ -pub fn part1(_input: &[u8]) -> anyhow::Result { +use anyhow::Result; + +fn to_digit(c: u8) -> Option { + match c { + b'0'..=b'9' => Some(u32::from(c - b'0')), + _ => None, + } +} + +pub fn part1(input: &[u8]) -> Result { + let mut it = input.iter(); + let mut sum = 0; + + loop { + let mut first = None; + let mut last = 0; + + for digit in it + .by_ref() + .take_while(|&&c| c != b'\n') + .filter_map(|&c| to_digit(c)) + { + first.get_or_insert(digit); + last = digit; + } + + if let Some(first) = first { + sum += 10 * first + last; + } else { + break; + } + } + + Ok(sum.to_string()) +} + +pub fn part2(_input: &[u8]) -> Result { anyhow::bail!("Not implemented") } -pub fn part2(_input: &[u8]) -> anyhow::Result { - anyhow::bail!("Not implemented") +#[cfg(test)] +mod tests { + use super::*; + + const SAMPLE: &[u8] = include_bytes!("samples/01.txt"); + + #[test] + fn sample_part1() { + assert_eq!("142", part1(SAMPLE).unwrap()); + } }