2015-12-06 - Probably a Fire Hazard
(original .ipynb)
Puzzle input is a sequence of instructions which control sections of a grid of light. In part one we interpret the instructions as simply switching the lights between on or off states, and finding how many are still on after all the instructions are applied. In part two we interpret them as controlling brightness levels of individual lights, and finding the sum of each light's brightness levels.
puzzle_input_str = open("./puzzle_input/day6.txt").read()
toggle = lambda state: not state
turn_on = lambda state: True
turn_off = lambda state: False
def parse_range(tokens):
start_x_str, start_y_str = tokens[0].split(",")
end_x_str, end_y_str = tokens[2].split(",")
return (int(start_x_str), int(start_y_str), int(end_x_str), int(end_y_str))
def parse_instructions(tokens):
if tokens[1] == "on":
return turn_on, parse_range(tokens[2:])
if tokens[1] == "off":
return turn_off, parse_range(tokens[2:])
return toggle, parse_range(tokens[1:])
def apply_instruction(grid, instruction):
action, ranges = instruction
start_x, start_y, end_x, end_y = ranges
x = start_x
while x <= end_x:
y = start_y
while y <= end_y:
grid[x][y] = action(grid[x][y])
y += 1
x += 1
def init_grid():
for _ in range(1000):
yield [False] * 1000
def part_one(input_str):
grid = list(init_grid())
instructions = [parse_instructions(line.split(" ")) for line in input_str.split("\n")]
for instruction in instructions:
apply_instruction(grid, instruction)
count = 0
for row in grid:
count += sum(int(c) for c in row)
return count
print("part one:", part_one(puzzle_input_str))
part one: 569999
toggle = lambda brightness: brightness + 2
turn_on = lambda brightness: brightness + 1
turn_off = lambda brightness: brightness - 1 if brightness > 0 else 0
def init_grid():
for _ in range(1000):
yield [0] * 1000
def part_two(input_str):
grid = list(init_grid())
instructions = [parse_instructions(line.split(" ")) for line in input_str.split("\n")]
for instruction in instructions:
apply_instruction(grid, instruction)
count = 0
for row in grid:
count += sum(int(c) for c in row)
return count
print("part two:", part_two(puzzle_input_str))
part two: 17836115