diff --git a/Cargo.lock b/Cargo.lock index 33f01d2..c3e91c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -31,6 +31,7 @@ name = "aoc2024" version = "0.1.0" dependencies = [ "color-eyre", + "rayon", "regex", "tracing", "tracing-subscriber", @@ -94,6 +95,37 @@ dependencies = [ "tracing-error", ] +[[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 = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + [[package]] name = "eyre" version = "0.6.12" @@ -219,6 +251,26 @@ dependencies = [ "proc-macro2", ] +[[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", +] + [[package]] name = "regex" version = "1.11.1" diff --git a/Cargo.toml b/Cargo.toml index ee4bc43..2c86cb5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ day7 = [] [dependencies] color-eyre = "0.6.3" +rayon = "1.10.0" regex = "1.11.1" tracing = "0.1.41" tracing-subscriber = "0.3.19" diff --git a/src/day06.rs b/src/day06.rs index 19e870c..0e5ecf0 100644 --- a/src/day06.rs +++ b/src/day06.rs @@ -1,5 +1,8 @@ use std::collections::HashSet; +use rayon::iter::ParallelBridge; +use rayon::prelude::*; + #[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)] enum Direction { Up, @@ -98,11 +101,14 @@ pub fn pt2(input: &str) -> usize { let mut initial_direction = Direction::Up; let original_grid: Vec<_> = parse_grid(input, &mut initial_direction, &mut initial_position); - let mut result = 0; - for (y, row) in original_grid.iter().enumerate() { - for (x, _) in row.iter().enumerate() { + original_grid + .iter() + .enumerate() + .flat_map(|(y, row)| (0..row.len()).map(move |x| (x, y))) + .par_bridge() + .filter(|&(x, y)| { if (x, y) == initial_position { - continue; + return false; } let mut grid = original_grid.clone(); grid[y][x] = Field::Blocked; @@ -158,12 +164,9 @@ pub fn pt2(input: &str) -> usize { Field::Guard(_) => unreachable!(), } } - if !is_valid { - result += 1; - }; - } - } - result + !is_valid + }) + .count() } fn parse_grid( diff --git a/src/day07.rs b/src/day07.rs index 3917f5c..25a8fc8 100644 --- a/src/day07.rs +++ b/src/day07.rs @@ -1,6 +1,9 @@ +use rayon::iter::ParallelBridge; +use rayon::prelude::*; pub fn pt1(input: &str) -> usize { input .lines() + .par_bridge() .map(|line| line.split_once(": ").unwrap()) .map(|(res, args)| { ( @@ -25,6 +28,9 @@ fn can_calibrate((res, args): &(usize, Vec)) -> bool { } else { current_res *= arg; } + if current_res > *res { + return false; + } i >>= 1; } current_res == *res @@ -57,6 +63,7 @@ fn can_calibrate_concat((res, args): &(usize, Vec)) -> bool { pub fn pt2(input: &str) -> usize { input .lines() + .par_bridge() .map(|line| line.split_once(": ").unwrap()) .map(|(res, args)| { (