summaryrefslogtreecommitdiff
path: root/2018/src
diff options
context:
space:
mode:
authorTom Smeding <tom.smeding@gmail.com>2018-12-07 17:08:25 +0100
committerTom Smeding <tom.smeding@gmail.com>2018-12-07 17:08:25 +0100
commit2bf13506380721f0fd00be81b80792b0c0a001ca (patch)
tree9c91d6696c74d20b4db4051f1eff28d71407eee7 /2018/src
parentc474e4c4e8008cec27b6cd696f2a47fe25e0a739 (diff)
Day 7 WIP
Diffstat (limited to '2018/src')
-rw-r--r--2018/src/day7.rs61
-rw-r--r--2018/src/main.rs4
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"))
}
}