2017-12-22 - Sporifica Virus
(original .ipynb)puzzle_input_str = open("puzzle_input/day22.txt").read() test_input_str = """..# #.. ...""" clean = "." infected = "#" def parse_input(input_str): return [list(line) for line in input_str.split("\n")] def left(dr, dc): return (-dc, dr) def right(dr, dc): return (dc, -dr) def maybe_grow(grid, r, c): if r < 0: grid.insert(0, [clean] * len(grid[0])) r += 1 if r >= len(grid): grid.append([clean] * len(grid[0])) if c < 0: for i in range(len(grid)): grid[i].insert(0, clean) c += 1 if c >= len(grid[0]): for i in range(len(grid)): grid[i].append(clean) return r, c def solve(input_str, bursts, next_state, next_direction): grid = parse_input(input_str) centre = len(grid) // 2 r, c = centre, centre dr, dc = (-1, 0) infections_caused = 0 while bursts > 0: node_state = grid[r][c] dr, dc = next_direction[node_state](dr, dc) next_node_state = next_state[node_state] if next_node_state == infected: infections_caused += 1 grid[r][c] = next_node_state r, c = r+dr, c+dc r, c = maybe_grow(grid, r, c) bursts -= 1 return infections_caused def part_one(input_str, bursts): next_state = { clean: infected, infected: clean } next_direction = { clean: left, infected: right } return solve(input_str, bursts, next_state, next_direction) assert 5 == part_one(test_input_str, 7) assert 41 == part_one(test_input_str, 70) assert 5587 == part_one(test_input_str, 10000) print("part one:", part_one(puzzle_input_str, 10000))
part one: 5280
weakened = "W" flagged = "F" def reverse(dr, dc): return (-dr, -dc) def same_direction(dr, dc): return (dr, dc) def part_two(input_str, bursts): next_state = { clean: weakened, weakened: infected, infected: flagged, flagged: clean } next_direction = { clean: left, weakened: same_direction, infected: right, flagged: reverse } return solve(input_str, bursts, next_state, next_direction) assert 26 == part_two(test_input_str, 100) assert 2511944 == part_two(test_input_str, 10_000_000) print("part two:", part_two(puzzle_input_str, 10_000_000))
part two: 2512261