Advertisement
Guest User

Untitled

a guest
Dec 20th, 2024
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.32 KB | None | 0 0
  1. # Input: grid of # . S E
  2. # Output: how many cheating paths (two consecutive steps allowed to hit #)
  3. #           get from S to E (UDLR) at least 100 steps faster than non-cheating?
  4. #         a cheat is identified by its start position (before the first #)
  5. #           and end position
  6.  
  7. grid = []
  8.  
  9. sr, sc, er, ec = -1, -1, -1, -1
  10.  
  11. r = 0
  12. file = open("20_input.txt", "r")
  13. for line in file:
  14.   line = line.replace("\n", "")
  15.   row = []
  16.   c = 0
  17.   for character in line:
  18.     if character == "S":
  19.       sr, sc = r, c
  20.       character = "."
  21.     if character == "E":
  22.       er, ec = r, c
  23.       character = "."
  24.     row.append(character)
  25.     c += 1
  26.   grid.append(row)
  27.   r += 1
  28.  
  29. distance_from_start = []
  30. distance_from_end = []
  31. for r in range(len(grid)):
  32.   row = [-1] * len(grid[0])
  33.   distance_from_start.append(row)
  34.   row = [-1] * len(grid[0])
  35.   distance_from_end.append(row)
  36. distance_from_start[sr][sc] = 0
  37. distance_from_end[er][ec] = 0
  38.  
  39. cells_from_start = [[sr, sc]]
  40. while len(cells_from_start) > 0:
  41.   cell = cells_from_start[0]
  42.   cells_from_start = cells_from_start[1:]
  43.   distance = distance_from_start[cell[0]][cell[1]]
  44.   nr, nc = cell[0] - 1, cell[1]
  45.   if grid[nr][nc] == ".":
  46.     if distance_from_start[nr][nc] == -1 or distance_from_start[nr][nc] > distance + 1:
  47.       distance_from_start[nr][nc] = distance + 1
  48.       cells_from_start.append([nr, nc])
  49.   nr, nc = cell[0] + 1, cell[1]
  50.   if grid[nr][nc] == ".":
  51.     if distance_from_start[nr][nc] == -1 or distance_from_start[nr][nc] > distance + 1:
  52.       distance_from_start[nr][nc] = distance + 1
  53.       cells_from_start.append([nr, nc])
  54.   nr, nc = cell[0], cell[1] - 1
  55.   if grid[nr][nc] == ".":
  56.     if distance_from_start[nr][nc] == -1 or distance_from_start[nr][nc] > distance + 1:
  57.       distance_from_start[nr][nc] = distance + 1
  58.       cells_from_start.append([nr, nc])
  59.   nr, nc = cell[0], cell[1] + 1
  60.   if grid[nr][nc] == ".":
  61.     if distance_from_start[nr][nc] == -1 or distance_from_start[nr][nc] > distance + 1:
  62.       distance_from_start[nr][nc] = distance + 1
  63.       cells_from_start.append([nr, nc])
  64.  
  65. cells_from_end = [[er, ec]]
  66. while len(cells_from_end) > 0:
  67.   cell = cells_from_end[0]
  68.   cells_from_end = cells_from_end[1:]
  69.   distance = distance_from_end[cell[0]][cell[1]]
  70.   nr, nc = cell[0] - 1, cell[1]
  71.   if grid[nr][nc] == ".":
  72.     if distance_from_end[nr][nc] == -1 or distance_from_end[nr][nc] > distance + 1:
  73.       distance_from_end[nr][nc] = distance + 1
  74.       cells_from_end.append([nr, nc])
  75.   nr, nc = cell[0] + 1, cell[1]
  76.   if grid[nr][nc] == ".":
  77.     if distance_from_end[nr][nc] == -1 or distance_from_end[nr][nc] > distance + 1:
  78.       distance_from_end[nr][nc] = distance + 1
  79.       cells_from_end.append([nr, nc])
  80.   nr, nc = cell[0], cell[1] - 1
  81.   if grid[nr][nc] == ".":
  82.     if distance_from_end[nr][nc] == -1 or distance_from_end[nr][nc] > distance + 1:
  83.       distance_from_end[nr][nc] = distance + 1
  84.       cells_from_end.append([nr, nc])
  85.   nr, nc = cell[0], cell[1] + 1
  86.   if grid[nr][nc] == ".":
  87.     if distance_from_end[nr][nc] == -1 or distance_from_end[nr][nc] > distance + 1:
  88.       distance_from_end[nr][nc] = distance + 1
  89.       cells_from_end.append([nr, nc])
  90.  
  91. total = 0
  92. non_cheat_time = distance_from_start[er][ec]
  93. for r in range(len(grid)):
  94.   for c in range(len(grid[0])):
  95.     if grid[r][c] == ".":
  96.       for dr in range(-2, 3):
  97.         for dc in range(-2, 3):
  98.           if abs(dr) + abs(dc) == 2:
  99.             nr, nc = r + dr, c + dc
  100.             if nr >= 0 and nr < len(grid) and nc >= 0 and nc < len(grid):
  101.               if grid[nr][nc] == ".":
  102.                 # skip paths that overshoot the goal
  103.                 if dr == 0 and c < ec and nc > ec:
  104.                   continue
  105.                 if dr == 0 and c > ec and nc < ec:
  106.                   continue
  107.                 if dc == 0 and r > er and nr < er:
  108.                   continue
  109.                 if dc == 0 and r < er and nr > er:
  110.                   continue
  111.                 # skip paths whose first cheat step isn't a cheat
  112.                 if dr == 0 and grid[r][c + int(dc/2)] == ".":
  113.                   continue
  114.                 if dc == 0 and grid[r + int(dr/2)][c] == ".":
  115.                   continue
  116.                 savings = non_cheat_time - (distance_from_start[r][c] + 2 + distance_from_end[nr][nc])
  117.                 if savings >= 100:
  118.                   total += 1
  119. print (total)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement