Public
Edited
Nov 19, 2024
Insert cell
Insert cell
Insert cell
Insert cell
cleanedWordlist = wordlistwordle.split('\r\n')
Insert cell
smallerSet = cleanedWordlist .filter (w => w.length==5) // Wordle allows only words with 5 letters
Insert cell
viewof select = Inputs.select(smallerSet, {label: "Select a word"})
Insert cell
letterCounts = smallerSet.join('')
.split('')
.reduce((acc, letter) => {
acc[letter] = (acc[letter] || 0) + 1;
return acc;
}, {})
Insert cell
// Count only letters and create sorted data
letterData = Object.entries(letterCounts)
.filter(([char]) => /[a-z]/i.test(char)) // Only keep letters
.map(([letter, count]) => ({letter, count}))
.sort((a, b) => b.count - a.count) // Sort by frequency descending
Insert cell
Insert cell
Insert cell
filteredWords = {
// Initialize if no input yet
if (!wordleInput || !wordleInput.querySelector) return smallerSet;
// Get the current guess and results
const letters = Array.from(wordleInput.querySelectorAll('.letter-input'))
.map(input => input.value.toLowerCase());
const results = Array.from(wordleInput.querySelectorAll('.result-select'))
.map(select => parseInt(select.value));
if (letters.some(l => !l)) return smallerSet;
// Process the feedback
let correctPositions = {};
let presentLetters = new Set();
let absentLetters = new Set();
let wrongPositions = {};
letters.forEach((letter, i) => {
if (results[i] === 2) {
correctPositions[i] = letter;
} else if (results[i] === 1) {
presentLetters.add(letter);
if (!wrongPositions[letter]) wrongPositions[letter] = new Set();
wrongPositions[letter].add(i);
} else {
if (!presentLetters.has(letter) &&
!Object.values(correctPositions).includes(letter)) {
absentLetters.add(letter);
}
}
});
// Filter words based on all conditions
return smallerSet.filter(word => {
// Check correct positions
for (let [pos, letter] of Object.entries(correctPositions)) {
if (word[pos] !== letter) return false;
}
// Check present letters
for (let letter of presentLetters) {
if (!word.includes(letter)) return false;
if (wrongPositions[letter]) {
for (let pos of wrongPositions[letter]) {
if (word[pos] === letter) return false;
}
}
}
// Check absent letters
for (let letter of absentLetters) {
if (word.includes(letter)) return false;
}
return true;
});
}

Insert cell
html`<div>
<h3>Remaining possible words: ${filteredWords.length}</h3>
<div style="max-height: 200px; overflow-y: auto;">
${filteredWords.join(', ')}
</div>
</div>`
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more