diff --git a/aoc_2025/src/day2.rs b/aoc_2025/src/day2.rs new file mode 100644 index 0000000..17d63e5 --- /dev/null +++ b/aoc_2025/src/day2.rs @@ -0,0 +1,86 @@ +use crate::AoC; +use winnow::{ + Parser, Result, + ascii::digit1, + combinator::{separated, separated_pair}, +}; + +type Parsed = Vec<(u64, u64)>; + +const AOC: AoC = AoC::new(parse, part1, part2); + +fn parse(input: String) -> Parsed { + let mut input: &str = input.as_str(); + separated(1.., parse_range, ",") + .parse_next(&mut input) + .unwrap() +} + +fn parse_range(input: &mut &str) -> Result<(u64, u64)> { + separated_pair(digit1.parse_to(), "-", digit1.parse_to()).parse_next(input) +} + +fn part1(input: &Parsed) -> String { + let res = input + .iter() + .map(|(from, to)| { + (*from..=*to) + .filter(|i| { + let n = (i.ilog10() + 1) >> 1; + let p = 10u64.pow(n); + i / p == i % p + }) + .sum::() + }) + .sum::(); + format!("{res}") +} + +fn part2(input: &Parsed) -> String { + let res = input + .iter() + .map(|(from, to)| { + (*from..=*to) + .filter(|i| { + let n = (i.ilog10() + 1); + (1..=(n >> 1)).filter(|p| n % p == 0).any(|p| { + (1..(n / p)) + .all(|s| i % 10u64.pow(p) == (i / 10u64.pow(p * s)) % 10u64.pow(p)) + }) + }) + .sum::() + }) + .sum::(); + format!("{res}") +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn part1_test() { + AOC.assert1( + "11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124", + "1227775554", + ); + } + + #[test] + fn part1_solve() { + AOC.assert1(include_str!("../input/day2.txt"), "12599655151"); + } + + #[test] + fn part2_test() { + AOC.assert2( + "11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124", + "4174379265", + ); + } + + #[test] + fn part2_solve() { + AOC.assert2(include_str!("../input/day2.txt"), "20942028255"); + } +} diff --git a/aoc_2025/src/lib.rs b/aoc_2025/src/lib.rs index 4f4d5ea..d4729c8 100644 --- a/aoc_2025/src/lib.rs +++ b/aoc_2025/src/lib.rs @@ -1,7 +1,7 @@ #![allow(dead_code)] #![allow(unused)] -mod day1; +mod day2; struct AoC { parse: fn(String) -> T,