Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def get_adjacent_tiles(grid, j, i):
- deltas = (-1, 0, 1)
- prev_tiles, adjacent_tiles = [], ""
- for i_delta in deltas:
- for j_delta in deltas:
- i_delta = 0 if i == 0 and i_delta < 0 else i_delta
- j_delta = 0 if j == 0 and j_delta < 0 else j_delta
- if i_delta == j_delta == 0:
- continue
- elif (j + j_delta, i + i_delta) in prev_tiles:
- continue
- try:
- adjacent_tiles += grid[j + j_delta][i + i_delta]
- prev_tiles.append((j + j_delta, i + i_delta))
- except:
- pass
- return adjacent_tiles
- @timer
- def process_v1(data, too_many_rolls=4, tile_tracking=False):
- tiles = {"empty": ".", "roll": "@"}
- grid = [list(lane) for lane in data]
- reachable_rolls, reachable_tiles = 0, []
- tiles_per_lane, total_lanes = len(grid[0]), len(grid)
- for i in range(tiles_per_lane):
- for j in range(total_lanes):
- if grid[j][i] == tiles["empty"]:
- continue
- adjacent_tiles = get_adjacent_tiles(grid, j, i)
- if adjacent_tiles.count(tiles["roll"]) < too_many_rolls:
- reachable_rolls += 1
- reachable_tiles.append((j, i))
- if tile_tracking:
- return reachable_rolls, reachable_tiles
- else:
- return reachable_rolls
- @timer
- def process_v2(data):
- tiles = {"empty": ".", "roll": "@"}
- done = False
- reachable_rolls = 0
- grid = [list(lane) for lane in data]
- while not done:
- new_reachable_rolls, new_reachable_tiles = process_v1(grid, tile_tracking=True)
- reachable_rolls += new_reachable_rolls
- for tile in new_reachable_tiles:
- grid[tile[0]][tile[1]] = tiles["empty"]
- if new_reachable_rolls == 0:
- done = True
- return reachable_rolls
Advertisement
Add Comment
Please, Sign In to add comment