Created
December 24, 2023 09:01
-
-
Save fadi-george/cf1cc94f080ddfde4abe6dcdb9a6a9f3 to your computer and use it in GitHub Desktop.
Advent of Typescript 2023
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
type Santa = "π "; | |
type Alley = " "; | |
type MazeMatrix = MazeItem[][]; | |
type MazeItem = "π" | "π " | " "; | |
type Directions = "up" | "down" | "left" | "right"; | |
type FindSantaCol< | |
T extends MazeItem[], | |
A extends any[] = [], | |
AL extends number = A["length"], | |
> = AL extends T["length"] ? never : T[AL] extends Santa ? AL : FindSantaCol<T, ["", ...A]>; | |
type FindSanta< | |
M extends MazeMatrix, | |
R extends any[] = [], | |
C extends any[] = [], | |
> = Santa extends M[R["length"]][number] | |
? [R["length"], FindSantaCol<M[R["length"]]>] | |
: FindSanta<M, ["", ...R], C>; | |
type GetCol< | |
B extends any[][], | |
C extends number, | |
A extends any[] = [], | |
> = A["length"] extends B["length"] ? A : GetCol<B, C, [...A, B[A["length"]][C]]>; | |
type CheckPathR<R extends MazeItem[], A extends any[] = []> = R extends [ | |
infer F1 extends MazeItem, | |
infer F2 extends MazeItem, | |
...infer R extends MazeItem[], | |
] | |
? [F1, F2] extends [Santa, Alley] | |
? ["", ...A]["length"] | |
: CheckPathR<[F2, ...R], ["", ...A]> | |
: null; | |
type CheckPathL<R extends MazeItem[], A extends any[] = []> = R extends [ | |
infer F1 extends MazeItem, | |
infer F2 extends MazeItem, | |
...infer R extends MazeItem[], | |
] | |
? [F1, F2] extends [Alley, Santa] | |
? A["length"] | |
: CheckPathL<[F2, ...R], ["", ...A]> | |
: null; | |
type CheckDir< | |
R extends MazeItem[], | |
C extends MazeItem[], | |
D extends Directions, | |
RI extends number, | |
CI extends number, | |
> = D extends "left" | |
? [RI, CheckPathL<R>] | |
: D extends "up" | |
? [CheckPathL<C>, CI] | |
: D extends "right" | |
? [RI, CheckPathR<R>] | |
: D extends "down" | |
? [CheckPathR<C>, CI] | |
: null; | |
type FillRow< | |
R extends any[], | |
C extends number, | |
M extends string, | |
A extends any[] = [], | |
I extends number = A["length"], | |
> = I extends R["length"] ? A : FillRow<R, C, M, [...A, I extends C ? M : R[I]]>; | |
type MoveSanta< | |
M extends MazeMatrix, | |
R extends number, | |
C extends number, | |
S extends MazeItem, | |
A extends MazeMatrix = [], | |
> = M extends [infer F extends MazeItem[], ...infer L extends MazeMatrix] | |
? A["length"] extends R | |
? [...A, FillRow<F, C, S>, ...L] | |
: MoveSanta<L, R, C, S, [...A, F]> | |
: never; | |
type CR<L extends number, A extends "πͺ"[] = []> = A["length"] extends L ? A : CR<L, ["πͺ", ...A]>; | |
type MakeCookies<M extends MazeMatrix, A extends "πͺ"[][] = []> = A["length"] extends M["length"] | |
? A | |
: MakeCookies<M, [...A, CR<M[0]["length"]>]>; | |
type Move<M extends MazeMatrix, D extends Directions> = FindSanta<M> extends [ | |
infer R extends number, | |
infer C extends number, | |
] | |
? [R, C] extends [5, 0] | |
? MakeCookies<M> | |
: CheckDir<M[R], GetCol<M, C>, D, R, C> extends [ | |
infer R1 extends number, | |
infer C1 extends number, | |
] | |
? MoveSanta<MoveSanta<M, R, C, " ">, R1, C1, Santa> | |
: M | |
: never; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment