Program.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. namespace D7._2
  6. {
  7. class Steps : SortedDictionary<char, HashSet<char>> { }
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. if (args.Length < 1) return;
  13. if (File.Exists(args[0]) == false) return;
  14. var file = File.OpenText(args[0]);
  15. var steps = new Steps();
  16. var builders = new (char task, int time)?[5];
  17. int totalWorkTime = 0;
  18. do
  19. {
  20. var line = file.ReadLine();
  21. if (line == null) break;
  22. AddDependency(steps, line);
  23. } while (true);
  24. do
  25. {
  26. // Assign tasks to available workers
  27. (char task, int time)? quickest = AssignWorkers(steps, builders);
  28. // Work assigned tasks
  29. if (quickest.HasValue == false) DumpData(steps, builders);
  30. else WorkIt(steps, builders, quickest.Value);
  31. totalWorkTime += quickest.Value.time;
  32. Console.WriteLine($"Total elapsed time : '{totalWorkTime}'");
  33. } while (steps.Count > 0);
  34. Console.WriteLine($"===== ANSWER ==========");
  35. Console.WriteLine($"Total elapsed time : '{totalWorkTime}'");
  36. }
  37. private static void WorkIt(Steps steps, (char task, int time)?[] builders, (char task, int time) quickest)
  38. {
  39. for (int i = 0; i < builders.Length; ++i)
  40. {
  41. if (builders[i].HasValue == false) continue;
  42. var builder = builders[i].Value;
  43. builder.time -= quickest.time;
  44. if (builder.time <= 0)
  45. {
  46. builders[i] = null;
  47. removeDependency(steps, quickest.task);
  48. Console.WriteLine($"Worker #{i} finnished task '{builder.task}'");
  49. }
  50. else builders[i] = builder;
  51. }
  52. }
  53. private static (char task, int time)? AssignWorkers(Steps steps, (char task, int time)?[] builders)
  54. {
  55. (char task, int time)? quickest = null;
  56. for (int i = 0; i < builders.Length; ++i)
  57. {
  58. if (builders[i].HasValue == false)
  59. {
  60. (char task, int time)? taskN = getFirstTask(steps);
  61. if (taskN.HasValue == false) continue;
  62. var t = taskN.Value;
  63. steps.Remove(t.task);
  64. builders[i] = t;
  65. Console.WriteLine($"Assigned task '{t.task}' to worker #{i} (load : {t.time}s)");
  66. }
  67. if (quickest.HasValue == false || builders[i].Value.time < quickest.Value.time)
  68. quickest = builders[i];
  69. }
  70. return quickest;
  71. }
  72. static void removeDependency(Steps steps, char dep)
  73. {
  74. foreach (var step in steps)
  75. step.Value.Remove(dep);
  76. }
  77. static (char task, int time)? getFirstTask(Steps steps)
  78. {
  79. foreach (var step in steps)
  80. {
  81. if (step.Value.Count == 0)
  82. return (step.Key, (int)(step.Key - 'A' + 1) + 60);
  83. }
  84. return null;
  85. }
  86. static void AddDependency(IDictionary<char, HashSet<char>> steps, string line)
  87. {
  88. var left = line.Substring(5, 1)[0];
  89. var right = line.Substring(36, 1)[0];
  90. if (steps.ContainsKey(left) == false) steps.Add(left, new HashSet<char>());
  91. if (steps.ContainsKey(right) == false) steps.Add(right, new HashSet<char>());
  92. steps[right].Add(left);
  93. }
  94. // ---------------------------------------------------------------------------------------
  95. private static void DumpData(Steps steps, (char task, int time)?[] builders)
  96. {
  97. Console.WriteLine($"===== DUMP WORKERS ==========");
  98. for (int i = 0; i < builders.Length; ++i)
  99. {
  100. var builder = builders[i];
  101. if (builder.HasValue)
  102. Console.WriteLine($"Worker #{i} state : Task '{builder.Value.task}', {builder.Value.time}s left");
  103. else
  104. Console.WriteLine($"Worker #{i} state : VACANT");
  105. }
  106. Console.WriteLine($"===== DUMP STEPS ==========");
  107. foreach (var step in steps)
  108. {
  109. Console.WriteLine($"Step '{step.Key}' state : {step.Value.Count} dependencies left");
  110. }
  111. }
  112. }
  113. }