From 5bb9bcc7b3820a87bacb2e9f01e88f3f9b47c60b Mon Sep 17 00:00:00 2001 From: SebastianStork Date: Sat, 6 Dec 2025 19:57:32 +0100 Subject: [PATCH 1/2] 2025/day-06: Solve part 1 --- 2025/rust/day-06/Cargo.lock | 7 ++++ 2025/rust/day-06/Cargo.toml | 6 +++ 2025/rust/day-06/src/main.rs | 77 ++++++++++++++++++++++++++++++++++++ flake.lock | 6 +-- 4 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 2025/rust/day-06/Cargo.lock create mode 100644 2025/rust/day-06/Cargo.toml create mode 100644 2025/rust/day-06/src/main.rs diff --git a/2025/rust/day-06/Cargo.lock b/2025/rust/day-06/Cargo.lock new file mode 100644 index 0000000..eb51f97 --- /dev/null +++ b/2025/rust/day-06/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "day-06" +version = "0.1.0" diff --git a/2025/rust/day-06/Cargo.toml b/2025/rust/day-06/Cargo.toml new file mode 100644 index 0000000..738bf8b --- /dev/null +++ b/2025/rust/day-06/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "day-06" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/2025/rust/day-06/src/main.rs b/2025/rust/day-06/src/main.rs new file mode 100644 index 0000000..4202926 --- /dev/null +++ b/2025/rust/day-06/src/main.rs @@ -0,0 +1,77 @@ +use std::{fmt::Debug, fs}; + +#[derive(PartialEq, Debug)] +enum Operation { + Add, + Multiply, +} + +#[derive(Debug)] +struct Problem { + numbers: Vec, + operation: Operation, +} + +impl Problem { + fn solve(&self) -> u64 { + if self.operation == Operation::Add { + self.numbers.iter().sum() + } else { + self.numbers.iter().product() + } + } +} + +fn main() { + let problems = parse_input(&fs::read_to_string("../../inputs/06.txt").unwrap()); + + println!("Grand total: {}", grand_total(&problems)); +} + +fn parse_input(contents: &str) -> Vec { + let grid: Vec> = contents + .trim() + .lines() + .map(|line| line.split_whitespace().collect()) + .collect(); + + let mut list: Vec = Vec::new(); + + for (col, _) in grid[0].iter().enumerate() { + let mut numbers: Vec = Vec::new(); + + let operation = match grid[grid.len() - 1][col] { + "+" => Operation::Add, + "*" => Operation::Multiply, + _ => panic!("Unsupported Operation"), + }; + + for (row, _) in grid[..grid.len() - 1].iter().enumerate() { + numbers.push(grid[row][col].parse().unwrap()); + } + + list.push(Problem { numbers, operation }); + } + + list +} + +fn grand_total(problems: &[Problem]) -> u64 { + problems.iter().map(Problem::solve).sum() +} + +#[cfg(test)] +mod tests { + use super::*; + + const TEST_INPUT: &str = " +123 328 51 64 + 45 64 387 23 + 6 98 215 314 +* + * + "; + + #[test] + fn test_part1() { + assert_eq!(grand_total(&parse_input(TEST_INPUT)), 4277556); + } +} diff --git a/flake.lock b/flake.lock index 675648d..2dee58e 100644 --- a/flake.lock +++ b/flake.lock @@ -3,10 +3,10 @@ "inputs": { "flake": false, "locked": { - "lastModified": 1764926544, - "narHash": "sha256-xIkgV9KrBel6Qwy673iMmmggFGZ9Zz93Hd/lGhRyHRM=", + "lastModified": 1765025072, + "narHash": "sha256-mTX6WtSh/OWj4nAsDdr8fkAOPZgANHQc/DURFczQBC4=", "ref": "refs/heads/main", - "rev": "27de1eaccb499f25dca8f3505b4c4f42a8e35514", + "rev": "b425d990c6bf65f69566c0167e1ff8049c87bc2a", "shallow": true, "type": "git", "url": "ssh://git@github.com/SebastianStork/advent-of-code-inputs.git" From e3b750544f250d7f6e580c08ad9398a675d13894 Mon Sep 17 00:00:00 2001 From: SebastianStork Date: Sat, 6 Dec 2025 23:48:36 +0100 Subject: [PATCH 2/2] 2025/day-06: Solve part 2 --- 2025/rust/day-06/src/main.rs | 100 ++++++++++++++++++++++++++--------- 1 file changed, 75 insertions(+), 25 deletions(-) diff --git a/2025/rust/day-06/src/main.rs b/2025/rust/day-06/src/main.rs index 4202926..b4d85a1 100644 --- a/2025/rust/day-06/src/main.rs +++ b/2025/rust/day-06/src/main.rs @@ -1,4 +1,4 @@ -use std::{fmt::Debug, fs}; +use std::{fmt::Debug, fs, str::FromStr}; #[derive(PartialEq, Debug)] enum Operation { @@ -6,6 +6,18 @@ enum Operation { Multiply, } +impl FromStr for Operation { + type Err = (); + + fn from_str(input: &str) -> Result { + match input { + "+" => Ok(Operation::Add), + "*" => Ok(Operation::Multiply), + _ => Err(()), + } + } +} + #[derive(Debug)] struct Problem { numbers: Vec, @@ -14,46 +26,79 @@ struct Problem { impl Problem { fn solve(&self) -> u64 { - if self.operation == Operation::Add { - self.numbers.iter().sum() - } else { - self.numbers.iter().product() + match self.operation { + Operation::Add => self.numbers.iter().sum(), + Operation::Multiply => self.numbers.iter().product(), } } } fn main() { - let problems = parse_input(&fs::read_to_string("../../inputs/06.txt").unwrap()); + let content = &mut fs::read_to_string("../../inputs/06.txt").unwrap(); - println!("Grand total: {}", grand_total(&problems)); + println!("Grand total 1: {}", grand_total(&parse_input_v1(content))); + println!("Grand total 2: {}", grand_total(&parse_input_v2(content))); } -fn parse_input(contents: &str) -> Vec { +fn parse_input_v1(contents: &str) -> Vec { let grid: Vec> = contents .trim() .lines() .map(|line| line.split_whitespace().collect()) .collect(); - let mut list: Vec = Vec::new(); + let operations_row = grid.last().unwrap(); + let num_cols = grid[0].len(); - for (col, _) in grid[0].iter().enumerate() { - let mut numbers: Vec = Vec::new(); + (0..num_cols) + .map(|col_index| { + let operation = Operation::from_str(operations_row[col_index]).unwrap(); - let operation = match grid[grid.len() - 1][col] { - "+" => Operation::Add, - "*" => Operation::Multiply, - _ => panic!("Unsupported Operation"), - }; + let numbers = grid[..grid.len() - 1] + .iter() + .map(|row| row[col_index].parse().unwrap()) + .collect(); - for (row, _) in grid[..grid.len() - 1].iter().enumerate() { - numbers.push(grid[row][col].parse().unwrap()); + Problem { numbers, operation } + }) + .collect() +} + +fn parse_input_v2(contents: &str) -> Vec { + let grid: Vec> = contents + .trim_end_matches('\n') + .lines() + .map(|line| line.as_bytes().to_vec()) + .collect(); + + let operations_row = grid.last().unwrap(); + + let mut problems = Vec::new(); + + let mut numbers = Vec::new(); + let mut operation = Operation::Add; + + for col in 0..grid[0].len() { + if let Ok(op) = Operation::from_str(&(operations_row[col] as char).to_string()) { + operation = op; } - list.push(Problem { numbers, operation }); - } + let column: String = (0..grid.len() - 1) + .map(|row| grid[row][col] as char) + .filter(|c| !c.is_whitespace()) + .collect(); - list + if column.is_empty() { + problems.push(Problem { numbers, operation }); + numbers = Vec::new(); + operation = Operation::Add; + } else { + numbers.push(column.parse().unwrap()); + } + } + problems.push(Problem { numbers, operation }); + + problems } fn grand_total(problems: &[Problem]) -> u64 { @@ -64,14 +109,19 @@ fn grand_total(problems: &[Problem]) -> u64 { mod tests { use super::*; - const TEST_INPUT: &str = " -123 328 51 64 + const TEST_INPUT: &str = "123 328 51 64 45 64 387 23 6 98 215 314 -* + * + "; +* + * + +"; #[test] fn test_part1() { - assert_eq!(grand_total(&parse_input(TEST_INPUT)), 4277556); + assert_eq!(grand_total(&parse_input_v1(TEST_INPUT)), 4277556); + } + + #[test] + fn test_part2() { + assert_eq!(grand_total(&parse_input_v2(TEST_INPUT)), 3263827); } }