parent
ea3cc23c7c
commit
7d0de7aa2b
@ -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<Error>> {
|
||||
let mut input = String::new();
|
||||
io::stdin().read_to_string(&mut input)?;
|
||||
|
||||
let output = solve(&input)?;
|
||||
println!("{}", output);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn solve(input: &str) -> Result<String, Box<Error>> {
|
||||
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::<Vec<_>>()
|
||||
})
|
||||
.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());
|
||||
}
|
Loading…
Reference in new issue