diff options
| author | Reiner Herrmann <reiner@reiner-h.de> | 2024-12-05 18:50:24 +0100 |
|---|---|---|
| committer | Reiner Herrmann <reiner@reiner-h.de> | 2024-12-05 18:50:24 +0100 |
| commit | 58be10ec1e7f3ec7b9f063304104121d2a10a8f7 (patch) | |
| tree | 097d3dccaf15cfc85b5ed8e322424e8a28efbee6 /src | |
| parent | e53174284c0cbf19116d6aa0f5f44ca733b05145 (diff) | |
day5 solution 1
Diffstat (limited to 'src')
| -rw-r--r-- | src/bin/day5.rs | 100 |
1 files changed, 100 insertions, 0 deletions
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<u32,HashSet<u32>>, + updates: Vec<Vec<u32>>, +} + +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::<u32>().unwrap(); + let right = right.parse::<u32>().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::<u32>().unwrap()).collect::<Vec<_>>(); + 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); + } +} |
