Priority queue added on aoc 15

This commit is contained in:
2023-09-19 16:32:57 +02:00
parent 7a0bc59bd2
commit 4f1a3b8e7a
3 changed files with 90 additions and 3 deletions

View File

@@ -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",
]

View File

@@ -7,3 +7,4 @@ edition = "2021"
[dependencies]
nom = "7.1.2"
priority-queue = "1.3.2"

View File

@@ -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;
}
}