Advent of Code 2022 https://adventofcode.com/2022
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

day08-1.py 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. MAP = []
  2. DEBUG = False
  3. class Tree:
  4. def __init__(self, x_pos, y_pos, height):
  5. self.x = x_pos
  6. self.y = y_pos
  7. self.height = height
  8. self.view_up = 0
  9. self.view_down = 0
  10. self.view_left = 0
  11. self.view_right = 0
  12. def check_left(self):
  13. if DEBUG:
  14. print("### Checking left ###")
  15. trees = MAP[self.y][:self.x]
  16. tallest = 0
  17. distance = 0
  18. tallest_distance = 0
  19. for tree in trees[::-1]:
  20. distance += 1
  21. if DEBUG:
  22. print(f"{self.height=}, {tree=}, {distance=}, {tallest=}, {tallest_distance=}")
  23. if tree >= self.height:
  24. tallest_distance = distance
  25. break
  26. if tree > tallest:
  27. tallest = tree
  28. tallest_distance = distance
  29. self.view_left = tallest_distance
  30. def check_right(self):
  31. if DEBUG:
  32. print("### Checking right ###")
  33. trees = MAP[self.y][self.x+1:]
  34. tallest, distance, tallest_distance = 0, 0, 0
  35. for tree in trees:
  36. distance += 1
  37. if DEBUG:
  38. print(f"{self.height=}, {tree=}, {distance=}, {tallest=}, {tallest_distance=}")
  39. if tree >= self.height:
  40. tallest_distance = distance
  41. break
  42. if tree > tallest:
  43. tallest = tree
  44. tallest_distance = distance
  45. self.view_right = tallest_distance
  46. def check_up(self):
  47. if DEBUG:
  48. print("### Checking up ###")
  49. trees = [row[self.x] for row in MAP[:self.y]]
  50. tallest, distance, tallest_distance = 0, 0, 0
  51. for tree in trees[::-1]:
  52. distance += 1
  53. if DEBUG:
  54. print(f"{self.height=}, {tree=}, {distance=}, {tallest=}, {tallest_distance=}")
  55. if tree >= self.height:
  56. tallest_distance = distance
  57. break
  58. if tree > tallest:
  59. tallest = tree
  60. tallest_distance = distance
  61. self.view_up = tallest_distance
  62. def check_down(self):
  63. if DEBUG:
  64. print("### Checking down ###")
  65. trees = [row[self.x] for row in MAP[self.y+1:]]
  66. tallest, distance, tallest_distance = 0, 0, 0
  67. for tree in trees:
  68. distance += 1
  69. if DEBUG:
  70. print(f"{self.height=}, {tree=}, {distance=}, {tallest=}, {tallest_distance=}")
  71. if tree >= self.height:
  72. tallest_distance = distance
  73. break
  74. if tree > tallest:
  75. tallest = tree
  76. tallest_distance = distance
  77. self.view_down = tallest_distance
  78. @property
  79. def scenic_score(self):
  80. self.check_down()
  81. self.check_up()
  82. self.check_left()
  83. self.check_right()
  84. return self.view_down + self.view_up + self.view_left + self.view_right
  85. def main():
  86. global MAP, DEBUG
  87. with open("day08.input", "r") as file:
  88. lines = [line.strip() for line in file.readlines()]
  89. MAP = [[int(char) for char in line] for line in lines]
  90. trees = []
  91. for y, line in enumerate(MAP):
  92. for x, tree in enumerate(line):
  93. trees.append(Tree(x, y, tree))
  94. max_score = max(trees, key=lambda t: t.scenic_score)
  95. # max_score = Tree(67, 38, MAP[38][67])
  96. # DEBUG = True
  97. print(max_score.scenic_score)
  98. print(max_score.__dict__)
  99. if __name__ == "__main__":
  100. main()