from output import DD, ints def solve(data): p12 = [] for sl in [2, 10]: seen = set([(0, 0)]) snake = [(0, 0)] * sl for line in data.splitlines(): d = line[0] for i in range(ints(line)[0]): ns = [] hd, *tls = snake r, c = hd hd = r + DD[d][0], c + DD[d][1] ns.append(hd) for tl in tls: r, c = tl match (r - hd[0], c - hd[1]): case (2, -1): tl = r - 1, c + 1 case (-2, -1): tl = r + 1, c + 1 case (-2, 1): tl = r + 1, c - 1 case (2, 1): tl = r - 1, c - 1 case (1, 2): tl = r - 1, c - 1 case (-1, 2): tl = r + 1, c - 1 case (-1, -2): tl = r + 1, c + 1 case (1, -2): tl = r - 1, c + 1 case (0, 2): tl = r, c - 1 case (0, -2): tl = r, c + 1 case (2, 0): tl = r - 1, c case (-2, 0): tl = r + 1, c case (2, -2): tl = r - 1, c + 1 case (-2, -2): tl = r + 1, c + 1 case (-2, 2): tl = r + 1, c - 1 case (2, 2): tl = r - 1, c - 1 ns.append(tl) hd = tl snake = ns seen.add(tl) p12.append(len(seen)) p1, p2 = p12 return p1, p2 if __name__ == "__main__": with open("./input/09.txt", "r") as f: inp = f.read().strip() p1, p2 = solve(inp) print(p1) print(p2) assert p1 == 6212 assert p2 == 2522