day10
This commit is contained in:
parent
b44361e14d
commit
0407edf928
109
src/day10.rs
Normal file
109
src/day10.rs
Normal file
@ -0,0 +1,109 @@
|
||||
use std::collections::HashMap;
|
||||
|
||||
use aoc_runner_derive::{aoc, aoc_generator};
|
||||
use itertools::Itertools;
|
||||
|
||||
#[aoc_generator(day10)]
|
||||
fn parse(input: &str) -> Vec<u32> {
|
||||
input.lines().map(str::parse).map(Result::unwrap).sorted().collect_vec()
|
||||
}
|
||||
|
||||
#[aoc(day10, part1)]
|
||||
fn part1(input: &Vec<u32>) -> 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<u32>) -> 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);
|
||||
}
|
||||
}
|
@ -1,3 +1,4 @@
|
||||
mod day10;
|
||||
mod day9;
|
||||
mod day8;
|
||||
mod day7;
|
||||
|
Loading…
Reference in New Issue
Block a user