Public
Edited
Nov 21, 2024
1 fork
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
mutable filteredWords = smallerSet.slice();
Insert cell

function generateRegex(guess, feedback) {
let regexParts = Array(guess.length).fill('.'); // Start with '.' for any character
let mustHave = {}; // Track letters that must appear elsewhere in the word
let excludes = new Set(); // Track letters that must not appear at all

// Construct the regex pattern based on the feedback
for (let i = 0; i < guess.length; i++) {
if (feedback[i] === '2') {
// Letter is correct and in the right position
regexParts[i] = guess[i];
} else if (feedback[i] === '1') {
// Letter is in the word but in the wrong position
regexParts[i] = `[^${guess[i]}]`; // Ensure it's not in this position
mustHave[guess[i]] = (mustHave[guess[i]] || 0) + 1; // Increment the count needed elsewhere
} else if (feedback[i] === '0') {
// Letter is not in the word
excludes.add(guess[i]);
}
}

// Exclude letters entirely from the word that are marked with '0'
excludes.forEach(letter => {
for (let j = 0; j < regexParts.length; j++) {
if (regexParts[j] === '.') {
regexParts[j] = `[^${letter}]`;
} else if (regexParts[j].includes('[')) {
regexParts[j] = regexParts[j].slice(0, -1) + letter + ']';
}
}
});

// Add lookaheads for letters that must be included but in other positions
let regex = regexParts.join('');
Object.keys(mustHave).forEach(letter => {
let count = mustHave[letter];
regex = `(?=([^${letter}]*${letter}){${count},})` + regex;
});

return new RegExp('^' + regex + '$');
}
Insert cell
letterCounts = filteredWords.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

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