From 7c41554094bd50cb21937e71deec6dac411eb4f5 Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Fri, 7 Dec 2018 20:23:31 +0100 Subject: Day 7 --- 2018/src/day7.rs | 59 ++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/2018/src/day7.rs b/2018/src/day7.rs index 1924916..e44bca1 100644 --- a/2018/src/day7.rs +++ b/2018/src/day7.rs @@ -4,22 +4,22 @@ use std::cmp::Ordering; use std::collections::BinaryHeap; #[derive(PartialEq, Eq)] -struct DecreasingU8(u8); +struct Decreasing(T); -impl PartialOrd for DecreasingU8 { +impl PartialOrd for Decreasing { fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) + other.0.partial_cmp(&self.0) } } -impl Ord for DecreasingU8 { +impl Ord for Decreasing { fn cmp(&self, other: &Self) -> Ordering { other.0.cmp(&self.0) } } fn simulation(nexts: &[Vec], nelves: i32, basetime: i32, inctime: i32) -> (String, i32) { - let mut incoming = [0; 26]; + let mut incoming = [0 as u8; 26]; for tos in nexts.iter() { for &to in tos { incoming[to as usize] += 1; @@ -29,23 +29,47 @@ fn simulation(nexts: &[Vec], nelves: i32, basetime: i32, inctime: i32) -> (S let mut sources = BinaryHeap::new(); for i in 0..26 { if incoming[i as usize] == 0 { - sources.push(DecreasingU8(i)); + sources.push(Decreasing(i as u8)); } } + #[derive(PartialEq, Eq, PartialOrd, Ord)] + struct Completed { + time: i32, + job: u8, + }; + let mut evqu = BinaryHeap::new(); + let mut order = String::new(); - while sources.len() > 0 { - let DecreasingU8(i) = sources.pop().unwrap(); - order.push(char::from(i + 65)); - for &to in &nexts[i as usize] { - incoming[to as usize] -= 1; - if incoming[to as usize] == 0 { - sources.push(DecreasingU8(to)); - } + let mut elves = nelves; + let mut current_time = 0; + + loop { + while elves > 0 && sources.len() > 0 { + let Decreasing(job) = sources.pop().unwrap(); + evqu.push(Decreasing(Completed {time: current_time + basetime + inctime * (job as i32 + 1), job})); + elves -= 1; } + + match evqu.pop() { + Some(Decreasing(event)) => { + current_time = event.time; + order.push(char::from(event.job + 65)); + + for &to in &nexts[event.job as usize] { + incoming[to as usize] -= 1; + if incoming[to as usize] == 0 { + sources.push(Decreasing(to)); + } + } + + elves += 1; + } + None => break + }; } - (order, 0) + (order, current_time) } pub fn main(reader: T) -> io::Result<(String, String)> { @@ -55,7 +79,8 @@ pub fn main(reader: T) -> io::Result<(String, String)> { nexts[from as usize].push(to); } - let (part1, _) = simulation(&nexts, 1, 1, 0); + let part1 = simulation(&nexts, 1, 1, 0).0; + let part2 = simulation(&nexts, 4, 60, 1).1.to_string(); - Ok((part1, String::new())) + Ok((part1, part2)) } -- cgit v1.2.3-54-g00ecf