Program.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text.RegularExpressions;
  6. namespace D4._1
  7. {
  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 dic = new Dictionary<DateTime, string>();
  15. var guard = new Dictionary<string, (int, Dictionary<int, int>)>();
  16. var file = File.OpenText(args[0]);
  17. var regex = new Regex(@"\[(.*)\]");
  18. do
  19. {
  20. var line = file.ReadLine();
  21. if (line == null) break;
  22. var dateStr = line.Substring(0 , 18).Trim('[', ']');
  23. var date = DateTime.Parse(dateStr);
  24. dic.Add(date, line.Substring(19, line.Length - 19));
  25. } while (true);
  26. var ordered = dic.OrderBy(kvp => kvp.Key);
  27. string curGuard = string.Empty;
  28. DateTime asleep = DateTime.Now;
  29. foreach (var kvp in ordered)
  30. {
  31. var date = kvp.Key;
  32. var str = kvp.Value;
  33. if (str.StartsWith("Guard")) curGuard = str.Split(' ')[1];
  34. {
  35. if (guard.ContainsKey(curGuard) == false)
  36. {
  37. var d = new Dictionary<int, int>();
  38. for (var i = 0; i < 60; i++) d.Add(i, 0);
  39. guard.Add(curGuard, (0, d));
  40. }
  41. }
  42. if (str == "falls asleep")
  43. {
  44. asleep = date;
  45. }
  46. if (str == "wakes up")
  47. {
  48. var c = guard[curGuard];
  49. c.Item1 += (date - asleep).Minutes;
  50. for (int m = asleep.Minute; m < date.Minute; m++)
  51. c.Item2[m] += 1;
  52. guard[curGuard] = c;
  53. }
  54. }
  55. var sleeper = guard.OrderByDescending(g => g.Value.Item1).FirstOrDefault();
  56. Console.WriteLine($"Guard {sleeper.Key} sleeps {sleeper.Value.Item1}min");
  57. var minutes = sleeper.Value.Item2.OrderByDescending(m => m.Value).FirstOrDefault();
  58. Console.WriteLine($"Guard {sleeper.Key} mostly slept on {minutes.Key}th minute");
  59. var id = int.Parse(sleeper.Key.TrimStart('#'));
  60. Console.WriteLine($"Answer : {id * minutes.Key}");
  61. }
  62. }
  63. }