From d54f976f0756239dcec2753bdd6be67eecfebafa Mon Sep 17 00:00:00 2001 From: Kristofers Solo Date: Wed, 10 Dec 2025 20:12:28 +0200 Subject: [PATCH] Finish part-1 --- 2025/daily-template/src/part2.rs | 2 +- 2025/day-10/src/part1.rs | 190 ++++++++++++++++++++++++++++++- 2025/day-10/src/part2.rs | 2 +- 3 files changed, 189 insertions(+), 5 deletions(-) diff --git a/2025/daily-template/src/part2.rs b/2025/daily-template/src/part2.rs index ef3e35b..ad0941a 100644 --- a/2025/daily-template/src/part2.rs +++ b/2025/daily-template/src/part2.rs @@ -3,7 +3,7 @@ use miette::miette; #[tracing::instrument] #[allow(clippy::missing_panics_doc)] #[allow(clippy::missing_errors_doc)] -pub fn process(input: &str) -> Result { +pub fn process(input: &str) -> miette::Result { todo!("day xx - part 2"); Ok(0) } diff --git a/2025/day-10/src/part1.rs b/2025/day-10/src/part1.rs index 2052179..eab8833 100644 --- a/2025/day-10/src/part1.rs +++ b/2025/day-10/src/part1.rs @@ -1,10 +1,193 @@ use miette::miette; +use std::{collections::HashSet, slice::Iter, str::FromStr, vec}; + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +enum Light { + On, + Off, +} + +impl TryFrom for Light { + type Error = String; + fn try_from(ch: char) -> Result { + match ch { + '#' => Ok(Self::On), + '.' => Ok(Self::Off), + _ => Err("Unknown Light status".to_string()), + } + } +} + +impl Light { + const fn toggle(&self) -> Self { + match self { + Self::On => Self::Off, + Self::Off => Self::On, + } + } +} + +// [.##.] +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +struct IndicatorLight(Vec); + +impl FromStr for IndicatorLight { + type Err = String; + fn from_str(s: &str) -> Result { + let trimmed = s.trim(); + let digits_str = trimmed + .strip_prefix('[') + .and_then(|s| s.strip_suffix(']')) + .unwrap_or(""); + + let lights = digits_str + .chars() + .map(Light::try_from) + .collect::, _>>()?; + Ok(Self(lights)) + } +} + +impl IndicatorLight { + fn toggle(&mut self, button: &Button) { + for &btn in button.iter() { + let light = self.0.get_mut(btn).expect("light exsists"); + *light = light.toggle(); + } + } + + const fn len(&self) -> usize { + self.0.len() + } + + fn with_capacity(capacity: usize) -> Self { + Self(vec![Light::Off; capacity]) + } +} + +// (3) (1,3) (2) (2,3) (0,2) (0,1) +#[derive(Debug, Clone)] +struct Button(Vec); + +impl FromStr for Button { + type Err = String; + fn from_str(s: &str) -> Result { + let trimmed = s.trim(); + let digits_str = trimmed + .strip_prefix('(') + .and_then(|s| s.strip_suffix(')')) + .unwrap_or(trimmed); + + let button = digits_str + .split(',') + .map(|s| s.parse::().map_err(|e| e.to_string())) + .collect::, _>>()?; + Ok(Self(button)) + } +} + +impl Button { + fn iter(&self) -> Iter<'_, usize> { + self.0.iter() + } +} + +// {3,5,4,7} +#[derive(Debug, Clone)] +struct Joltage(Vec); + +impl FromStr for Joltage { + type Err = String; + fn from_str(s: &str) -> Result { + let trimmed = s.trim(); + let digits_str = trimmed + .strip_prefix('{') + .and_then(|s| s.strip_suffix('}')) + .unwrap_or(trimmed); + + let joltage = digits_str + .split(',') + .map(|s| s.parse::().map_err(|e| e.to_string())) + .collect::, _>>()?; + Ok(Self(joltage)) + } +} + +// [.##.] (3) (1,3) (2) (2,3) (0,2) (0,1) {3,5,4,7} +#[derive(Debug, Clone)] +struct Machine { + final_state: IndicatorLight, // [.##.] + current_state: IndicatorLight, + buttons: Vec