mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
Implement day 07 part 1.
This commit is contained in:
101
2018/inputs/07.txt
Normal file
101
2018/inputs/07.txt
Normal 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
87
2018/src/day07.rs
Normal 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));
|
||||
}
|
||||
}
|
||||
@@ -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
7
2018/src/samples/07.txt
Normal 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.
|
||||
Reference in New Issue
Block a user