diff --git a/day5/Cargo.lock b/day5/Cargo.lock index c640100..b56d812 100644 --- a/day5/Cargo.lock +++ b/day5/Cargo.lock @@ -2,6 +2,60 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + [[package]] name = "day5" version = "0.1.0" +dependencies = [ + "rayon", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] diff --git a/day5/Cargo.toml b/day5/Cargo.toml index 49bdb49..71cc1c9 100644 --- a/day5/Cargo.toml +++ b/day5/Cargo.toml @@ -4,3 +4,4 @@ version = "0.1.0" edition = "2021" [dependencies] +rayon = "1.10.0" diff --git a/day5/src/main.rs b/day5/src/main.rs index f98ac3f..de3f04c 100644 --- a/day5/src/main.rs +++ b/day5/src/main.rs @@ -1,3 +1,5 @@ +use rayon::prelude::*; + struct ParsedInput { rules: Vec<(u32, u32)>, pages: Vec>, @@ -33,35 +35,33 @@ fn all_rules_apply(rules: &[(u32, u32)], page: &[u32]) -> bool { fn part1(parsed_input: &ParsedInput) -> u32 { parsed_input .pages - .iter() + .par_iter() .filter(|page| all_rules_apply(&parsed_input.rules, page)) .map(|rule| rule[rule.len() / 2]) .sum() } -fn part2(parsed_input: &ParsedInput) -> u32 { +fn correct_page(page: &mut [u32], rules: &[(u32, u32)]) { + page.sort_by(|a, b| match all_rules_apply(rules, &[*a, *b]) { + true => std::cmp::Ordering::Less, + false => std::cmp::Ordering::Greater, + }); +} + +fn part2(parsed_input: &mut ParsedInput) -> u32 { parsed_input .pages - .iter() + .par_iter_mut() .filter(|page| !all_rules_apply(&parsed_input.rules, page)) - .fold(vec![], |mut acc, curr| { - let mut corrected_page = curr.clone(); - corrected_page.sort_unstable_by(|a, b| { - match all_rules_apply(&parsed_input.rules, &[*a, *b]) { - true => std::cmp::Ordering::Less, - false => std::cmp::Ordering::Greater, - } - }); - acc.push(corrected_page); - acc + .map(|page| { + correct_page(page, &parsed_input.rules); + page[page.len() / 2] }) - .iter() - .map(|rule| rule[rule.len() / 2]) .sum() } fn main() { - let input = parse(include_str!("../input.txt")); + let mut input = parse(include_str!("../input.txt")); println!("{}", part1(&input)); - println!("{}", part2(&input)); + println!("{}", part2(&mut input)); }