IRay.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. namespace Day16;
  2. public interface IRay
  3. {
  4. bool IsHorizontal { get; }
  5. bool IsVertical { get; }
  6. (int X, int Y) Apply(Tile t);
  7. IRay Rotate();
  8. IRay AntiRotate();
  9. }
  10. public static class Rays
  11. {
  12. public static IRay North { get; } = new Ray(0, -1);
  13. public static IRay East { get; } = new Ray(1, 0);
  14. public static IRay South { get; } = new Ray(0, 1);
  15. public static IRay West { get; } = new Ray(-1, 0);
  16. private static readonly IList<IRay> _rays = new List<IRay> { North, West, South, East };
  17. private class Ray : IRay
  18. {
  19. private readonly int _dX;
  20. private readonly int _dY;
  21. public bool IsHorizontal => _dX != 0;
  22. public bool IsVertical => _dY != 0;
  23. public Ray(int dX, int dY)
  24. {
  25. _dX = dX;
  26. _dY = dY;
  27. }
  28. public (int X, int Y) Apply(Tile t)
  29. {
  30. return (t.X + _dX, t.Y + _dY);
  31. }
  32. public IRay Rotate()
  33. {
  34. var index = _rays.IndexOf(this);
  35. return _rays[(index + 1) % _rays.Count];
  36. }
  37. public IRay AntiRotate()
  38. {
  39. var index = _rays.IndexOf(this);
  40. return _rays[(index + _rays.Count - 1) % _rays.Count];
  41. }
  42. public override string ToString()
  43. {
  44. return $"{_dX}/{_dY}";
  45. }
  46. }
  47. }