例如,假設您有字串“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));
uj5u.com熱心網友回復:
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;
}
另外,這是因為您更新并回傳solvedRiddle。您的原始riddle字串未更新,因此在第二次運行時,它仍在更改第一次?
uj5u.com熱心網友回復:
我修改了您的代碼以使其適合需求,但是可能還有一些錯誤或例外尚未處理,但它可以為您提供如何解決問題的提示。
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>
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/461219.html
標籤:javascript 细绳 for循环 代替
下一篇:用下拉選單過濾VanillaJS
