35 lines
1.1 KiB
Rust
35 lines
1.1 KiB
Rust
use std::fs;
|
|
use std::collections::HashSet;
|
|
use std::collections::HashMap;
|
|
use std::collections::BTreeSet;
|
|
|
|
fn main() {
|
|
let file = fs::read_to_string("input").expect("Unable to read file");
|
|
let lines = file.split("\n").collect::<Vec<&str>>();
|
|
|
|
let mut prerequisites = HashMap::<char, Vec<char>>::new();
|
|
let mut queue = Vec::new();
|
|
|
|
for line in lines{
|
|
let words: Vec<char> = line.chars().collect();
|
|
|
|
prerequisites.entry(words[36] as char).or_default().push(words[5]);
|
|
prerequisites.entry(words[5]).or_default();
|
|
}
|
|
|
|
let mut todo = prerequisites.keys().cloned().collect::<BTreeSet<_>>();
|
|
let mut prereq_done = HashSet::new();
|
|
|
|
while !todo.is_empty() {
|
|
for c in todo.clone().into_iter() {
|
|
if prerequisites.get(&c).is_none() || prerequisites.get(&c).unwrap().into_iter().all(|prerequisit| prereq_done.contains(prerequisit)){
|
|
queue.push(c);
|
|
prereq_done.insert(c);
|
|
todo.remove(&c);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
println!("{}", queue.into_iter().collect::<String>());
|
|
} |