Advertisement
nmgetahun

AoC Day 8 Solution

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