function generateRegex(guess, feedback) {
let regexParts = Array(guess.length).fill('.');
let mustHave = {};
let excludes = new Set();
for (let i = 0; i < guess.length; i++) {
if (feedback[i] === '2') {
regexParts[i] = guess[i];
} else if (feedback[i] === '1') {
regexParts[i] = `[^${guess[i]}]`;
mustHave[guess[i]] = (mustHave[guess[i]] || 0) + 1;
} else if (feedback[i] === '0') {
excludes.add(guess[i]);
}
}
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 + ']';
}
}
});
let regex = regexParts.join('');
Object.keys(mustHave).forEach(letter => {
let count = mustHave[letter];
regex = `(?=([^${letter}]*${letter}){${count},})` + regex;
});
return new RegExp('^' + regex + '$');
}