Skip to content

Commit f457895

Browse files
committed
5th day
1 parent 27e292f commit f457895

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed

data/examples/05.txt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
47|53
2+
97|13
3+
97|61
4+
97|47
5+
75|29
6+
61|13
7+
75|53
8+
29|13
9+
97|29
10+
53|29
11+
61|53
12+
97|53
13+
61|29
14+
47|13
15+
75|47
16+
97|75
17+
47|61
18+
75|61
19+
47|29
20+
75|13
21+
53|13
22+
23+
75,47,61,53,29
24+
97,61,53,29,13
25+
75,29,13
26+
75,97,47,61,53
27+
61,13,29
28+
97,13,75,29,47

src/bin/05.rs

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
advent_of_code::solution!(5);
2+
3+
use advent_of_code::maneatingape::hash::*;
4+
use advent_of_code::maneatingape::iter::*;
5+
use advent_of_code::maneatingape::parse::*;
6+
use std::cmp::Ordering;
7+
8+
fn parse_data(input: &str) -> (FastMap<u32, Vec<u32>>, Vec<Vec<u32>>) {
9+
let (left, right) = input.split_once("\n\n").unwrap();
10+
11+
let mut rules: FastMap<u32, Vec<u32>> = FastMap::new();
12+
left.iter_unsigned().chunk::<2>().for_each(|[key, value]| {
13+
rules.entry(key).or_default().push(value);
14+
});
15+
16+
let updates = right
17+
.lines()
18+
.map(|line| line.iter_unsigned().collect())
19+
.collect();
20+
21+
(rules, updates)
22+
}
23+
24+
fn validate(rules: &FastMap<u32, Vec<u32>>, update: &[u32]) -> bool {
25+
update
26+
.iter()
27+
.enumerate()
28+
.filter_map(|(i, x)| rules.get(x)?.iter().find(|b| update[..i].contains(b)))
29+
.next()
30+
.is_none()
31+
}
32+
33+
pub fn part_one(input: &str) -> Option<u32> {
34+
let (rules, updates) = parse_data(input);
35+
36+
let result = updates
37+
.iter()
38+
.filter(|update| validate(&rules, update))
39+
.map(|update| update[update.len() / 2])
40+
.sum();
41+
42+
Some(result)
43+
}
44+
45+
pub fn part_two(input: &str) -> Option<u32> {
46+
let (rules, mut updates) = parse_data(input);
47+
48+
let update_cmp_f = |a: &u32, b: &u32| match rules.get(a) {
49+
Some(r) => {
50+
if r.contains(b) {
51+
Ordering::Less
52+
} else {
53+
Ordering::Equal
54+
}
55+
}
56+
None => Ordering::Equal,
57+
};
58+
59+
let result = updates
60+
.iter_mut()
61+
.filter(|update| !validate(&rules, update))
62+
.map(|update| {
63+
update.sort_unstable_by(update_cmp_f);
64+
update[update.len() / 2]
65+
})
66+
.sum();
67+
68+
Some(result)
69+
}
70+
71+
#[cfg(test)]
72+
mod tests {
73+
use super::*;
74+
75+
#[test]
76+
fn test_part_one() {
77+
let result = part_one(&advent_of_code::template::read_file("examples", DAY));
78+
assert_eq!(result, Some(143));
79+
}
80+
81+
#[test]
82+
fn test_part_two() {
83+
let result = part_two(&advent_of_code::template::read_file("examples", DAY));
84+
assert_eq!(result, Some(123));
85+
}
86+
}

0 commit comments

Comments
 (0)