From 7d193f50c285dcce287d79214c074a4916449b00 Mon Sep 17 00:00:00 2001 From: Andrew Coleman Date: Tue, 11 Dec 2018 13:24:25 -0500 Subject: [PATCH] day 7 solution --- 2018/day7/Cargo.lock | 4 ++ 2018/day7/Cargo.toml | 2 +- 2018/day7/src/main.rs | 105 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 2018/day7/Cargo.lock diff --git a/2018/day7/Cargo.lock b/2018/day7/Cargo.lock new file mode 100644 index 0000000..8ca18fd --- /dev/null +++ b/2018/day7/Cargo.lock @@ -0,0 +1,4 @@ +[[package]] +name = "day7" +version = "0.1.0" + diff --git a/2018/day7/Cargo.toml b/2018/day7/Cargo.toml index a7a5fee..1c2f8e9 100644 --- a/2018/day7/Cargo.toml +++ b/2018/day7/Cargo.toml @@ -4,4 +4,4 @@ version = "0.1.0" authors = ["Andrew Coleman "] edition = "2018" -[dependencies] +[dependencies] \ No newline at end of file diff --git a/2018/day7/src/main.rs b/2018/day7/src/main.rs index e7a11a9..236a0c0 100644 --- a/2018/day7/src/main.rs +++ b/2018/day7/src/main.rs @@ -1,3 +1,104 @@ -fn main() { - println!("Hello, world!"); +use std::fs::File; +use std::io::{BufRead, BufReader}; +use std::iter::Iterator; +use std::collections::{BTreeMap, HashMap}; + +type Day7Map = BTreeMap>; + +fn print_map(steps: &Day7Map) { + for (key, value) in steps { + print!("{}: ", key); + for val in value.iter() { + print!("{} ", val); + } + println!(""); + } +} + +fn calc_order(steps: &mut Day7Map) -> String { + let mut first_available = '_'; + for (key, values) in steps.iter_mut() { + if values.is_empty() { + values.push('_'); + first_available = *key; + break; + } + }; + + let mut final_result = String::from(""); + if first_available == '_' { + final_result + } else { + for (_key, values) in steps.iter_mut() { + values.retain(|&x| x != first_available); + } + final_result.push(first_available); + final_result.push_str(calc_order(steps).as_str()); + final_result + } +} + +fn calc_time(steps: &mut Day7Map, time_elapsed: i64, workers: &mut HashMap) -> i64 { + let mut available: Vec = Vec::new(); + + // decrement workers + for (_key, time_remaining) in workers.iter_mut() { + *time_remaining -= 1; + } + + // remove finished workers + workers.retain(|&k, &mut count| { + if count == 0 { + for (_key, values) in steps.iter_mut() { + values.retain(|&x| x != k); + } + false + } else { + true + } + }); + + let mut needed_workers = 5 - workers.len(); + let mut needs_work = false; + for (key, values) in steps.iter_mut() { + if values.is_empty() { + needs_work = true; + if needed_workers > 0 { + values.push('_'); + available.push(*key); + needed_workers -= 1; + if needed_workers == 0 { + break; + } + } + } + } + + // return final sum of time + if !needs_work && workers.is_empty() { + return time_elapsed; + } + + for new_step in available.iter() { + // add new work + workers.entry(*new_step).or_insert(*new_step as i64 - 4); + } + calc_time(steps, time_elapsed + 1, workers) +} + +fn main() { + let mut steps: Day7Map = BTreeMap::new(); + for line in BufReader::new(File::open("input").unwrap()).lines() { + let line_str = line.unwrap(); + let mut chars = line_str.chars(); + let prereq = chars.nth(5).unwrap(); + let target = chars.nth(30).unwrap(); + steps.entry(target).and_modify(|e| e.push(prereq)).or_insert(vec![prereq]); + steps.entry(prereq).or_insert(vec![]); + }; + print_map(&steps); + let order = calc_order(&mut steps.clone()); + println!("final order: {}", order); + let time = calc_time(&mut steps.clone(), 0, &mut HashMap::::new()); + println!("time required for 5 workers: {}", time); }