Advertisement
Guest User

Untitled

a guest
Dec 28th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 5.15 KB | None | 0 0
  1. pub mod day07 {
  2.     use std::collections::HashMap;
  3.     use std::collections::HashSet;
  4.     use std::fmt::Write;
  5.  
  6.     pub fn run() {
  7.         let path = "data/input_day7.txt";
  8.         let file_string = std::fs::read_to_string(path).unwrap();
  9.         let mut dependencies: HashMap<u8, HashSet<u8>> = HashMap::new();
  10.  
  11.         for line in file_string.lines() {
  12.             let chars = line.as_bytes();
  13.             let depends_on = chars[5] - 'A' as u8;
  14.             let step = chars[36] - 'A' as u8;
  15.  
  16.             dependencies
  17.                 .entry(step)
  18.                 .or_insert(HashSet::new())
  19.                 .insert(depends_on);
  20.  
  21.             dependencies.entry(depends_on).or_insert(HashSet::new());
  22.         }
  23.  
  24.         let mut num_completed = 0;
  25.         let mut completed: Vec<bool> = vec![false; dependencies.len()];
  26.         let mut completeable: Vec<u8> = Vec::new();
  27.         let mut order: Vec<u8> = Vec::new();
  28.  
  29.         while num_completed < dependencies.len() {
  30.             for (step, deps) in &dependencies {
  31.                 if completed[*step as usize] {
  32.                     continue;
  33.                 }
  34.  
  35.                 let mut all_completed = true;
  36.                 for dep in deps {
  37.                     if !completed[*dep as usize] {
  38.                         all_completed = false;
  39.                         break;
  40.                     }
  41.                 }
  42.  
  43.                 if all_completed {
  44.                     completeable.push(*step);
  45.                 }
  46.             }
  47.  
  48.             completeable.sort();
  49.             order.push(completeable[0]);
  50.             completed[completeable[0] as usize] = true;
  51.             num_completed += 1;
  52.  
  53.             completeable.clear();
  54.         }
  55.  
  56.         let mut result: String = String::with_capacity(order.len());
  57.         for step in order {
  58.             result.push(('A' as u8 + step) as char);
  59.         }
  60.  
  61.         println!("Day 7, Problem 1 - [{}]", result);
  62.  
  63.         // Problem 2
  64.         let mut num_completed = 0;
  65.         let mut completed: Vec<bool> = vec![false; dependencies.len()];
  66.         let mut in_progress: HashSet<u8> = HashSet::new();
  67.         let mut workable: Vec<u8> = Vec::new();
  68.  
  69.         #[derive(Copy, Clone)]
  70.         struct Worker {
  71.             step: u8,
  72.             time_left: u8,
  73.         };
  74.  
  75.         const NO_STEP: u8 = 255;
  76.         const NUM_WORKERS: usize = 5;
  77.         const BASE_TIME: u8 = 60;
  78.  
  79.         let mut workers: [Worker; NUM_WORKERS] = [Worker {
  80.             step: NO_STEP,
  81.             time_left: 0,
  82.         }; NUM_WORKERS];
  83.         let mut free_workers = NUM_WORKERS;
  84.         let mut time = 0;
  85.  
  86.         while num_completed < dependencies.len() {
  87.             let mut work_str = String::new();
  88.             write!(&mut work_str, "{}", time).unwrap();
  89.  
  90.             // Advance time
  91.             let mut did_work = false;
  92.             for worker in &mut workers {
  93.                 if worker.step != NO_STEP {
  94.                     write!(&mut work_str, " {}", (worker.step + 'A' as u8) as char).unwrap();
  95.  
  96.                     worker.time_left -= 1;
  97.                     did_work = true;
  98.                     if worker.time_left == 0 {
  99.                         completed[worker.step as usize] = true;
  100.                         num_completed += 1;
  101.                         in_progress.remove(&worker.step);
  102.  
  103.                         worker.step = NO_STEP;
  104.                         free_workers += 1;
  105.                     }
  106.                 } else {
  107.                     write!(&mut work_str, " .").unwrap();
  108.                 }
  109.             }
  110.  
  111.             if did_work {
  112.                 time += 1;
  113.             }
  114.  
  115.             // All workers busy, advance time!
  116.             if free_workers == 0 {
  117.                 continue;
  118.             }
  119.  
  120.             // Look for steps that are workable but not in_progress
  121.             for (step, deps) in &dependencies {
  122.                 if completed[*step as usize] {
  123.                     continue;
  124.                 }
  125.  
  126.                 if in_progress.contains(step) {
  127.                     continue;
  128.                 }
  129.  
  130.                 let mut all_completed = true;
  131.                 for dep in deps {
  132.                     if !completed[*dep as usize] {
  133.                         all_completed = false;
  134.                         break;
  135.                     }
  136.                 }
  137.  
  138.                 if all_completed {
  139.                     workable.push(*step);
  140.                 }
  141.             }
  142.  
  143.             // Assign workable steps to workers
  144.             workable.sort();
  145.             let mut i = 0;
  146.             while free_workers > 0 && i < workable.len() {
  147.                 for worker in &mut workers {
  148.                     if worker.step == NO_STEP {
  149.                         worker.step = workable[i];
  150.                         worker.time_left = BASE_TIME + worker.step + 1;
  151.                         i += 1;
  152.                         in_progress.insert(worker.step);
  153.                         free_workers -= 1;
  154.                     }
  155.  
  156.                     if i >= workable.len() {
  157.                         break;
  158.                     }
  159.                 }
  160.             }
  161.             workable.clear();
  162.         }
  163.  
  164.         println!("Day 7, Problem 2 - [{}]", time);
  165.     }
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement