namespace Day16; public class Tile { private readonly ISet _processed = new HashSet(); public int X { get; } public int Y { get; } public char Value { get; } public bool IsEnergized { get; private set; } public Tile(int x, int y, char value) { X = x; Y = y; Value = value; } public IEnumerable Process(IRay incoming) { if (_processed.Contains(incoming)) { yield break; } IsEnergized = true; _processed.Add(incoming); switch (Value) { case '/': yield return incoming.IsHorizontal ? incoming.Rotate() : incoming.AntiRotate(); break; case '\\': yield return incoming.IsVertical ? incoming.Rotate() : incoming.AntiRotate(); break; case '|': if (incoming.IsHorizontal) { yield return incoming.Rotate(); yield return incoming.AntiRotate(); } else { yield return incoming; } break; case '-': if (incoming.IsVertical) { yield return incoming.Rotate(); yield return incoming.AntiRotate(); } else { yield return incoming; } break; default: yield return incoming; break; } } public void Clear() { IsEnergized = false; _processed.Clear(); } }