Created
December 24, 2023 09:12
-
-
Save vlastachu/af9943b9d59d9d14215292ec45cca7e5 to your computer and use it in GitHub Desktop.
aot-23
This file contains 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 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