From 4183f4a242bc9069a10f6278aa82326c9722552e Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Wed, 6 Dec 2023 08:29:41 +0100 Subject: [PATCH] Implement 2023 day 6 part 1 --- 2023/src/day06.rs | 56 +++++++++++++++++++++++++++++++++++++++-- 2023/src/samples/06.txt | 2 ++ 2 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 2023/src/samples/06.txt diff --git a/2023/src/day06.rs b/2023/src/day06.rs index 7c1760f..16e44fc 100644 --- a/2023/src/day06.rs +++ b/2023/src/day06.rs @@ -1,7 +1,59 @@ -pub fn part1(_input: &[u8]) -> anyhow::Result { - anyhow::bail!("Not implemented") +use nom::bytes::complete::tag; +use nom::character::complete::newline; +use nom::character::complete::space1; +use nom::multi::many1; +use nom::sequence::delimited; +use nom::sequence::pair; +use nom::sequence::preceded; +use nom::IResult; + +use crate::common::parse_input; + +fn parse_race(i: &[u8]) -> IResult<&[u8], (Vec, Vec)> { + use nom::character::complete::u64; + + pair( + delimited(tag("Time:"), many1(preceded(space1, u64)), newline), + delimited(tag("Distance:"), many1(preceded(space1, u64)), newline), + )(i) +} + +fn ways(time: u64, distance: u64) -> u64 { + let make_it = (1..=time / 2) + .filter(|&v| v * (time - v) > distance) + .count() as u64; + + if time % 2 == 0 { + 2 * make_it - 1 + } else { + 2 * make_it + } +} + +pub fn part1(input: &[u8]) -> anyhow::Result { + let (time, distance) = parse_input(input, parse_race)?; + + let total: u64 = time + .iter() + .zip(&distance) + .map(|(&time, &distance)| ways(time, distance)) + .product(); + + Ok(total.to_string()) } pub fn part2(_input: &[u8]) -> anyhow::Result { anyhow::bail!("Not implemented") } + +#[cfg(test)] +mod tests { + use super::*; + + const SAMPLE: &[u8] = include_bytes!("samples/06.txt"); + + #[test] + fn sample_part1() { + assert_eq!(part1(SAMPLE).unwrap(), "288"); + } +} diff --git a/2023/src/samples/06.txt b/2023/src/samples/06.txt new file mode 100644 index 0000000..28f5ae9 --- /dev/null +++ b/2023/src/samples/06.txt @@ -0,0 +1,2 @@ +Time: 7 15 30 +Distance: 9 40 200