我将如何替换所有“?”在带有随机字母的短语中,但使用的字母不能连续重复两次?

How would I replace all '?' in the phrase with a random letter but the letter used cannot repeat twice in a row?

例如,假设您有字符串 'ab?d?f',您必须获取该字符串并将其替换为“?”中的任意随机字母。像 'abcdef' 或 'abjdlf' 但不能是 'abbdef' 或 'abcdff'.

我在下面尝试过:

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;
}

另外,因为你更新了returnsolvedRiddle。您原来的 riddle 字符串没有更新,因此在第二个 运行 中,它仍在更改第一个 ?

我修改了你的代码,使其符合需要,但可能有一些错误或异常尚未处理,但它可以给你一个提示,说明你将如何解决问题。

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>