Skip to content

Instantly share code, notes, and snippets.

@ldd
Created July 31, 2019 22:41
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 ldd/b4bab9f246798bb8a2f4bd514c9d69ec to your computer and use it in GitHub Desktop.
Save ldd/b4bab9f246798bb8a2f4bd514c9d69ec to your computer and use it in GitHub Desktop.
Chess checker
function encode(p, p2) {
let t = 0;
t = (t << 6) | p;
t = (t << 6) | p2;
return t;
}
function decode(s) {
return [s & (2 ** 6 - 1), s >> 6];
}
function check(s) {
let k = -1,
q,
t,
r,
n;
for (let i = 0; i < 64; i++) {
if (s[i] === "K") k = i;
if (s[i] === "Q") q = i;
if (s[i] === "T") t = ((t || 0) << 6) | i;
if (s[i] === "R") r = ((r || 0) << 6) | i;
if (s[i] === "N") n = ((n || 0) << 6) | i;
}
function checkLine(piece) {
let low, high;
if (k % 8 === piece % 8) {
[low, high] = [Math.min(k, piece), Math.max(k, piece)];
isInCheck = true;
for (let i = low + 8; i < high - 8; i += 8) {
isInCheck = isInCheck && s[i] && s[i] === ".";
if (!isInCheck) return false;
}
return true;
}
if (Math.floor(k / 8) === Math.floor(piece / 8)) {
isInCheck = true;
for (let i = low; i < high; i++) {
isInCheck = isInCheck && s[i] && s[i] === ".";
if (!isInCheck) return false;
}
return true;
}
return false;
}
function checkDiagonal(piece) {
let low, high;
if (Math.abs(k - piece) % 9 === 0) {
[low, high] = [Math.min(k, piece), Math.max(k, piece)];
isInCheck = true;
for (let i = low + 9; i < high - 9; i += 9) {
isInCheck = isInCheck && s[i] && s[i] === ".";
if (!isInCheck) return false;
}
return true;
}
if (Math.abs(k - piece) % 7 === 0) {
isInCheck = true;
for (let i = low + 7; i < high - 7; i += 7) {
isInCheck = isInCheck && s[i] && s[i] === ".";
if (!isInCheck) return false;
}
return true;
}
return false;
}
//check for valid queen, tower and rook
if (checkLine(q) || checkDiagonal(q)) return true;
if (t !== undefined) {
let tower = t >> 6;
if (checkLine(tower)) return true;
tower = t & (2 ** 6 - 1);
if (checkLine(tower)) return true;
}
if (r !== undefined) {
let rook = r >> 6;
if (checkDiagonal(rook)) return true;
rook = r & (2 ** 6 - 1);
if (checkDiagonal(rook)) return true;
}
// check knights
if (n !== undefined) {
let knight = n >> 6;
let diff = Math.abs(k - knight);
if (diff === 10 || diff === 6 || diff === 15 || diff === 17) return true;
knight = n & (2 ** 6 - 1);
diff = Math.abs(k - knight);
if (diff === 10 || diff === 6 || diff === 15 || diff === 17) return true;
}
// check pawns
if (s[k + 7] === "P" || s[k + 9] === "P") return true;
return false;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment