type Alley = " "; type MazeItem = "🎄" | "🎅" | Alley; type DELICIOUS_COOKIES = "🍪"; type MazeMatrix = MazeItem[][]; type Directions = "up" | "down" | "left" | "right"; type BuildTuple = T['length'] extends L ? T : BuildTuple; type Increment = [...BuildTuple, 1]['length']; type Decrement = BuildTuple extends [infer _, ...infer Rest] ? Rest['length'] : never; type FindSantaColumn< Input extends MazeItem[], Column extends number[] = [] > = Input extends [infer El, ...infer Rest extends MazeItem[]] ? El extends '🎅' ? Column['length'] : FindSantaColumn : never; type FindSanta< Input extends MazeMatrix, Row extends number[] = [], > = Input extends [infer El extends MazeItem[], ...infer Rest extends MazeMatrix] ? '🎅' extends El[number] ? [Row['length'], FindSantaColumn] : FindSanta : never; type RowLimit = Input['length']; type ColumnLimit = Input extends [infer El extends MazeItem[], ...infer _] ? El['length'] : never; type Escape = Input extends [infer El extends MazeItem[], ...infer Rest extends MazeMatrix] ? [BuildTuple, ...Escape] : []; type RemoveSantaFromRow = Input extends [infer El, ...infer Rest extends MazeItem[]] ? El extends '🎅' ? [Alley, ...RemoveSantaFromRow] : [El, ...RemoveSantaFromRow] : []; type RemoveSanta = Input extends [infer El extends MazeItem[], ...infer Rest extends MazeMatrix] ? [RemoveSantaFromRow, ...RemoveSanta] : []; type FillSantaToColumn< Input extends MazeItem[], Column extends number, Itr extends number[] = [], > = Input extends [infer El, ...infer Rest extends MazeItem[]] ? Itr['length'] extends Column ? ['🎅', ...FillSantaToColumn] : [El, ...FillSantaToColumn] : []; type FillSanta< Input extends MazeMatrix, Row extends number, Column extends number, Itr extends number[] = [], > = Input extends [infer El extends MazeItem[], ...infer Rest extends MazeMatrix] ? Itr['length'] extends Row ? [FillSantaToColumn, ...FillSanta] : [El, ...FillSanta] : []; type MoveUp = FindSanta[0] extends 0 ? Escape : Input[Decrement[0]>][FindSanta[1]] extends Alley ? FillSanta, Decrement[0]>, FindSanta[1]> : Input; type MoveLeft = FindSanta[1] extends 0 ? Escape : Input[FindSanta[0]][Decrement[1]>] extends Alley ? FillSanta, FindSanta[0], Decrement[1]>> : Input; type MoveRight = FindSanta[1] extends Decrement> ? Escape : Increment[1]> extends number ? Input[FindSanta[0]][Increment[1]>] extends Alley ? FillSanta, FindSanta[0], Increment[1]>> : Input : never; type MoveDown = FindSanta[0] extends Decrement> ? Escape : Increment[0]> extends number ? Input[Increment[0]>][FindSanta[1]] extends Alley ? FillSanta, Increment[0]>, FindSanta[1]> : Input : never; type Move = Direction extends 'up' ? MoveUp : Direction extends 'left' ? MoveLeft : Direction extends 'right' ? MoveRight : Direction extends 'down' ? MoveDown : Input;