Skip to content

Instantly share code, notes, and snippets.

@azamanaza
Created November 12, 2019 10:33
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 azamanaza/bac1f3fefae384f0d41fcd2520262240 to your computer and use it in GitHub Desktop.
Save azamanaza/bac1f3fefae384f0d41fcd2520262240 to your computer and use it in GitHub Desktop.
Script to check for valid boggle game guesses
const checkWord = (board, word) => {
const boardMap = boardToMap(board);
const startPoints = Array.from(boardMap.values());
if (!startPoints) {
return false;
}
return checkNodes(boardMap, startPoints, [], [], word.split(''), 0);
};
const boardToMap = board => {
const boardMap = new Map();
for (let y = 0; y < board.length; y++) {
for (let x = 0; x < board[y].length; x++) {
const coord = { y, x };
boardMap.set(JSON.stringify(coord), {
coord,
letter: board[y][x],
children: getAdjacentNodes(board, coord)
});
}
}
return boardMap;
};
const getAdjacentNodes = (board, srcCoord) => {
const checks = [[-1, -1], [-1, 0], [-1, 1],
[0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
];
const adjacentNodes = [];
checks.forEach(adjCoord => {
const coord = {
y: srcCoord.y + adjCoord[0],
x: srcCoord.x + adjCoord[1]
};
if (board[coord.y] && board[coord.x]) {
adjacentNodes.push(JSON.stringify(coord));
}
});
return adjacentNodes;
};
const checkNodes = (boardMap, nodes, checked = [], checkedNodes = [], wordArr, index) => {
if (checked.join('') === wordArr.join('')) {
return true;
}
const validNodes = nodes.filter(node => node.letter === wordArr[index]);
return !validNodes ? false : validNodes.some(node => {
const currentKey = JSON.stringify(node.coord);
return checkedNodes.indexOf(currentKey) === -1 &&
checkNodes(boardMap, node.children.map(key => boardMap.get(key)),
checked.concat(wordArr[index]), checkedNodes.concat(currentKey), wordArr, index + 1);
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment