Por ejemplo, supongamos que tiene la cadena 'ab?d?f' y debe tomar la cadena y reemplazarla con letras aleatorias en el '?' como 'abcdef' o 'abjdlf' pero no puede ser 'abbdef' o 'abcdff'.
He intentado esto a continuación:
const letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; const randomLeter = () => letters[Math.floor(Math.random() * 26)]; const riddle = 'ab?d?f'; let pickedLetter; let solvedRiddle; function solve(riddle) { for (let i = 0; i < riddle.length; i++) { if (riddle[i] === '?' && !(riddle[i-1] === randomLeter) && !(riddle[i+1] === randomLeter)){ console.log('Changing to letter'); solvedRiddle = riddle.replace('?', pickedLetter); } pickedLetter = randomLeter(); console.log(i, riddle[i], pickedLetter); } return solvedRiddle; } // The above only returns the first '?' changed but leaves the second one unchanged ... ??? Why can I not change the value of solvedRiddle a second time inside the loop? I can see by my log that it reads at true, but the value won't be re-written. console.log(solve(riddle));function solve(riddle) { for (let i = 0; i < riddle.length; i++) { if (riddle[i] === '?'){ console.log('Changing to letter'); let pickedLetter = randomLeter(); while (riddle[i-1] === pickedLetter || riddle[i+1] === pickedLetter) { pickedLetter = randomLeter(); } riddle = riddle.replace('?', pickedLetter); } } return riddle; } Además, es porque actualizas y devuelves solvedRiddle . Su cadena de riddle original no se actualiza, por lo que en la segunda ejecución, ¿sigue cambiando la primera ?
Modifiqué su código para que se adapte a las necesidades, sin embargo, puede haber algunos errores o excepciones que aún no se han manejado, pero puede darle una pista de cómo va a resolver el problema.
const letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; let randomLeter = (excluded) => { let letter = false; do { letter = letters[Math.floor(Math.random() * 26)]; } while(excluded.includes(letter)); return letter; } let getIndices = (s, t) => { return [...s].flatMap((char, i) => (char === t ? i : [])); }; let Solve = (riddle) => { riddle = [...riddle]; //get the locations of all ? in the string let all = getIndices(riddle, '?'); for(let i = 0; i < all.length; i++) { //exluding characters before and after the ? let excluded = [riddle[all[i] - 1], riddle[all[i] + 1]]; riddle[all[i]] = randomLeter(excluded); } return riddle.join(""); }; let riddle = 'ab?d?f'; document.getElementById('riddle').innerHTML = 'The Riddle ' + riddle; document.getElementById('solution').innerHTML = "Solution " + Solve(riddle); <h2 id="riddle"></h2> <h4 id="solution"></h4>