diff --git a/src/day2.rs b/src/day2.rs new file mode 100644 index 0000000..916f5ab --- /dev/null +++ b/src/day2.rs @@ -0,0 +1,74 @@ +use aoc_runner_derive::{aoc, aoc_generator}; +use itertools::Itertools; +use std::ops::RangeInclusive; + +#[aoc_generator(day2)] +fn parse(input: &str) -> Vec> { + input + .split(',') + .map(|r| r.split_once('-').unwrap()) + .map(|(start, end)| RangeInclusive::new(start.parse().unwrap(), end.parse().unwrap())) + .collect() +} + +#[aoc(day2, part1, Brute)] +fn part1(input: &[RangeInclusive]) -> u64 { + let mut invalid_sum = 0; + + for r in input { + for product in r.clone() { + let prod_s = product.to_string(); + if prod_s.len() % 2 != 0 { + continue; + } + let (left, right) = prod_s.split_at(prod_s.len() / 2); + if left == right { + invalid_sum += product + } + } + } + invalid_sum +} + +#[aoc(day2, part2, Brute)] +fn part2(input: &[RangeInclusive]) -> u64 { + let mut invalid_sum = 0; + for r in input { + for product in r.clone() { + let prod_s = product.to_string(); + for n in 1..=prod_s.len() / 2 { + if prod_s.len() % n != 0 { + continue; + } + if prod_s + .chars() + .chunks(n) + .into_iter() + .map(|c| c.collect::()) + .all_equal() + { + invalid_sum += product; + break; + } + } + } + } + invalid_sum +} + +#[cfg(test)] +mod tests { + use super::*; + + const EXAMPLE: &str = "11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124"; + + #[test] + fn part1_example() { + assert_eq!(part1(&parse(EXAMPLE)), 1227775554); + } + + #[test] + fn part2_example() { + assert_eq!(part2(&parse(EXAMPLE)), 4174379265); + } +} diff --git a/src/lib.rs b/src/lib.rs index 5645c2a..ce5ab10 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +mod day2; pub mod day1; use aoc_runner_derive::aoc_lib;