type Dir = "U" | "D" | "L" | "R" type PipeType = "." | "|" | "7" | "J" | "F" | "L" | "-" | "S"; type MoveState = { fromDir: Dir, curX: number, curY: number, } const transitionTable: Record> = { "U": { "|": "U", "7": "L", "F": "R", ".": null, "J": null, "L": null, "-": null, "S": null }, "D": { "|": "D", "7": null, "F": null, ".": null, "J": "L", "L": "R", "-": null, "S": null }, "L": { "|": null, "7": null, "F": "D", ".": null, "J": null, "L": "U", "-": "L", "S": null, }, "R": { "|": null, "7": "D", "F": null, ".": null, "J": "U", "L": null, "-": "R", "S": null } } function getNextState(pipeMap: PipeType[][], state: MoveState) { const curPipe = pipeMap[state.curY][state.curX]; const nextDir = transitionTable[state.fromDir][curPipe]; if (nextDir === null) { return null; } switch (nextDir) { case "U": state.curY--; break; case "D": state.curY++; break; case "L": state.curX--; break; case "R": state.curX++; break; } state.fromDir = nextDir; return state; } const input = await Deno.readTextFile("input.txt"); const lines = input.split("\n").map(x => x.trim()).filter(x => x.length > 0); const pipeMap = lines.map(x => { return x.split(""); }) as PipeType[][]; let startX = 0, startY = 0; startY = pipeMap.findIndex(pipeLine => { const xIndex = pipeLine.findIndex(x => x === "S") if (xIndex !== -1) { startX = xIndex; return true; } return false; }); console.log(startX, startY); const stepMap: any[][] = new Array(pipeMap.length).fill(Infinity).map(_ => new Array(pipeMap[0].length).fill(Infinity)); function stepMaptoStr(stepMap: number[][]){ return stepMap.map(line => line.map(x=> isFinite(x) ? x : ".").join(",")).join("\n"); } function iterateStep(pipeMap: PipeType[][], state: MoveState, fn: (state: MoveState) => void) { fn({...state}); while (true) { const nextState = getNextState(pipeMap,{...state}); if (nextState === null) { throw new Error("dead end at " + state.curX + "," + state.curY); } if (pipeMap[nextState.curY][nextState.curX] === "S") { return; } fn(nextState); state = nextState; } } const initStates = [ // { // fromDir: "U", // curX: startX, // curY: startY - 1, // }, // { // fromDir: "R", // curX: startX + 1, // curY: startY, // }, { fromDir: "D", curX: startX, curY: startY + 1, }, { fromDir: "L", curX: startX - 1, curY: startY, } ] as MoveState[]; for (const initState of initStates) { // const index = initStates.indexOf(initState); try { let stepCount = 0; iterateStep(pipeMap, {...initState}, (state) => { if (state.curX === startX && state.curY === startY) { console.log("?",stepCount, state); } stepMap[state.curY][state.curX] = Math.min(++stepCount, stepMap[state.curY][state.curX]); }); } catch(e) { console.log("error",initState); } } await Deno.writeTextFile("stepMap.csv",stepMaptoStr(stepMap)); console.log(Math.max(...stepMap.map(line=> Math.max(...line.map(x=> isFinite(x) ? x : -1)))))