From 58be10ec1e7f3ec7b9f063304104121d2a10a8f7 Mon Sep 17 00:00:00 2001 From: Reiner Herrmann Date: Thu, 5 Dec 2024 18:50:24 +0100 Subject: day5 solution 1 --- src/bin/day5.rs | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 src/bin/day5.rs diff --git a/src/bin/day5.rs b/src/bin/day5.rs new file mode 100644 index 0000000..d13be85 --- /dev/null +++ b/src/bin/day5.rs @@ -0,0 +1,100 @@ +use std::collections::{HashMap, HashSet}; + +static DAY: u8 = 5; + +fn main() { + let input = advent::read_file(DAY); + println!("{DAY}a: {}", PageOrdering::new(&input).right_order_middle()); + println!("{DAY}b: {}", 0); +} + +struct PageOrdering { + rules: HashMap>, + updates: Vec>, +} + +impl PageOrdering { + fn new(input: &str) -> PageOrdering { + let (rules_lines, updates_lines) = input.split_once("\n\n").unwrap(); + + let mut rules = HashMap::new(); + for rule in rules_lines.split("\n") { + let (left, right) = rule.split_once("|").unwrap(); + let left = left.parse::().unwrap(); + let right = right.parse::().unwrap(); + rules.entry(left).or_insert(HashSet::new()).insert(right); + } + + let mut updates = Vec::new(); + for line in updates_lines.split_terminator("\n") { + let update = line.split(",").map(|x| x.parse::().unwrap()).collect::>(); + updates.push(update); + } + + PageOrdering { rules, updates } + } + + fn correct_order(&self, update: &[u32]) -> bool { + for (i, page1) in update.iter().enumerate() { + for page2 in update.iter().skip(i+1) { + let before2 = match self.rules.get(page2) { + Some(r) => r, + None => continue, + }; + if before2.contains(page1) { + return false; + } + } + } + true + } + + fn right_order_middle(&self) -> u32 { + let mut sum = 0; + for update in &self.updates { + if self.correct_order(update) { + sum += update[update.len()/2]; + } + } + sum + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test() { + let input = +"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"; + assert_eq!(PageOrdering::new(input).right_order_middle(), 143); + } +} -- cgit v1.2.3