diff options
author | Tom Smeding <tom.smeding@gmail.com> | 2018-12-07 17:08:25 +0100 |
---|---|---|
committer | Tom Smeding <tom.smeding@gmail.com> | 2018-12-07 17:08:25 +0100 |
commit | 2bf13506380721f0fd00be81b80792b0c0a001ca (patch) | |
tree | 9c91d6696c74d20b4db4051f1eff28d71407eee7 /2018/src | |
parent | c474e4c4e8008cec27b6cd696f2a47fe25e0a739 (diff) |
Day 7 WIP
Diffstat (limited to '2018/src')
-rw-r--r-- | 2018/src/day7.rs | 61 | ||||
-rw-r--r-- | 2018/src/main.rs | 4 |
2 files changed, 64 insertions, 1 deletions
diff --git a/2018/src/day7.rs b/2018/src/day7.rs new file mode 100644 index 0000000..1924916 --- /dev/null +++ b/2018/src/day7.rs @@ -0,0 +1,61 @@ +use std::io; +use std::io::BufRead; +use std::cmp::Ordering; +use std::collections::BinaryHeap; + +#[derive(PartialEq, Eq)] +struct DecreasingU8(u8); + +impl PartialOrd for DecreasingU8 { + fn partial_cmp(&self, other: &Self) -> Option<Ordering> { + Some(self.cmp(other)) + } +} + +impl Ord for DecreasingU8 { + fn cmp(&self, other: &Self) -> Ordering { + other.0.cmp(&self.0) + } +} + +fn simulation(nexts: &[Vec<u8>], nelves: i32, basetime: i32, inctime: i32) -> (String, i32) { + let mut incoming = [0; 26]; + for tos in nexts.iter() { + for &to in tos { + incoming[to as usize] += 1; + } + } + + let mut sources = BinaryHeap::new(); + for i in 0..26 { + if incoming[i as usize] == 0 { + sources.push(DecreasingU8(i)); + } + } + + 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)); + } + } + } + + (order, 0) +} + +pub fn main<T: BufRead>(reader: T) -> io::Result<(String, String)> { + let mut nexts: Vec<Vec<u8>> = vec![vec![]; 26]; + for l in reader.lines().map(|l| l.unwrap()) { + let (from, to) = (l.as_bytes()[5] - 65, l.as_bytes()[36] - 65); + nexts[from as usize].push(to); + } + + let (part1, _) = simulation(&nexts, 1, 1, 0); + + Ok((part1, String::new())) +} diff --git a/2018/src/main.rs b/2018/src/main.rs index c35e142..fccb319 100644 --- a/2018/src/main.rs +++ b/2018/src/main.rs @@ -15,8 +15,9 @@ mod day3; mod day4; mod day5; mod day6; +mod day7; -static NUM_DAYS: i32 = 6; +static NUM_DAYS: i32 = 7; fn day_switch<T: BufRead>(day: i32, reader: T) -> io::Result<(String, String)> { match day { @@ -26,6 +27,7 @@ fn day_switch<T: BufRead>(day: i32, reader: T) -> io::Result<(String, String)> { 4 => day4::main(reader), 5 => day5::main(reader), 6 => day6::main(reader), + 7 => day7::main(reader), _ => Err(Error::new(ErrorKind::Other, "Invalid day")) } } |