| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- namespace Day16;
- public class Tile
- {
- private readonly ISet<IRay> _processed = new HashSet<IRay>();
- 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<IRay> 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();
- }
- }
|