Skip to content

Instantly share code, notes, and snippets.

@fadi-george
Created December 24, 2023 09:01
Show Gist options
  • Save fadi-george/cf1cc94f080ddfde4abe6dcdb9a6a9f3 to your computer and use it in GitHub Desktop.
Save fadi-george/cf1cc94f080ddfde4abe6dcdb9a6a9f3 to your computer and use it in GitHub Desktop.
Advent of Typescript 2023
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