From bacbf3617124cb4c7812185155a83c711655a7c7 Mon Sep 17 00:00:00 2001 From: Keenan Tims Date: Fri, 5 Dec 2025 23:48:15 -0800 Subject: [PATCH] day6: both solutions --- .aoc_tiles/tiles/2025/06.png | Bin 0 -> 7800 bytes README.md | 5 +- src/day6.rs | 176 +++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 4 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 .aoc_tiles/tiles/2025/06.png create mode 100644 src/day6.rs diff --git a/.aoc_tiles/tiles/2025/06.png b/.aoc_tiles/tiles/2025/06.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d999c04f4a6707424fe520b073bcfff28d6b47 GIT binary patch literal 7800 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

- 2025 - 10 ⭐ - Rust + 2025 - 12 ⭐ - Rust

@@ -17,4 +17,7 @@ + + + diff --git a/src/day6.rs b/src/day6.rs new file mode 100644 index 0000000..264f7b0 --- /dev/null +++ b/src/day6.rs @@ -0,0 +1,176 @@ +use aoc_runner_derive::{aoc, aoc_generator}; +use grid::Grid; +use itertools::Itertools; +use std::{ + fmt::{Display, Write}, + iter::repeat_n, +}; + +#[repr(u8)] +enum Op { + Add = b'+', + Mul = b'*', +} + +impl From<&str> for Op { + fn from(value: &str) -> Self { + match value { + "+" => Op::Add, + "*" => Op::Mul, + c => panic!("Invalid op `{c}`"), + } + } +} + +impl Display for Op { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Op::Add => f.write_char('+'), + Op::Mul => f.write_char('*'), + } + } +} + +impl Op { + fn f(&self, lhs: u64, rhs: u64) -> u64 { + match self { + Op::Add => lhs + rhs, + Op::Mul => lhs * rhs, + } + } +} + +#[aoc_generator(day6, part1)] +fn parse(input: &str) -> (Grid, Vec) { + let mut rows = input + .lines() + .map(|l| l.split_ascii_whitespace().collect_vec()) + .collect_vec(); + + let ops = rows + .pop() + .unwrap() + .iter() + .map(|op| Op::from(*op)) + .collect_vec(); + let mut grid = Grid::with_shape(rows[0].len(), rows.len(), 0); + + for (y, r) in rows.iter().enumerate() { + for (x, v) in r.iter().enumerate() { + grid.set(&(x, y), v.parse().unwrap()); + } + } + + (grid, ops) +} + +#[aoc(day6, part1)] +fn part1((grid, ops): &(Grid, Vec)) -> u64 { + (0..grid.width()) + .map(|x| { + grid.col_iter(x as i64) + .unwrap() + .cloned() + .reduce(|l, r| ops[x].f(l, r)) + .unwrap() + }) + .sum() +} + +// fn split_digits(x: &u64) -> Vec { +// let n_digits = x.ilog10() as usize; +// (0..=n_digits) +// .rev() +// .map(|n| ((x / POW10[n]) % 10) as u8) +// .collect() +// } + +#[aoc_generator(day6, part2)] +fn parse2(input: &str) -> (Grid>, Vec) { + let mut rows = input.lines().collect_vec(); + let ops = rows.pop().unwrap(); + + let col_starts = ops + .chars() + .enumerate() + .filter(|(_i, c)| *c == '+' || *c == '*') + .map(|(i, _c)| i) + .collect_vec(); + + let col_lengths = col_starts + .iter() + .tuple_windows() + .map(|(l, r)| r - l - 1) + .collect_vec(); + + let split_rows = rows + .iter() + .map(|r| { + col_starts + .iter() + .zip(col_lengths.iter()) + .map(|(s, l)| &r[*s..s + l]) + .chain(repeat_n(&r[*col_starts.last().unwrap()..], 1)) + .collect_vec() + }) + .collect_vec(); + + let ops = ops.split_ascii_whitespace().map(Op::from).collect_vec(); + let mut grid = Grid::with_shape(split_rows[0].len(), split_rows.len(), Vec::new()); + for (y, r) in split_rows.iter().enumerate() { + for (x, v) in r.iter().enumerate() { + grid.set(&(x, y), v.chars().collect_vec()); + } + } + + (grid, ops) +} + +#[aoc(day6, part2)] +fn part2((grid, ops): &(Grid>, Vec)) -> u64 { + let mut columns = Vec::new(); + for col in 0..grid.width() { + let mut digit = 0; + let mut col_values = Vec::new(); + loop { + let val = grid + .col_iter(col as i64) + .unwrap() + .filter_map(|s| s.get(digit)) + .filter(|c| !c.is_ascii_whitespace()) + .map(|v| v.to_digit(10).unwrap() as u64) + .fold(0, |acc, n| acc * 10 + n); + if val == 0 { + columns.push(col_values); + break; + } + col_values.push(val); + digit += 1; + } + } + columns + .iter() + .enumerate() + .map(|(col, v)| v.iter().cloned().reduce(|l, r| ops[col].f(l, r)).unwrap()) + .sum::() +} + +#[cfg(test)] +mod tests { + use super::*; + + const EXAMPLE: &str = r"123 328 51 64 + 45 64 387 23 + 6 98 215 314 +* + * + "; + + #[test] + fn part1_example() { + assert_eq!(part1(&parse(EXAMPLE)), 4277556); + } + + #[test] + fn part2_example() { + assert_eq!(part2(&parse2(EXAMPLE)), 3263827); + } +} diff --git a/src/lib.rs b/src/lib.rs index 1bb311f..fb58f07 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,6 +3,7 @@ mod day2; mod day3; mod day4; mod day5; +mod day6; use aoc_runner_derive::aoc_lib;