index.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { readFileSync, writeFileSync } from 'fs';
  2. import { resolve, dirname } from 'path';
  3. import { fileURLToPath } from 'url';
  4. import type { WordBank, SolverReplay } from '@wordle/shared';
  5. import { solveEntropy } from './entropy.js';
  6. import { solveFrequency } from './frequency.js';
  7. import { solveVowelFirst } from './vowel-first.js';
  8. import { solveGreedy } from './greedy.js';
  9. const __dirname = dirname(fileURLToPath(import.meta.url));
  10. const BANK_PATH = resolve(__dirname, '../../data/word-bank.json');
  11. const MAX_ATTEMPTS = 6;
  12. console.log('Loading word bank...');
  13. const bank: WordBank = JSON.parse(readFileSync(BANK_PATH, 'utf-8'));
  14. const allWords = bank.guessable;
  15. console.log(`Solving ${bank.targets.length} target words with ${allWords.length} guessable words...`);
  16. let solved = 0;
  17. let failed = 0;
  18. const newTargets: WordBank['targets'] = [];
  19. for (const target of bank.targets) {
  20. const results = [
  21. { name: 'Entropy', ...solveEntropy(target.word, allWords, MAX_ATTEMPTS) },
  22. { name: 'Frequency', ...solveFrequency(target.word, allWords, MAX_ATTEMPTS) },
  23. { name: 'Vowel First', ...solveVowelFirst(target.word, allWords, MAX_ATTEMPTS) },
  24. { name: 'Greedy', ...solveGreedy(target.word, allWords, MAX_ATTEMPTS) },
  25. ];
  26. const passResults = results.filter((r) => r.attempts <= MAX_ATTEMPTS);
  27. if (passResults.length === 0) {
  28. console.log(` REMOVED: ${target.word} (unsolvable by any strategy)`);
  29. failed++;
  30. continue;
  31. }
  32. const avgAttempts = passResults.reduce((s, r) => s + r.attempts, 0) / passResults.length;
  33. const difficulty = Math.round(avgAttempts * 100) / 100;
  34. const replays: SolverReplay[] = results
  35. .filter((r) => r.attempts <= MAX_ATTEMPTS)
  36. .map((r) => ({ solver: r.name, steps: r.steps }));
  37. newTargets.push({ ...target, difficulty, replays });
  38. solved++;
  39. if (solved % 10 === 0) console.log(` ${solved}/${bank.targets.length}...`);
  40. }
  41. const newBank: WordBank = { guessable: bank.guessable, targets: newTargets };
  42. writeFileSync(BANK_PATH, JSON.stringify(newBank, null, 2) + '\n', 'utf-8');
  43. console.log(`\nDone! ${solved} solved, ${failed} removed. Replays stored.`);