feat: Day 2
This commit is contained in:
parent
91d9d7b1dc
commit
3740d93f81
86
aoc_2025/src/day2.rs
Normal file
86
aoc_2025/src/day2.rs
Normal file
@ -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<Parsed> = 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::<u64>()
|
||||||
|
})
|
||||||
|
.sum::<u64>();
|
||||||
|
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::<u64>()
|
||||||
|
})
|
||||||
|
.sum::<u64>();
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,7 +1,7 @@
|
|||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
#![allow(unused)]
|
#![allow(unused)]
|
||||||
|
|
||||||
mod day1;
|
mod day2;
|
||||||
|
|
||||||
struct AoC<T> {
|
struct AoC<T> {
|
||||||
parse: fn(String) -> T,
|
parse: fn(String) -> T,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user