有一个包含所有字母(a-z)的字符串。我必须用最少的步骤来猜测混乱的序列。每次猜测之后,我都会知道我每个角色的位置是否正确。
我正在使用以下方法:
这是我的代码:
var validIDs = {};
function initialise() {
let indices = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25];
for(let i=0;i<26;i++) {
validIDs[String.fromCharCode(97+i)] = [...indices];
}
}
// response is a bool array[26]
// indicating the matching positions of pattern with the secret jumbled sequence.
function updateIDs(pattern, response) {
let index;
for(let i=0;i<pattern.length;i++) {
if(response[i]) {
validIDs[pattern[i]] = [i];
} else {
index = validIDs[pattern[i]].indexOf(i);
validIDs[pattern[i]].splice(index,1);
}
}
}
我的validIDs
是一个以[a-z]
作为键的对象,并存储了每个字符的可能位置。示例:{ a: [0, 1, 2], b: [3], ...and so on till 'z' }
。目的是加强对该对象的约束,并最终得出秘密模式。
我正在尝试从该对象创建有效的模式而不使用蛮力,并且还希望具有一些随机性。我编写了以下函数,为每个字母取一个随机索引并创建一个序列,但是如果已经获取了一个字母的所有可用索引,则此操作将失败。
function generateNewSequence() {
let sequence = [], result = [];
let rand, index = 0;
for(let letter of Object.keys(validIDs)) {
//Finding a random index for letter which is not already used
rand = Math.floor(Math.random()*validIDs[letter].length);
while(sequence.indexOf(validIDs[letter][rand]) !== -1) rand = Math.floor(Math.random()*validIDs[letter].length);
index = validIDs[letter][rand];
sequence.push(index);
result[index] = letter;
}
return result.join('');
}
注意:另一个限制是生成的序列不应包含任何重复项。