export const formatGridForDisplay = (grid) => { if (!grid || !Array.isArray(grid)) return []; return grid.map(row => row.map(cell => cell === '.' ? '.' : cell.toUpperCase()) ); }; export const validateUserInput = (input) => { return /^[A-Za-z]?$/.test(input); }; export const checkPuzzleCompletion = (grid, userAnswers) => { if (!grid || !userAnswers) return false; for (let row = 0; row < grid.length; row++) { for (let col = 0; col < grid[row].length; col++) { if (grid[row][col] !== '.') { const key = `${row}-${col}`; if (!userAnswers[key] || userAnswers[key] !== grid[row][col]) { return false; } } } } return true; }; export const getWordPositions = (grid, clues) => { const positions = {}; clues.forEach(clue => { positions[`${clue.number}-${clue.direction}`] = { start: clue.position, length: clue.word.length, direction: clue.direction }; }); return positions; }; export const highlightWord = (wordPositions, selectedClue) => { if (!selectedClue || !wordPositions[selectedClue]) return []; const { start, length, direction } = wordPositions[selectedClue]; const cells = []; for (let i = 0; i < length; i++) { if (direction === 'across') { cells.push(`${start.row}-${start.col + i}`); } else { cells.push(`${start.row + i}-${start.col}`); } } return cells; };