summaryrefslogtreecommitdiffstats
path: root/day7/src/main.rs
diff options
context:
space:
mode:
authorJan Tuomi <jan.tuomi@eficode.com>2018-12-08 18:17:25 +0200
committerJan Tuomi <jan.tuomi@eficode.com>2018-12-08 18:17:25 +0200
commite415080d2c87d398340aeca9a76bdc7e83e99734 (patch)
tree0281d829c4deb82a5ea36dc98f57e7798175edef /day7/src/main.rs
parent2a0f5d3f3d28235abe87898597f8fb89b9668885 (diff)
Solve day7
Diffstat (limited to 'day7/src/main.rs')
-rw-r--r--day7/src/main.rs83
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