Data.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. namespace Day19;
  2. public record Data(IDictionary<string, Rule> Rules, IList<Part> Parts)
  3. {
  4. public int Process()
  5. {
  6. var sum = 0;
  7. foreach (var part in Parts)
  8. {
  9. Console.WriteLine(part);
  10. var next = "in";
  11. while (next != "A" && next != "R")
  12. {
  13. var rule = Rules[next];
  14. next = rule.Apply(part);
  15. }
  16. if (next == "A")
  17. {
  18. sum += part.Total;
  19. Console.WriteLine("ACCEPTED");
  20. }
  21. else
  22. {
  23. Console.WriteLine("REJECTED");
  24. }
  25. }
  26. return sum;
  27. }
  28. public long ComputePermutations()
  29. {
  30. var sum = 0L;
  31. var queue = new Queue<RuleResultRange>();
  32. queue.Enqueue(new RuleResultRange(new PartRange(), "in"));
  33. while (queue.Count > 0)
  34. {
  35. var current = queue.Dequeue();
  36. Console.WriteLine($"Applying {current.Next} to {current.Part}");
  37. var next = current.Next!;
  38. if (next == "A")
  39. {
  40. sum += current.Part.Total();
  41. Console.WriteLine("ACCEPTED");
  42. }
  43. else if (next == "R")
  44. {
  45. Console.WriteLine("REJECTED");
  46. }
  47. else
  48. {
  49. var rule = Rules[next];
  50. foreach (var r in rule.Apply(current.Part))
  51. {
  52. queue.Enqueue(r);
  53. }
  54. }
  55. }
  56. return sum;
  57. }
  58. }