"""Day 11.""" with open("input") as f: CHART = tuple(tuple(x) for x in f.read().rstrip().split("\n")) EMPTY = 'L' OCCUPIED = '#' FLOOR = '.' MIN = 0 MAX = len(CHART[0]) - 1 def clamp(num, minimium, maximium): """Clamp a number in between a range.""" if num <= minimium: return minimium if num >= maximium: return maximium return num def get_neighbours(x, y): """Get neighbour cords for a point.""" pairs = set() for i in range(x - 1, x + 2): for j in range(y - 1, y + 2): pairs.add( ( clamp(i, MIN, MAX), clamp(j, MIN, MAX) ) ) # Remove self pairs.remove((x, y)) return pairs def get_seat(x, y, chart): """so we can call x, then y.""" return CHART[y][x] def iterate_over_chart(chart, p=False): new_map = [] for y, row in enumerate(chart): new_map.append([]) for x, col in enumerate(row): seat = chart[y][x] neighbours = [chart[pair[1]][pair[0]] for pair in get_neighbours(x, y)] occupied_sum = sum(1 if x == OCCUPIED else 0 for x in neighbours) if seat == EMPTY and not any(x == OCCUPIED for x in neighbours): new_map[y].append(OCCUPIED) continue elif seat == OCCUPIED and occupied_sum >= 4: new_map[y].append(EMPTY) continue else: new_map[y].append(seat) if p: print(y, x, seat) print([(pair[1], pair[0]) for pair in get_neighbours(x, y)]) print(neighbours) print(occupied_sum) print() return new_map def print_chart(chart): for y in chart: line = "" for x in y: line += x print(line) def are_equal(chart1, chart2): for idx, _ in enumerate(chart1): if chart1[idx] != chart2[idx]: return False return True def count_occupied(chart): count = 0 for row in chart: for x in row: if x == OCCUPIED: count += 1 return count initial = CHART count = 0 while True: new_chart = iterate_over_chart(initial) if are_equal(new_chart, initial): print(count_occupied(new_chart)) print("done") break else: # print_chart(new_chart) print(count) count += 1 initial = new_chart # while True: # print_chart(CHART) # print() new_chart = iterate_over_chart(CHART) print(are_equal(initial, new_chart)) # print() # # new_chart = print_iterate_over_chart(new_chart) # new_chart = iterate_over_chart(new_chart) # print_chart(new_chart) # print()