Tile.cs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. namespace Day10;
  2. public record Tile(char Pipe, GridPoint Position)
  3. {
  4. private int? _display;
  5. public bool HasDisplay => _display != null;
  6. public string? Display => _display == null ? Pipe.ToString() : (_display % 10).ToString();
  7. public IEnumerable<GridPoint> GetConnections()
  8. {
  9. switch (Pipe)
  10. {
  11. case '|':
  12. yield return Position.North();
  13. yield return Position.South();
  14. break;
  15. case '-':
  16. yield return Position.East();
  17. yield return Position.West();
  18. break;
  19. case 'L':
  20. yield return Position.North();
  21. yield return Position.East();
  22. break;
  23. case 'J':
  24. yield return Position.North();
  25. yield return Position.West();
  26. break;
  27. case '7':
  28. yield return Position.South();
  29. yield return Position.West();
  30. break;
  31. case 'F':
  32. yield return Position.South();
  33. yield return Position.East();
  34. break;
  35. case 'S':
  36. yield return Position.North();
  37. yield return Position.East();
  38. yield return Position.South();
  39. yield return Position.West();
  40. break;
  41. default:
  42. yield break;
  43. }
  44. }
  45. public void SetDisplay(int display)
  46. {
  47. _display = display;
  48. }
  49. public bool ConnectsTo(GridPoint other)
  50. {
  51. return Pipe == 'S' || GetConnections().Any(c => c == other);
  52. }
  53. }