From 7d0de7aa2b8fdcb69cdae7e494dc89d25bc43db6 Mon Sep 17 00:00:00 2001 From: Alpha Chen Date: Fri, 7 Dec 2018 07:37:16 -0800 Subject: [PATCH] [2018][rust][07.1] --- 2018/rust/src/bin/day_07.rs | 73 +++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 2018/rust/src/bin/day_07.rs diff --git a/2018/rust/src/bin/day_07.rs b/2018/rust/src/bin/day_07.rs new file mode 100644 index 0000000..895b60b --- /dev/null +++ b/2018/rust/src/bin/day_07.rs @@ -0,0 +1,73 @@ +use std::collections::{HashMap, HashSet}; +use std::error::Error; +use std::io::{self, Read}; + +use regex::Regex; + +fn main() -> Result<(), Box> { + let mut input = String::new(); + io::stdin().read_to_string(&mut input)?; + + let output = solve(&input)?; + println!("{}", output); + + Ok(()) +} + +fn solve(input: &str) -> Result> { + let re = Regex::new(r"^Step (\w).*step (\w)").unwrap(); + + let mut steps = HashMap::new(); + input + .trim() + .lines() + .flat_map(|x| re.captures(x)) + .map(|x| { + x.iter() + .flat_map(|x| x) + .map(|x| x.as_str()) + .collect::>() + }) + .map(|x| (x[1], x[2])) + .for_each(|(x, y)| { + steps.entry(x).or_insert_with(HashSet::new); + let entry = steps.entry(y).or_insert_with(HashSet::new); + entry.insert(x); + }); + + let mut output = String::new(); + while !steps.is_empty() { + let mut ready: Vec<_> = steps + .iter() + .filter(|(_, v)| v.is_empty()) + .map(|(k, _)| k) + .collect(); + ready.sort(); + let done = ready[0].clone(); + + steps.remove(done); + for dependencies in steps.values_mut() { + dependencies.remove(done); + } + + output.push_str(done); + } + + Ok(output) +} + +#[test] +fn test_solve() { + let input = r" +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. + "; + + let output = solve(input).unwrap(); + assert_eq!(output, "CABDFE".to_string()); +}