solution.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!/usr/bin/python3
  2. import sys
  3. import re
  4. # part 1
  5. def is_visible(string, element):
  6. return int(element) == max([int(e) for e in string]) and string.count(element) == 1
  7. def part1():
  8. grid = [line.strip() for line in sys.stdin]
  9. gridT = [''.join([grid[row][col] for row in range(len(grid))]) for col in range(len(grid[0]))]
  10. #print(grid, gridT)
  11. visible = len(grid[0]) + len(grid[-1]) + len(gridT[0]) + len(gridT[-1]) - 4
  12. for y in range(1, len(gridT) - 1):
  13. for x in range(1, len(grid) - 1):
  14. element = grid[y][x]
  15. can_be_seen = is_visible(grid[y][:x + 1], element) or \
  16. is_visible(grid[y][x:], element) or \
  17. is_visible(gridT[x][:y + 1], element) or \
  18. is_visible(gridT[x][y:], element)
  19. visible += 1 if can_be_seen else 0
  20. #print(y, x, 'is visible' if can_be_seen else 'is not visible')
  21. print(f'{visible} visible trees')
  22. # part 2
  23. def count_smaller(string):
  24. for i, c in enumerate(string[1:]):
  25. if c >= string[0]:
  26. return i + 1
  27. return len(string) - 1
  28. def part2():
  29. grid = [line.strip() for line in sys.stdin]
  30. gridT = [''.join([grid[row][col] for row in range(len(grid))]) for col in range(len(grid[0]))]
  31. max_score = 0
  32. for y in range(1, len(gridT) - 1):
  33. for x in range(1, len(grid) - 1):
  34. element = grid[y][x]
  35. scenic_left = count_smaller(grid[y][:x + 1][::-1])
  36. scenic_right = count_smaller(grid[y][x:])
  37. scenic_up = count_smaller(gridT[x][:y + 1][::-1])
  38. scenic_down = count_smaller(gridT[x][y:])
  39. #print(scenic_up, scenic_left, scenic_down, scenic_right)
  40. scenic_score = scenic_left * scenic_right * scenic_up * scenic_down
  41. if scenic_score > max_score:
  42. max_score = scenic_score
  43. print(f'new max scenic score of {max_score}')
  44. if sys.argv[1] in '1':
  45. part1()
  46. else:
  47. part2()