diff --git a/input/day07.txt b/input/day07.txt new file mode 100644 index 0000000..eb586e7 --- /dev/null +++ b/input/day07.txt @@ -0,0 +1,101 @@ +Step B must be finished before step K can begin. +Step F must be finished before step I can begin. +Step T must be finished before step U can begin. +Step R must be finished before step Z can begin. +Step N must be finished before step S can begin. +Step X must be finished before step Y can begin. +Step I must be finished before step Y can begin. +Step K must be finished before step L can begin. +Step U must be finished before step J can begin. +Step G must be finished before step L can begin. +Step W must be finished before step A can begin. +Step H must be finished before step Q can begin. +Step M must be finished before step L can begin. +Step P must be finished before step L can begin. +Step L must be finished before step A can begin. +Step V must be finished before step Y can begin. +Step Q must be finished before step Y can begin. +Step Z must be finished before step J can begin. +Step O must be finished before step D can begin. +Step Y must be finished before step A can begin. +Step J must be finished before step E can begin. +Step A must be finished before step E can begin. +Step C must be finished before step E can begin. +Step D must be finished before step E can begin. +Step S must be finished before step E can begin. +Step B must be finished before step R can begin. +Step U must be finished before step O can begin. +Step X must be finished before step I can begin. +Step C must be finished before step S can begin. +Step O must be finished before step S can begin. +Step J must be finished before step D can begin. +Step O must be finished before step E can begin. +Step Z must be finished before step O can begin. +Step J must be finished before step C can begin. +Step P must be finished before step Y can begin. +Step X must be finished before step S can begin. +Step O must be finished before step Y can begin. +Step J must be finished before step A can begin. +Step H must be finished before step C can begin. +Step P must be finished before step D can begin. +Step Z must be finished before step S can begin. +Step T must be finished before step Z can begin. +Step Y must be finished before step C can begin. +Step X must be finished before step H can begin. +Step R must be finished before step Y can begin. +Step T must be finished before step W can begin. +Step L must be finished before step O can begin. +Step G must be finished before step Z can begin. +Step H must be finished before step P can begin. +Step I must be finished before step U can begin. +Step H must be finished before step V can begin. +Step N must be finished before step Y can begin. +Step Q must be finished before step E can begin. +Step H must be finished before step D can begin. +Step P must be finished before step O can begin. +Step T must be finished before step I can begin. +Step W must be finished before step V can begin. +Step K must be finished before step M can begin. +Step R must be finished before step W can begin. +Step B must be finished before step T can begin. +Step U must be finished before step A can begin. +Step N must be finished before step H can begin. +Step F must be finished before step U can begin. +Step Q must be finished before step O can begin. +Step Y must be finished before step S can begin. +Step V must be finished before step O can begin. +Step W must be finished before step C can begin. +Step Y must be finished before step J can begin. +Step T must be finished before step V can begin. +Step N must be finished before step D can begin. +Step U must be finished before step Q can begin. +Step A must be finished before step C can begin. +Step U must be finished before step M can begin. +Step Q must be finished before step S can begin. +Step P must be finished before step V can begin. +Step B must be finished before step Z can begin. +Step W must be finished before step Q can begin. +Step L must be finished before step S can begin. +Step I must be finished before step P can begin. +Step G must be finished before step P can begin. +Step L must be finished before step C can begin. +Step K must be finished before step A can begin. +Step D must be finished before step S can begin. +Step I must be finished before step H can begin. +Step R must be finished before step M can begin. +Step Q must be finished before step D can begin. +Step K must be finished before step O can begin. +Step I must be finished before step C can begin. +Step N must be finished before step O can begin. +Step R must be finished before step X can begin. +Step P must be finished before step C can begin. +Step B must be finished before step Y can begin. +Step G must be finished before step E can begin. +Step L must be finished before step V can begin. +Step W must be finished before step Y can begin. +Step C must be finished before step D can begin. +Step M must be finished before step J can begin. +Step F must be finished before step N can begin. +Step T must be finished before step Q can begin. +Step I must be finished before step E can begin. +Step A must be finished before step D can begin. diff --git a/src/main.rs b/src/main.rs index 06fcc20..4069f6a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ fn main() { - // aoc_2018::tasks::day06::task1(); - aoc_2018::tasks::day06::task2(); + aoc_2018::tasks::day07::task1(); + // aoc_2018::tasks::day07::task2(); } diff --git a/src/tasks/day07.rs b/src/tasks/day07.rs new file mode 100644 index 0000000..e54c704 --- /dev/null +++ b/src/tasks/day07.rs @@ -0,0 +1,42 @@ +use crate::utils; +use std::collections::{HashMap, HashSet}; + +pub fn task1() { + let input = utils::read_file("input/day07.txt"); + let mut tasks: HashSet = HashSet::new(); + let dependencies: Vec<(char, char)> = input + .lines() + .map(|line| (line.chars().nth(5).unwrap(), line.chars().nth(36).unwrap())) + .collect(); + + let mut depends_on: HashMap> = HashMap::new(); + for (a, b) in dependencies { + depends_on.entry(b).or_insert(HashSet::new()).insert(a); + tasks.insert(a); + tasks.insert(b); + } + + let mut open: HashSet = tasks + .iter() + .filter(|task| !depends_on.contains_key(task)) + .map(|c| *c) + .collect(); + + let mut result = String::new(); + while open.len() > 0 { + let next = open.iter().min().unwrap().clone(); + open.remove(&next); + result.push(next); + let newly_open: HashSet = depends_on + .iter() + .filter(|(task, deps)| deps.iter().all(|dep| result.chars().any(|c| c == *dep))) + .map(|(task, _)| *task) + .collect(); + open = open.union(&newly_open).map(|c| *c).collect(); + for c in newly_open { + depends_on.remove(&c); + } + } + + println!("{}", result); +} diff --git a/src/tasks/mod.rs b/src/tasks/mod.rs index d945a75..58e7837 100644 --- a/src/tasks/mod.rs +++ b/src/tasks/mod.rs @@ -4,3 +4,4 @@ pub mod day03; pub mod day04; pub mod day05; pub mod day06; +pub mod day07;