retroactive, to derust my rust
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

day5 part2

+63 -1
+55 -1
src/day5.rs
··· 1 - #[derive(Copy, Clone, Debug)] 1 + use std::collections::{HashMap, HashSet}; 2 + 3 + #[derive(Copy, Clone, Debug, PartialEq, Eq)] 2 4 struct OrderRule { 3 5 before: u8, 4 6 after: u8, ··· 25 27 } 26 28 } 27 29 30 + fn sort_by_order(order_rules: &[OrderRule], update: &[u8]) -> Vec<u8> { 31 + let pages: HashSet<u8> = update.iter().cloned().collect(); 32 + let relevant_order_rules = order_rules 33 + .iter() 34 + .filter(|rule| pages.contains(&rule.before) && pages.contains(&rule.after)) 35 + .collect::<Vec<_>>(); 36 + 37 + //directed adjacency list 38 + let mut digraph = HashMap::new(); 39 + for rule in relevant_order_rules { 40 + digraph 41 + .entry(rule.before) 42 + .or_insert(vec![rule.after]) 43 + .push(rule.after) 44 + } 45 + 46 + topological_sort(digraph) 47 + .into_iter() 48 + .filter(|page| update.contains(page)) 49 + .collect() 50 + } 51 + 52 + fn topological_sort(mut dag: HashMap<u8, Vec<u8>>) -> Vec<u8> { 53 + let mut sort = vec![]; 54 + 55 + while !dag.is_empty() { 56 + let mut start_nodes: HashSet<u8> = dag.keys().cloned().collect(); 57 + 58 + for destination in dag.values().flatten() { 59 + start_nodes.remove(destination); 60 + } 61 + assert_eq!(start_nodes.len(), 1); 62 + 63 + let start = start_nodes.into_iter().next().unwrap(); 64 + sort.push(start); 65 + dag.remove(&start); 66 + } 67 + 68 + sort 69 + } 70 + 28 71 pub fn day5_part1(input: &str) -> String { 29 72 let (rules, updates) = parse(input); 30 73 let sum: u32 = updates 31 74 .iter() 32 75 .filter(|update| rules.iter().all(|rule| rule.follows_rule(update))) 76 + .map(|update| update[update.len() / 2] as u32) 77 + .sum(); 78 + sum.to_string() 79 + } 80 + 81 + pub fn day5_part2(input: &str) -> String { 82 + let (rules, updates) = parse(input); 83 + let sum: u32 = updates 84 + .iter() 85 + .filter(|update| rules.iter().any(|rule| !rule.follows_rule(update))) 86 + .map(|update| sort_by_order(&rules, update)) 33 87 .map(|update| update[update.len() / 2] as u32) 34 88 .sum(); 35 89 sum.to_string()
+8
src/lib.rs
··· 355 355 } 356 356 357 357 #[test] 358 + fn day5_part2_test() { 359 + let test_result = day5::day5_part2(include_str!("../input/day5.test.txt")); 360 + assert_eq!(test_result, "123"); 361 + let result = day5::day5_part2(include_str!("../input/day5.txt")); 362 + assert_eq!(result, "4598"); 363 + } 364 + 365 + #[test] 358 366 fn day4_part1_test() { 359 367 let simplest = "..X...\n.SAMX.\n.A..A.\nXMAS.S\n.X....\n......"; 360 368 let test_result = day4::day4_part1(simplest);