seen = set() head = (0,0) tail = (0,0) direction = { "R": (1, 0), "L": (-1, 0), "U": (0, 1), "D": (0, -1) } def moveTail(): global tail print(f"Calcing move for tail {tail} towards {head}") if tail[0] == head[0] and abs(tail[1] - head[1]) > 1: # Vertical move tail = (tail[0], int((tail[1] + head[1]) / 2)) elif tail[1] == head[1] and abs(tail[0] - head[0]) > 1: tail = (int((tail[0] + head[0]) / 2), tail[1]) elif abs(tail[0] - head[0]) <= 1 and abs(tail[1] - head[1]) <= 1: # Touching diagonal, no action required pass else: # Non-touching diagonal, step required dir = (min(1, max(-1, head[0] - tail[0])), min(1, max(-1, head[1] - tail[1]))) print(f"Moving in {dir}") tail = (tail[0] + dir[0], tail[1] + dir[1]) print(tail) with open("input.txt", "r") as f: for line in f.readlines(): line = line.strip() [dir, steps] = line.split(" ") for _ in range(int(steps)): head = (head[0] + direction[dir][0], head[1] + direction[dir][1]) print(dir, head) seen.add(tail) moveTail() seen.add(tail) print(seen) print(len(seen))