UNPKG

scrabble-solver

Version:

Scrabble Solver 2 - Free, open-source, cross-platform, multi-language analysis tool for Scrabble, Scrabble Duel, Super Scrabble, Letter League, Literaki, and Kelimelik. Quickly find the top-scoring words using the given board and tiles.

47 lines (40 loc) 1.49 kB
import { BLANK } from '@scrabble-solver/constants'; import { type Board, type Config } from '@scrabble-solver/types'; import { createKeyComparator } from 'lib'; import { type RemainingTile } from 'types'; export const getRemainingTiles = ( config: Config, board: Board, characters: string[], locale: string, ): RemainingTile[] => { const nonEmptyCells = board.rows.flat().filter((cell) => !cell.isEmpty); const letterCells = nonEmptyCells.filter((cell) => !cell.tile.isBlank); const remainingTiles = Object.fromEntries(config.tiles.map((tile) => [tile.character, { ...tile, usedCount: 0 }])); const blank: RemainingTile = { character: BLANK, count: config.blanksCount, score: config.blankScore, usedCount: nonEmptyCells.filter((cell) => cell.tile.isBlank).length + characters.filter((character) => character === BLANK).length, }; const letters = [ ...letterCells.map((cell) => cell.tile.character), ...characters.filter((letter) => letter !== BLANK), ]; const unknownLetters = letters.filter((letter) => typeof remainingTiles[letter] === 'undefined'); for (const letter of unknownLetters) { remainingTiles[letter] = { character: letter, count: 0, score: 0, usedCount: 0, }; } for (const letter of letters) { ++remainingTiles[letter].usedCount; } const comparator = createKeyComparator('character', locale); return [...Object.values(remainingTiles).sort(comparator), blank]; };