from part1 import parseInput, update_grid import numpy as np def syncronized_step(grid): i = 1 while True: grid = update_grid(grid) if np.all(grid == 0): return i i += 1 if __name__ == '__main__': grid = parseInput("input.txt") print(syncronized_step(grid))
from part1 import parseInput, pair_insertions if __name__ == '__main__': template, rules = parseInput("input.txt") print(pair_insertions(template, rules, steps=40))
from part1 import parseInput, simulate if __name__ == "__main__": initial_states = parseInput("input.txt") print(simulate(initial_states, 256))
def find_basin_lengths(heightmap): basin_lengths = [] rows, cols = heightmap.shape for i in range(rows): for j in range(cols): neighbors = [] point = heightmap[i, j] # up if i - 1 >= 0: neighbors.append(heightmap[i - 1, j]) # down if i + 1 <= rows - 1: neighbors.append(heightmap[i + 1, j]) # left if j - 1 >= 0: neighbors.append(heightmap[i, j - 1]) # right if j + 1 <= cols - 1: neighbors.append(heightmap[i, j + 1]) if all([point < n for n in neighbors]): basin_lengths.append(len(find_basin((i, j), heightmap))) return basin_lengths if __name__ == '__main__': heightmap = parseInput('input.txt') basin = find_basin_lengths(heightmap) basin.sort(reverse=True) print(prod(basin[:3]))
from part1 import parseInput def lowest_fuel(positions): best = float("inf") for median in range(min(positions), max(positions)): cost = 0 for pos in positions: n = abs(median - pos) cost += n * (n + 1) / 2 if cost <= best: best = cost return best if __name__ == "__main__": positions = parseInput("input.txt") print(lowest_fuel(positions))
from part1 import BingoBoard, parseInput def last_winner(numbers, bingo_boards): winners = [] combos = [] for num in numbers: for index, board in enumerate(bingo_boards): board.draw(num) if board.is_winner() and index not in winners: winners.append(index) combos.append(num * board.score()) return combos[-1] if __name__ == "__main__": numbers, bingo_boards = parseInput("input.txt") print(last_winner(numbers, bingo_boards))
from part1 import parseInput def distinct_paths(map, vertex, visited, complete, revisited_cave): for neighbor in map[vertex]: if neighbor == "end": complete.append(1) continue if neighbor.islower(): if neighbor in visited: if revisited_cave != "": continue revisited_cave = neighbor else: visited.add(neighbor) distinct_paths(map, neighbor, visited, complete, revisited_cave) if neighbor.islower(): if revisited_cave == neighbor: revisited_cave = "" else: visited.discard(neighbor) return sum(complete) if __name__ == "__main__": map = parseInput("input.txt") print(distinct_paths(map, "start", set(), list(), ''))