diff --git a/src/day10.rs b/src/day10.rs new file mode 100644 index 0000000..d2fd180 --- /dev/null +++ b/src/day10.rs @@ -0,0 +1,106 @@ +use std::collections::HashMap; + +use aoc_runner_derive::{aoc, aoc_generator}; +use itertools::Itertools; + +#[aoc_generator(day10)] +fn parse(input: &str) -> Vec { + input.lines().map(str::parse).map(Result::unwrap).sorted().collect_vec() +} + +#[aoc(day10, part1)] +fn part1(input: &Vec) -> u32 { + let mut count1 = 1; + let mut count3 = 1; + for (lhs, rhs) in input.iter().tuple_windows() { + match rhs - lhs { + 1 => count1 += 1, + 3 => count3 += 1, + _ => unreachable!() + } + } + + count1 * count3 +} + +#[aoc(day10, part2)] +fn part2(input: &Vec) -> i64 { + let mut ans = HashMap::new(); + ans.insert(0, 1); + for adapter in input.iter().cloned().map(|x| x as i32) { + let to_insert = ans.get(&(adapter as i32 - 1)).unwrap_or(&0) + ans.get(&(adapter as i32 - 2)).unwrap_or(&0) + ans.get(&(adapter as i32 - 3)).unwrap_or(&0); + ans.insert(adapter, to_insert.clone()); + } + + ans[&(*input.last().unwrap() as i32)] +} + + +#[cfg(test)] +mod tests { + use super::*; + +const EX: &str = r"16 +10 +15 +5 +1 +11 +7 +19 +6 +12 +4"; + +const EX_2: &str = r"28 +33 +18 +42 +31 +14 +46 +20 +48 +47 +24 +23 +49 +45 +19 +38 +39 +11 +1 +32 +25 +35 +8 +17 +7 +9 +4 +2 +34 +10 +3"; + + #[test] + fn part1_example() { + assert_eq!(part1(&parse(EX)), 35); + } + + #[test] + fn part1_example2() { + assert_eq!(part1(&parse(EX_2)), 220); + } + + #[test] + fn part2_example() { + assert_eq!(part2(&parse(EX)), 8); + } + + #[test] + fn part2_example2() { + assert_eq!(part2(&parse(EX_2)), 19208); + } +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index d73adf1..78c4048 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +mod day10; mod day9; mod day8; mod day7;