diff --git a/src/day2.rs b/src/day2.rs index 916f5ab..04b3447 100644 --- a/src/day2.rs +++ b/src/day2.rs @@ -1,5 +1,6 @@ use aoc_runner_derive::{aoc, aoc_generator}; use itertools::Itertools; +use std::cmp::{max, min}; use std::ops::RangeInclusive; #[aoc_generator(day2)] @@ -56,6 +57,52 @@ fn part2(input: &[RangeInclusive]) -> u64 { invalid_sum } +#[aoc(day2, part1, ArithmeticBrute)] +fn part1_arithmetic_brute(input: &[RangeInclusive]) -> u64 { + let mut invalid_sum = 0; + for r in input { + // println!("Range: {:?}", r); + for product in r.clone() { + let n_digits = product.ilog10() + 1; + if n_digits % 2 != 0 { + continue; + } + + let decade = 10u64.pow(n_digits / 2); + let lhs = product / decade; + let rhs = product % decade; + // println!("{product} {n_digits}: D:{decade} L:{lhs} R:{rhs}"); + if lhs == rhs { + invalid_sum += product + } + } + } + invalid_sum +} + +#[aoc(day2, part2, ArithmeticBrute)] +fn part2_arithmetic_brute(input: &[RangeInclusive]) -> u64 { + let mut invalid_sum = 0; + for r in input { + for product in r.clone() { + let n_digits = product.ilog10() + 1; + + for n in 1..=n_digits / 2 { + if n_digits % n != 0 { + continue; + } + let decade = 10u64.pow(n); + let lhs = product / decade; + let rhs = product % decade; + if lhs == rhs { + invalid_sum += product + } + } + } + } + invalid_sum +} + #[cfg(test)] mod tests { use super::*; @@ -71,4 +118,13 @@ mod tests { fn part2_example() { assert_eq!(part2(&parse(EXAMPLE)), 4174379265); } + + #[test] + fn part1_arithmetic_example() { + assert_eq!(part1_arithmetic_brute(&parse(EXAMPLE)), 1227775554); + } + #[test] + fn part2_arithmetic_example() { + assert_eq!(part2_arithmetic_brute(&parse(EXAMPLE)), 1227775554); + } }