input = [] with open("24.input") as f: for line in f.readlines(): seq = [] i = iter(list(line.strip())) c1 = next(i, None) while c1 != None: if c1 in ['s', 'n']: seq.append(c1 + next(i)) else: seq.append(c1) c1 = next(i, None) input.append(seq) def get_pos(seq): pos = [0, 0] for move in seq: if move == 'w': pos[0] -= 2 elif move == 'e': pos[0] += 2 else: if move[0] == 's': pos[1] += 1 else: pos[1] -= 1 if move[1] == 'w': pos[0] -= 1 else: pos[0] += 1 return tuple(pos) counts = {} for seq in input: pos = get_pos(seq) if pos not in counts: counts[pos] = 0 counts[pos] += 1 print("Answer 1:", len([v for v in counts.values() if v % 2 == 1])) def count_adjacent(map, pos): x, y = pos adjacent = [(-2, 0), (2, 0), (1, 1), (1, -1), (-1, 1), (-1, -1)] return len([1 for (off_x, off_y) in adjacent if map.get((x + off_x, y + off_y), False)]) map = {k: v % 2 == 1 for (k, v) in counts.items()} max_x = max([abs(x) for (x, y) in map.keys()]) + 1 max_y = max([abs(y) for (x, y) in map.keys()]) + 1 for i in range(0, 100): next_map = {} for x in range(-max_x, max_x + 1): for y in range(-max_y, max_y + 1): if (x + y) % 2 == 1: continue count = count_adjacent(map, (x, y)) if map.get((x, y), False) == True: next_map[(x, y)] = count in [1, 2] else: next_map[(x, y)] = count == 2 map = next_map max_y += 1 max_x += 2 #print("Day {}: {}".format(i + 1, sum([1 for v in map.values() if v]))) print("Answer 2:", sum([1 for v in map.values() if v]))