Skip to content

Instantly share code, notes, and snippets.

@vlastachu
Created December 24, 2023 09:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vlastachu/af9943b9d59d9d14215292ec45cca7e5 to your computer and use it in GitHub Desktop.
Save vlastachu/af9943b9d59d9d14215292ec45cca7e5 to your computer and use it in GitHub Desktop.
aot-23
type Connect4Chips = 'πŸ”΄' | '🟑';
type Connect4Cell = Connect4Chips | ' ';
type Connect4State = 'πŸ”΄' | '🟑' | 'πŸ”΄ Won' | '🟑 Won' | 'Draw';
type EmptyBoard = [
[" ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " "],
];
type NewGame = {
board: EmptyBoard;
state: "🟑";
};
// type Move =
type swap<chip> = chip extends 'πŸ”΄' ? '🟑' : 'πŸ”΄'
type As<From, To> = From extends To ? From : never
type Inc<i extends any[]> = [0, ...i]
type Len<i extends any[]> = i['length']
type itoa<i extends number, acc extends any[] = []> = i extends Len<acc> ? acc : itoa<i, Inc<acc>>
type getColumn<table extends any[][], ix extends any[], iy extends any[] = [], result extends any[] = []> =
table[iy['length']] extends undefined ? result
: getColumn<table, ix, Inc<iy>, [...result, table[iy['length']][ix['length']]]>
type transpose<table extends any[][], i extends any[] = [], result extends any[][] = []> =
table[0][i['length']] extends undefined ? result :
transpose<table, Inc<i>, [...result, getColumn<table, i>]>
type transposeTest = transpose<[
[' ', 2, 3],
[4, 5, 6],
[7, 8 , 9]
]>
type testBoard = [
[" ", " ", " ", " ", " ", " ", "🟑"],
[" ", " ", " ", " ", " ", "🟑", "🟑"],
[" ", " ", " ", " ", " ", " ", " "],
["🟑", " ", " ", " ", " ", " ", " "],
["πŸ”΄", " ", " ", " ", " ", " ", " "],
["🟑", "πŸ”΄", " ", " ", " ", " ", " "],
];
// type ss = addChip<testBoard, 'πŸ”΄', 0>
// type addChip<list extends any[][], chip, n extends number, i extends any[] = []> =
// i['length'] extends list['length'] ? [] :
// i['length'] extends n
// ? [addChipToColumn<list[i['length']], chip>, ...addChip<list, chip, n, Inc<i>>]
// : [list[i['length']], ...addChip<list, chip, n, Inc<i>>]
// type addChipToColumn<list extends any[], chip> =
// list extends [infer head, ...infer rest]
// ? rest extends [Connect4Chips, ...any]
// ? [chip, ...rest]
// : [head, ...addChipToColumn<rest, chip>]
// : never
// type addCell<table extends any[][], cell, column extends number> =
// transpose<addChip<transpose<table>, cell, column>>
// type addCell_Test = addCell<[
// [1, 2, 3],
// [4, 5, 6],
// [7, 8 , 9]
// ], 'f', 1>
type SetAt<list extends any[], item, i extends any[], acc extends any[] = []> =
list extends [infer head, ...infer rest]
? acc extends i
? [item, ...rest]
: [head, ...SetAt<rest, item, i, Inc<acc>>]
: never
type testSetAt = SetAt<[1, 2, 3, 4], 'f', itoa<2>>
type SetAtTable<list extends any[][], item, x extends any[], y extends any[]> =
SetAt<list, SetAt<list[Len<y>], item, x>, y>
type testSetAtTable = SetAtTable<
[[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]
], 'f', itoa<0>, itoa<2>>
type addChip<table extends any[][], chip, x extends any[], y extends any[] = []> =
Len<Inc<y>> extends Len<table>
? SetAtTable<table, chip, x, y>
: table[Len<Inc<y>>][Len<x>] extends Connect4Chips
? SetAtTable<table, chip, x, y>
: addChip<table, chip, x, Inc<y>>
type testBoard2 = [
[" ", " ", " "],
["πŸ”΄", " ", " "],
["🟑", "πŸ”΄", " "]
];
type testAddChip = addChip<testBoard2, "🟑", [0,0]>
type Game = {board: any[][], state: string}
// type Connect4<game extends Game, column extends number> = {
// board: addChip<game['board'], game['state'], itoa<column>>,
// state: swap<game['state']>
// };
type checkWonLine<line extends any> =
line extends ['🟑', '🟑', '🟑', '🟑', ...any] ? '🟑' :
line extends ['πŸ”΄', 'πŸ”΄', 'πŸ”΄', 'πŸ”΄', ...any] ? 'πŸ”΄' :
line extends [any, ...infer rest]
? Len<rest> extends 3 ? never : checkWonLine<rest>
: never
type testcheck = checkWonLine<[2, 'πŸ”΄', 'πŸ”΄', 'πŸ”΄', 'πŸ”΄']>
type checkDraw<table extends any[][]> = Connect4Chips extends table[number][number] ? true : false
type checkLines_<line extends any[]> = line extends any ? checkWonLine<line> : never
type checkVertical<Table> = checkLines<As<Table, any[][]>[keyof Table]>
type checkLines<table extends any[][]> = checkLines_<table[number]> | checkVertical<transpose<table>>
// type testCheckLines = checkLines<[
// [' ', ' ', ' ', ' ', ' ', ' ', ' '],
// [' ', ' ', ' ', ' ', ' ', ' ', ' '],
// ['🟑', ' ', ' ', ' ', ' ', ' ', ' '],
// ['🟑', ' ', ' ', ' ', ' ', ' ', ' '],
// ['πŸ”΄', 'πŸ”΄', 'πŸ”΄', 'πŸ”΄', ' ', ' ', ' '],
// ['🟑', 'πŸ”΄', '🟑', '🟑', ' ', ' ', ' ']
// ]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment