Advertisement
nmgetahun

AoC Day 8 Solution

Dec 9th, 2022 (edited)
356
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.15 KB | Software | 0 0
  1. """
  2. Written by nmgetahun
  3. Github username: nmgetahun
  4.  
  5. Advent of Code Day 8 Challenge:
  6. https://adventofcode.com/2022/day/8
  7. """
  8. # ------------------------------------------------------------------------------
  9. # Part 1
  10. def find_visible():
  11.     visible_master = set()
  12.     row_len = len(forest[0])
  13.     for i, row in enumerate(forest):
  14.         col = [line[i] for line in forest]
  15.         visible_trees_horizontal = [((i, 0), row[0])]
  16.         visible_trees_vertical = [((0, i), col[0])]
  17.  
  18.         # Traverse row left to right
  19.         for k, tree in enumerate(row):
  20.             if tree > visible_trees_horizontal[-1][1]:
  21.                 visible_trees_horizontal.append(((i, k), tree))
  22.  
  23.         # Traverse row right to left
  24.         visible_trees_horizontal.append(((i, row_len - 1), row[-1]))
  25.         for k, tree in enumerate(row[::-1]):
  26.             if tree > visible_trees_horizontal[-1][1]:
  27.                 visible_trees_horizontal.append(((i, row_len - k - 1), tree))
  28.  
  29.         # Traverse col top to btm
  30.         for k, tree in enumerate(col):
  31.             if tree > visible_trees_vertical[-1][1]:
  32.                 visible_trees_vertical.append(((k, i), tree))
  33.  
  34.         # Traverse col btm to top
  35.         visible_trees_vertical.append(((row_len - 1, i), col[-1]))
  36.         for k, tree in enumerate(col[::-1]):
  37.             if tree > visible_trees_vertical[-1][1]:
  38.                 visible_trees_vertical.append(((row_len - k - 1, i), tree))
  39.  
  40.         visible_master = visible_master | set(visible_trees_horizontal) | set(visible_trees_vertical)
  41.  
  42.     return len(visible_master)
  43.  
  44.  
  45. # Part 2
  46. def calculate_scenic_scores():
  47.     max_scenic_score = -1
  48.     best_tree = None
  49.     for i in range(1, len(forest) - 1):
  50.         for k in range(1, len(forest[0]) - 1):
  51.             tree = forest[i][k]
  52.             scenic_score = [0, 0, 0, 0]
  53.  
  54.             # Look left
  55.             for n in range(1, i + 1):
  56.                 scenic_score[0] += 1
  57.                 if tree <= forest[i - n][k]: break
  58.  
  59.             # Look right
  60.             for n in range(i + 1, len(forest)):
  61.                 scenic_score[1] += 1
  62.                 if tree <= forest[n][k]: break
  63.  
  64.             # Look up
  65.             for n in range(1, k + 1):
  66.                 scenic_score[2] += 1
  67.                 if tree <= forest[i][k - n]: break
  68.  
  69.             # Look down
  70.             for n in range(k + 1, len(forest[0])):
  71.                 scenic_score[3] += 1
  72.                 if tree <= forest[i][n]: break
  73.  
  74.             score = scenic_score[0] * scenic_score[1] * scenic_score[2] * scenic_score[3]
  75.             if score > max_scenic_score:
  76.                 max_scenic_score = score
  77.                 best_tree = ((i, k), tree)
  78.  
  79.     print("Best Tree: ", best_tree)
  80.     return max_scenic_score
  81.  
  82.  
  83. # Main
  84. if __name__ == "__main__":
  85.     # Get data from today's AoC input file
  86.     with open("aoc8input.txt") as file:
  87.         forest = [[n for n in line.strip()] for line in file]
  88.  
  89.     # Part 1
  90.     num_visible_trees = find_visible()
  91.  
  92.     # Part 2
  93.     highest_scenic_score = calculate_scenic_scores()
  94.  
  95.     # Display
  96.     print("Part 1: ", num_visible_trees, "\nPart 2: ", highest_scenic_score)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement