From 14306595bd1e4aa8e43e5f201e0d2c5915912383 Mon Sep 17 00:00:00 2001 From: traxys Date: Mon, 1 Dec 2025 14:53:20 +0100 Subject: [PATCH] Day 1 --- src/bin/day1.rs | 96 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/bin/day1.rs diff --git a/src/bin/day1.rs b/src/bin/day1.rs new file mode 100644 index 0000000..5c6bf0e --- /dev/null +++ b/src/bin/day1.rs @@ -0,0 +1,96 @@ +use std::time::Instant; + +use aoc_2025::{load, print_res}; +use bstr::BString; + +pub enum Side { + Plus, + Minus, +} + +type Parsed = Vec<(Side, i16)>; + +#[inline(never)] +pub fn parsing(input: &BString) -> color_eyre::Result { + core::str::from_utf8(input)? + .lines() + .map(|l| match l.as_bytes().first() { + None => Err(color_eyre::eyre::eyre!("Invalid empty line")), + Some(b'L') => Ok((Side::Minus, l[1..].parse()?)), + Some(b'R') => Ok((Side::Plus, l[1..].parse()?)), + Some(_) => Err(color_eyre::eyre::eyre!("Invalid line `{l}`")), + }) + .collect() +} + +#[inline(never)] +pub fn part1(input: Parsed) { + let mut current: i16 = 50; + + let mut zero_count = 0; + + for (side, amount) in input { + match side { + Side::Plus => current += amount, + Side::Minus => current -= amount, + } + + current = current.rem_euclid(100); + if current == 0 { + zero_count += 1; + } + } + + print_res!("Zero count: {zero_count}"); +} + +#[inline(never)] +pub fn part2(input: Parsed) { + let mut current: i16 = 50; + + let mut zero_count = 0; + + for (side, amount) in input { + let towards = match side { + Side::Plus => 1, + Side::Minus => -1, + }; + + for _ in 0..amount { + current += towards; + + if current == -1 { + current = 99; + } else if current == 100 { + current = 0; + } + + if current == 0 { + zero_count += 1; + } + } + } + + print_res!("Zero count: {zero_count}"); +} + +pub fn main() -> color_eyre::Result<()> { + let context = load()?; + + let start = Instant::now(); + let parsed = parsing(&context.input)?; + let elapsed = humantime::format_duration(start.elapsed()); + + let start = Instant::now(); + if context.part == 1 { + part1(parsed); + } else { + part2(parsed); + } + let elapsed_part = humantime::format_duration(start.elapsed()); + + println!(" Parsing: {elapsed}"); + println!(" Solving: {elapsed_part}"); + + Ok(()) +}