Priority queue added on aoc 15
This commit is contained in:
33
advent_of_code/2022/15/Cargo.lock
generated
33
advent_of_code/2022/15/Cargo.lock
generated
@@ -2,11 +2,34 @@
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.12.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "1.9.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"hashbrown",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "main"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"nom",
|
||||
"priority-queue",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -30,3 +53,13 @@ dependencies = [
|
||||
"memchr",
|
||||
"minimal-lexical",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "priority-queue"
|
||||
version = "1.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fff39edfcaec0d64e8d0da38564fad195d2d51b680940295fcc307366e101e61"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"indexmap",
|
||||
]
|
||||
|
||||
@@ -7,3 +7,4 @@ edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
nom = "7.1.2"
|
||||
priority-queue = "1.3.2"
|
||||
|
||||
@@ -5,6 +5,7 @@ use nom::{
|
||||
sequence::{preceded, separated_pair},
|
||||
IResult,
|
||||
};
|
||||
use priority_queue::PriorityQueue;
|
||||
use std::collections::HashSet;
|
||||
|
||||
fn parse_input(input: &str) -> IResult<&str, Vec<((i32, i32), (i32, i32))>> {
|
||||
@@ -63,16 +64,19 @@ fn fill_line(
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Eq, Hash)]
|
||||
enum EventType {
|
||||
Start,
|
||||
Intersection,
|
||||
Middle,
|
||||
End,
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Eq, Hash)]
|
||||
struct Event {
|
||||
x: i32,
|
||||
y: i32,
|
||||
coord: (i32, i32),
|
||||
t: EventType,
|
||||
line_id: u32,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
@@ -119,5 +123,54 @@ fn main() {
|
||||
// Je krijgt dan 3 event-types: start van een lijnstuk, een kruising en het einde van een lijnstuk.
|
||||
// Enige is dat je alleen in de daadwerkelijke coordinaat-range zoals in de opgave dingen wilt
|
||||
// mee laten tellen.
|
||||
const max_coord: i32 = 4000000;
|
||||
const MAX_COORD: i32 = 8000000;
|
||||
|
||||
let mut event_queue: PriorityQueue<Event, (i32, i32)> = PriorityQueue::new();
|
||||
let mut line_id = 0;
|
||||
for &(sensor, beacon) in coord_list.iter() {
|
||||
let sensor = (sensor.0 * 2, sensor.1 * 2);
|
||||
let beacon = (beacon.0 * 2, beacon.1 * 2);
|
||||
|
||||
let dist = manhattan_dist(sensor, beacon);
|
||||
|
||||
let begin = (sensor.0 + dist, sensor.1);
|
||||
let middle_1 = (sensor.0, sensor.1 - dist);
|
||||
let middle_2 = (sensor.0, sensor.1 + dist);
|
||||
let end = (sensor.0 - dist, sensor.1);
|
||||
|
||||
event_queue.push(
|
||||
Event {
|
||||
coord: begin,
|
||||
t: EventType::Start,
|
||||
line_id,
|
||||
},
|
||||
begin,
|
||||
);
|
||||
event_queue.push(
|
||||
Event {
|
||||
coord: middle_1,
|
||||
t: EventType::Middle,
|
||||
line_id,
|
||||
},
|
||||
middle_1,
|
||||
);
|
||||
event_queue.push(
|
||||
Event {
|
||||
coord: middle_2,
|
||||
t: EventType::Middle,
|
||||
line_id,
|
||||
},
|
||||
middle_2,
|
||||
);
|
||||
event_queue.push(
|
||||
Event {
|
||||
coord: end,
|
||||
t: EventType::End,
|
||||
line_id,
|
||||
},
|
||||
end,
|
||||
);
|
||||
|
||||
line_id += 1;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user