From 7b56d98853f52b05ec959a56bf2a0ded97ca12e1 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Fri, 7 Dec 2018 11:26:25 +0100 Subject: [PATCH] Implement day 07 part 1. --- 2018/inputs/07.txt | 101 ++++++++++++++++++++++++++++++++++++++++ 2018/src/day07.rs | 87 ++++++++++++++++++++++++++++++++++ 2018/src/main.rs | 2 + 2018/src/samples/07.txt | 7 +++ 4 files changed, 197 insertions(+) create mode 100644 2018/inputs/07.txt create mode 100644 2018/src/day07.rs create mode 100644 2018/src/samples/07.txt diff --git a/2018/inputs/07.txt b/2018/inputs/07.txt new file mode 100644 index 0000000..8a7264e --- /dev/null +++ b/2018/inputs/07.txt @@ -0,0 +1,101 @@ +Step Q must be finished before step O can begin. +Step Z must be finished before step G can begin. +Step W must be finished before step V can begin. +Step C must be finished before step X can begin. +Step O must be finished before step E can begin. +Step K must be finished before step N can begin. +Step P must be finished before step I can begin. +Step X must be finished before step D can begin. +Step N must be finished before step E can begin. +Step F must be finished before step A can begin. +Step U must be finished before step Y can begin. +Step M must be finished before step H can begin. +Step J must be finished before step B can begin. +Step B must be finished before step E can begin. +Step S must be finished before step L can begin. +Step A must be finished before step L can begin. +Step E must be finished before step L can begin. +Step L must be finished before step G can begin. +Step D must be finished before step I can begin. +Step Y must be finished before step I can begin. +Step I must be finished before step G can begin. +Step G must be finished before step R can begin. +Step V must be finished before step T can begin. +Step R must be finished before step H can begin. +Step H must be finished before step T can begin. +Step S must be finished before step E can begin. +Step C must be finished before step E can begin. +Step P must be finished before step T can begin. +Step I must be finished before step H can begin. +Step O must be finished before step P can begin. +Step M must be finished before step L can begin. +Step S must be finished before step D can begin. +Step P must be finished before step D can begin. +Step P must be finished before step R can begin. +Step I must be finished before step R can begin. +Step Y must be finished before step G can begin. +Step Q must be finished before step L can begin. +Step N must be finished before step R can begin. +Step J must be finished before step E can begin. +Step N must be finished before step T can begin. +Step B must be finished before step V can begin. +Step Q must be finished before step B can begin. +Step J must be finished before step H can begin. +Step F must be finished before step B can begin. +Step W must be finished before step X can begin. +Step S must be finished before step T can begin. +Step J must be finished before step G can begin. +Step O must be finished before step R can begin. +Step K must be finished before step B can begin. +Step Z must be finished before step O can begin. +Step Q must be finished before step S can begin. +Step K must be finished before step V can begin. +Step B must be finished before step R can begin. +Step J must be finished before step T can begin. +Step E must be finished before step T can begin. +Step G must be finished before step V can begin. +Step D must be finished before step Y can begin. +Step M must be finished before step Y can begin. +Step F must be finished before step G can begin. +Step C must be finished before step P can begin. +Step V must be finished before step R can begin. +Step R must be finished before step T can begin. +Step J must be finished before step Y can begin. +Step U must be finished before step R can begin. +Step Z must be finished before step F can begin. +Step Q must be finished before step V can begin. +Step U must be finished before step M can begin. +Step J must be finished before step R can begin. +Step L must be finished before step V can begin. +Step W must be finished before step K can begin. +Step B must be finished before step Y can begin. +Step O must be finished before step N can begin. +Step D must be finished before step V can begin. +Step P must be finished before step B can begin. +Step U must be finished before step I can begin. +Step O must be finished before step T can begin. +Step S must be finished before step G can begin. +Step X must be finished before step A can begin. +Step U must be finished before step T can begin. +Step A must be finished before step I can begin. +Step B must be finished before step G can begin. +Step N must be finished before step Y can begin. +Step Z must be finished before step J can begin. +Step M must be finished before step D can begin. +Step U must be finished before step A can begin. +Step S must be finished before step R can begin. +Step Z must be finished before step A can begin. +Step Y must be finished before step R can begin. +Step E must be finished before step Y can begin. +Step N must be finished before step G can begin. +Step Z must be finished before step X can begin. +Step P must be finished before step X can begin. +Step Z must be finished before step T can begin. +Step Z must be finished before step P can begin. +Step V must be finished before step H can begin. +Step P must be finished before step L can begin. +Step L must be finished before step H can begin. +Step X must be finished before step V can begin. +Step W must be finished before step G can begin. +Step N must be finished before step D can begin. +Step Z must be finished before step U can begin. diff --git a/2018/src/day07.rs b/2018/src/day07.rs new file mode 100644 index 0000000..a9a5ba9 --- /dev/null +++ b/2018/src/day07.rs @@ -0,0 +1,87 @@ +use std::cmp::Reverse; +use std::collections::HashMap; +use std::io::BufRead; +use std::io::BufReader; +use std::io::Read; + +use regex::Regex; + +use common::Solution; +use std::collections::HashSet; +use std::collections::BinaryHeap; + +fn append_edge(target: &mut HashMap>, source: char, dest: char) { + target.entry(source).or_insert(Vec::new()).push(dest); +} + +#[derive(Default, Debug)] +pub struct Day07 { + forward: HashMap>, + backward: HashMap>, +} + +impl Day07 { + pub fn new() -> Self { + Default::default() + } + + fn read_edges(&mut self, input: &mut Read) { + let reader = BufReader::new(input); + let regex = Regex::new(r"Step (\w) must be finished before step (\w) can begin").unwrap(); + + for line in reader.lines() { + let line = line.unwrap(); + let groups = regex.captures(&line).unwrap(); + let a = groups[1].chars().next().unwrap(); + let b = groups[2].chars().next().unwrap(); + + append_edge(&mut self.forward, a, b); + append_edge(&mut self.backward, b, a); + } + } +} + +impl Solution for Day07 { + fn part1(&mut self, input: &mut Read) -> String { + self.read_edges(input); + + let mut result = String::new(); + let mut finished = HashSet::new(); + + let mut starting_points: BinaryHeap> = self.forward.keys().filter(|&x| !self.backward.contains_key(x)) + .map(|&x| Reverse(x)).collect(); + + while let Some(Reverse(c)) = starting_points.pop() { + result.push(c); + finished.insert(c); + + if let Some(dependents) = self.forward.get(&c) { + for d in dependents { + if self.backward.get(d).unwrap().iter().all(|x| finished.contains(x)) { + starting_points.push(Reverse(*d)); + } + } + } + } + + result + } + + fn part2(&mut self, input: &mut Read) -> String { + unimplemented!() + } +} + +#[cfg(test)] +mod tests { + use common::Solution; + use day07::Day07; + + const SAMPLE_INPUT: &[u8] = include_bytes!("samples/07.txt"); + + #[test] + pub fn sample_part1() { + let mut instance = Day07::new(); + assert_eq!("CABDFE", instance.part1(&mut SAMPLE_INPUT)); + } +} diff --git a/2018/src/main.rs b/2018/src/main.rs index d2faf48..be4bae2 100644 --- a/2018/src/main.rs +++ b/2018/src/main.rs @@ -16,6 +16,7 @@ pub mod day03; pub mod day04; pub mod day05; pub mod day06; +pub mod day07; fn get_impl(day: &str) -> Box { match day.parse() { @@ -25,6 +26,7 @@ fn get_impl(day: &str) -> Box { Ok(4) => Box::new(day04::Day04::new()), Ok(5) => Box::new(day05::Day05::new()), Ok(6) => Box::new(day06::Day06::new()), + Ok(7) => Box::new(day07::Day07::new()), Ok(val) => panic!("Unimplemented day {}", val), _ => panic!("Invalid number"), } diff --git a/2018/src/samples/07.txt b/2018/src/samples/07.txt new file mode 100644 index 0000000..9ab25bf --- /dev/null +++ b/2018/src/samples/07.txt @@ -0,0 +1,7 @@ +Step C must be finished before step A can begin. +Step C must be finished before step F can begin. +Step A must be finished before step B can begin. +Step A must be finished before step D can begin. +Step B must be finished before step E can begin. +Step D must be finished before step E can begin. +Step F must be finished before step E can begin.