Program.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. namespace D12._1
  5. {
  6. class Rules : Dictionary<string, char> { }
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. if (args.Length < 1) return;
  12. if (File.Exists(args[0]) == false) return;
  13. var file = File.OpenText(args[0]);
  14. var state = file.ReadLine().Substring(@"initial state: ".Length);
  15. file.ReadLine();
  16. var ruleset = new Rules();
  17. do
  18. {
  19. var line = file.ReadLine();
  20. if (line == null) break;
  21. var s = line.Split(" => ");
  22. ruleset.Add(s[0], s[1][0]);
  23. } while (true);
  24. int left = 0;
  25. for (int i = 0; i < 20; ++i)
  26. {
  27. string nstate = "";
  28. for (int j = -2; j < state.Length + 2; ++j)
  29. nstate += getState(state, j, ruleset);
  30. left -= 2;
  31. state = nstate;
  32. CalcResult(state, left);
  33. }
  34. }
  35. private static void CalcResult(string state, int l)
  36. {
  37. int left = l;
  38. int result = 0;
  39. foreach (char c in state)
  40. {
  41. if (c == '#') result += left;
  42. left++;
  43. }
  44. Console.WriteLine(result);
  45. }
  46. static char getState(string state, int p, Rules rules)
  47. {
  48. var sb = "";
  49. for (var i = -2; i <= 2; ++i)
  50. sb += p + i < 0 || p + i >= state.Length ? '.' : state[p + i];
  51. return rules[sb];
  52. }
  53. }
  54. }