Tile.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. namespace Day16;
  2. public class Tile
  3. {
  4. private readonly ISet<IRay> _processed = new HashSet<IRay>();
  5. public int X { get; }
  6. public int Y { get; }
  7. public char Value { get; }
  8. public bool IsEnergized { get; private set; }
  9. public Tile(int x, int y, char value)
  10. {
  11. X = x;
  12. Y = y;
  13. Value = value;
  14. }
  15. public IEnumerable<IRay> Process(IRay incoming)
  16. {
  17. if (_processed.Contains(incoming))
  18. {
  19. yield break;
  20. }
  21. IsEnergized = true;
  22. _processed.Add(incoming);
  23. switch (Value)
  24. {
  25. case '/':
  26. yield return incoming.IsHorizontal ? incoming.Rotate() : incoming.AntiRotate();
  27. break;
  28. case '\\':
  29. yield return incoming.IsVertical ? incoming.Rotate() : incoming.AntiRotate();
  30. break;
  31. case '|':
  32. if (incoming.IsHorizontal)
  33. {
  34. yield return incoming.Rotate();
  35. yield return incoming.AntiRotate();
  36. }
  37. else
  38. {
  39. yield return incoming;
  40. }
  41. break;
  42. case '-':
  43. if (incoming.IsVertical)
  44. {
  45. yield return incoming.Rotate();
  46. yield return incoming.AntiRotate();
  47. }
  48. else
  49. {
  50. yield return incoming;
  51. }
  52. break;
  53. default:
  54. yield return incoming;
  55. break;
  56. }
  57. }
  58. public void Clear()
  59. {
  60. IsEnergized = false;
  61. _processed.Clear();
  62. }
  63. }