diff options
| author | Jan Tuomi <jan.tuomi@eficode.com> | 2018-12-08 18:17:25 +0200 |
|---|---|---|
| committer | Jan Tuomi <jan.tuomi@eficode.com> | 2018-12-08 18:17:25 +0200 |
| commit | e415080d2c87d398340aeca9a76bdc7e83e99734 (patch) | |
| tree | 0281d829c4deb82a5ea36dc98f57e7798175edef /day7/src/main.rs | |
| parent | 2a0f5d3f3d28235abe87898597f8fb89b9668885 (diff) | |
Solve day7
Diffstat (limited to 'day7/src/main.rs')
| -rw-r--r-- | day7/src/main.rs | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/day7/src/main.rs b/day7/src/main.rs new file mode 100644 index 0000000..f79f5fe --- /dev/null +++ b/day7/src/main.rs @@ -0,0 +1,83 @@ +use std::env; +use std::io::BufReader; +use std::io::BufRead; +use std::fs::File; +use std::process; +use std::collections::HashSet; + +#[macro_use] extern crate text_io; + +mod topo_order; +mod schedule; + +type Vertex = char; +type Edge = (Vertex, Vertex); + +fn main() { + let args: Vec<String> = env::args().collect(); + if args.len() != 3 { + println!("Wrong number of arguments. Provide a file name and worker count."); + process::exit(1); + } + let filename = &args[1]; + let worker_count: u32 = args[2].parse().expect("Cannot parse worker count."); + println!("Using file {} as input.", filename); + let f = match File::open(filename) { + Ok(file) => file, + Err(e) => { + println!("Failed to open file {}. {:?}", filename, e); + process::exit(1); + } + }; + let file = BufReader::new(&f); + let lines: Vec<String> = file.lines() + .map(|line| line.expect("Could not parse line.")) + .collect(); + + let mut V: HashSet<Vertex> = HashSet::new(); + let mut E: HashSet<Edge> = HashSet::new(); + let mut V_sources: HashSet<Vertex> = HashSet::new(); + let mut V_sinks: HashSet<Vertex> = HashSet::new(); + for line in &lines { + let (s1, s2): (String, String); + scan!(line.bytes() => "Step {} must be finished before step {} can begin.", s1, s2); + assert_eq!(s1.len(), 1); + assert_eq!(s2.len(), 1); + let ch1: Vec<char> = s1.chars().collect(); + let ch2: Vec<char> = s2.chars().collect(); + let v1 = ch1[0] as Vertex; + let v2 = ch2[0] as Vertex; + let e = (v1, v2) as Edge; + + V.insert(v1); + V.insert(v2); + E.insert(e); + } + + for v in &V { + let edges_where_source: Vec<&Edge> = E.iter() + .filter(|&(v1, _v2)| *v1 == *v) + .collect(); + if edges_where_source.len() == 0 { + V_sinks.insert(*v); + } + + let edges_where_sink: Vec<&Edge> = E.iter() + .filter(|&(_v1, v2)| *v2 == *v) + .collect(); + if edges_where_sink.len() == 0 { + V_sources.insert(*v); + } + } + + println!("V_sources len: {}", V_sources.len()); + println!("V_sinks len: {}", V_sinks.len()); + println!("V len: {}", V.len()); + println!("E len: {}", E.len()); + + let result_1 = topo_order::find(&V, &E, &V_sources); + println!("1. Result: {}", result_1); + + let result_2 = schedule::find(&V, &E, &V_sources, worker_count); + println!("2. Result: {}", result_2); +}
\ No newline at end of file |
