generated from janezicmatej/aoc-template
solution: day 5
This commit is contained in:
parent
000000601e
commit
0000007016
|
@ -0,0 +1,28 @@
|
||||||
|
47|53
|
||||||
|
97|13
|
||||||
|
97|61
|
||||||
|
97|47
|
||||||
|
75|29
|
||||||
|
61|13
|
||||||
|
75|53
|
||||||
|
29|13
|
||||||
|
97|29
|
||||||
|
53|29
|
||||||
|
61|53
|
||||||
|
97|53
|
||||||
|
61|29
|
||||||
|
47|13
|
||||||
|
75|47
|
||||||
|
97|75
|
||||||
|
47|61
|
||||||
|
75|61
|
||||||
|
47|29
|
||||||
|
75|13
|
||||||
|
53|13
|
||||||
|
|
||||||
|
75,47,61,53,29
|
||||||
|
97,61,53,29,13
|
||||||
|
75,29,13
|
||||||
|
75,97,47,61,53
|
||||||
|
61,13,29
|
||||||
|
97,13,75,29,47
|
|
@ -0,0 +1,97 @@
|
||||||
|
use std::cmp::Ordering;
|
||||||
|
|
||||||
|
use hashbrown::HashSet;
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct PageUpdates {
|
||||||
|
raw: Vec<usize>,
|
||||||
|
sorted: Vec<usize>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PageUpdates {
|
||||||
|
fn middle(&self) -> usize {
|
||||||
|
self.sorted[self.sorted.len() / 2]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_sorted(&self) -> bool {
|
||||||
|
self.raw == self.sorted
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_updates(input: &str) -> Vec<PageUpdates> {
|
||||||
|
let (page_orderings, updates) = input.split_once("\n\n").unwrap();
|
||||||
|
|
||||||
|
let mut ordering = HashSet::new();
|
||||||
|
|
||||||
|
for line in page_orderings.lines() {
|
||||||
|
let (a, b) = line.split_once('|').unwrap();
|
||||||
|
let a = a.parse().unwrap();
|
||||||
|
let b = b.parse().unwrap();
|
||||||
|
ordering.insert((a, b));
|
||||||
|
}
|
||||||
|
|
||||||
|
let cmp = |&a: &usize, &b: &usize| {
|
||||||
|
if ordering.contains(&(a, b)) {
|
||||||
|
Ordering::Less
|
||||||
|
} else if ordering.contains(&(b, a)) {
|
||||||
|
Ordering::Greater
|
||||||
|
} else {
|
||||||
|
Ordering::Equal
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut page_updates = vec![];
|
||||||
|
for update in updates.lines() {
|
||||||
|
let raw = update
|
||||||
|
.split(',')
|
||||||
|
.filter_map(|x| x.parse().ok())
|
||||||
|
.collect_vec();
|
||||||
|
|
||||||
|
let mut sorted = raw.clone();
|
||||||
|
sorted.sort_by(cmp);
|
||||||
|
|
||||||
|
page_updates.push(PageUpdates { raw, sorted });
|
||||||
|
}
|
||||||
|
|
||||||
|
page_updates
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part_one(input: &str) -> Option<usize> {
|
||||||
|
parse_updates(input)
|
||||||
|
.iter()
|
||||||
|
.filter(|pu| pu.is_sorted())
|
||||||
|
.map(PageUpdates::middle)
|
||||||
|
.sum::<usize>()
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn part_two(input: &str) -> Option<usize> {
|
||||||
|
parse_updates(input)
|
||||||
|
.iter()
|
||||||
|
.filter(|pu| !pu.is_sorted())
|
||||||
|
.map(PageUpdates::middle)
|
||||||
|
.sum::<usize>()
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
|
||||||
|
aoc::solution!(5);
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
#[test]
|
||||||
|
fn test_part_one() {
|
||||||
|
assert_eq!(
|
||||||
|
part_one(&aoc::template::read_file("examples", 5)),
|
||||||
|
Some(143)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn test_part_two() {
|
||||||
|
assert_eq!(
|
||||||
|
part_two(&aoc::template::read_file("examples", 5)),
|
||||||
|
Some(123)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue