import sys DIRS = {'E': (1, 0), 'W': (-1, 0), 'N': (0, 1), 'S': (0, -1)} DELTAS = [(1, 0), (-1, 0), (0, 1), (0, -1)] def count_extension(prefix, total_len): GRID = 2 * total_len + 3 OFFSET = total_len + 1 visited = bytearray(GRID * GRID) x = y = OFFSET visited[x * GRID + y] = 1 for c in prefix: dx, dy = DIRS[c] x += dx; y += dy idx = x * GRID + y if visited[idx]: raise ValueError("prefix is not self-avoiding") visited[idx] = 1 remaining = total_len - len(prefix) count = 0 def dfs(x, y, steps_left): nonlocal count if steps_left == 0: count += 1 return for dx, dy in DELTAS: nx, ny = x + dx, y + dy idx = nx * GRID + ny if not visited[idx]: visited[idx] = 1 dfs(nx, ny, steps_left - 1) visited[idx] = 0 sys.setrecursionlimit(10000) dfs(x, y, remaining) return count if __name__ == "__main__": prefix = sys.argv[1] if len(sys.argv) > 1 else "" total_len = int(sys.argv[2]) if len(sys.argv) > 2 else 22 print(count_extension(prefix, total_len))