H = (0,0) T = (0,0) def go(p, dir): x,y = p if dir == "U": y += 1 if dir == "D": y -= 1 if dir == "L": x -= 1 if dir == "R": x += 1 return x,y def follow(): if H == T: return T if abs(H[0] - T[0]) <= 1 and abs(H[1] - T[1]) <= 1: return T if H[1] == T[1]: x,y = T x = H[0] - sgn(H[0] - T[0]) return x,y if H[0] == T[0]: x,y = T y = H[1] - sgn(H[1]-T[1]) return x,y # diagonal x,y = T x += sgn(H[0] - T[0]) y += sgn(H[1] - T[1]) return x,y def follow2(h, t): if h == t: return t if abs(h[0] - t[0]) <= 1 and abs(h[1] - t[1]) <= 1: return t if h[1] == t[1]: x,y = t x = h[0] - sgn(h[0] - t[0]) return x,y if h[0] == t[0]: x,y = t y = h[1] - sgn(h[1]-t[1]) return x,y # diagonal x,y = t x += sgn(h[0] - t[0]) y += sgn(h[1] - t[1]) return x,y def sgn(x): if x==0: return 0 if x > 0: return 1 return -1 visited = set([T]) for line in open("input"): dir, count = line.split() count = int(count) for _ in range(count): H = go(H, dir) T = follow() visited.add(T) #print(H,T) print(len(visited)) R = [(0,0)]*10 visited = set([R[-1]]) for line in open("input"): dir, count = line.split() count = int(count) for _ in range(count): R[0] = go(R[0], dir) for i in range(1,len(R)): t = follow2(R[i-1], R[i]) if t == R[i]: break R[i] = t visited.add(R[-1]) print(R) print(len(visited))