perf: use par_iter
This commit is contained in:
parent
8d74075bd9
commit
e01ba930ff
52
Cargo.lock
generated
52
Cargo.lock
generated
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
23
src/day06.rs
23
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(
|
||||
|
|
|
@ -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<usize>)) -> 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<usize>)) -> bool {
|
|||
pub fn pt2(input: &str) -> usize {
|
||||
input
|
||||
.lines()
|
||||
.par_bridge()
|
||||
.map(|line| line.split_once(": ").unwrap())
|
||||
.map(|(res, args)| {
|
||||
(
|
||||
|
|
Loading…
Reference in a new issue