Implement day 07 part 1.

This commit is contained in:
2018-12-07 11:26:25 +01:00
parent 1582b556d8
commit 7b56d98853
4 changed files with 197 additions and 0 deletions

101
2018/inputs/07.txt Normal file
View File

@@ -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.

87
2018/src/day07.rs Normal file
View File

@@ -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<char, Vec<char>>, source: char, dest: char) {
target.entry(source).or_insert(Vec::new()).push(dest);
}
#[derive(Default, Debug)]
pub struct Day07 {
forward: HashMap<char, Vec<char>>,
backward: HashMap<char, Vec<char>>,
}
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<Reverse<char>> = 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));
}
}

View File

@@ -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<common::Solution> {
match day.parse() {
@@ -25,6 +26,7 @@ fn get_impl(day: &str) -> Box<common::Solution> {
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"),
}

7
2018/src/samples/07.txt Normal file
View File

@@ -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.