From 4f1a3b8e7a3613a731ed75b70ec1256245644c4f Mon Sep 17 00:00:00 2001 From: Philippe Zwietering Date: Tue, 19 Sep 2023 16:32:57 +0200 Subject: [PATCH] Priority queue added on aoc 15 --- advent_of_code/2022/15/Cargo.lock | 33 +++++++++++++++++ advent_of_code/2022/15/Cargo.toml | 1 + advent_of_code/2022/15/src/main.rs | 59 ++++++++++++++++++++++++++++-- 3 files changed, 90 insertions(+), 3 deletions(-) diff --git a/advent_of_code/2022/15/Cargo.lock b/advent_of_code/2022/15/Cargo.lock index b8ae363..91a258b 100644 --- a/advent_of_code/2022/15/Cargo.lock +++ b/advent_of_code/2022/15/Cargo.lock @@ -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", +] diff --git a/advent_of_code/2022/15/Cargo.toml b/advent_of_code/2022/15/Cargo.toml index 200567e..d5ddb4f 100644 --- a/advent_of_code/2022/15/Cargo.toml +++ b/advent_of_code/2022/15/Cargo.toml @@ -7,3 +7,4 @@ edition = "2021" [dependencies] nom = "7.1.2" +priority-queue = "1.3.2" diff --git a/advent_of_code/2022/15/src/main.rs b/advent_of_code/2022/15/src/main.rs index 1c646b2..7b0418d 100644 --- a/advent_of_code/2022/15/src/main.rs +++ b/advent_of_code/2022/15/src/main.rs @@ -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 = 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; + } }