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