以最少的步骤查找混乱的字符序列

时间:2018-08-24 09:44:23

标签: javascript cryptography backtracking

有一个包含所有字母(a-z)的字符串。我必须用最少的步骤来猜测混乱的序列。每次猜测之后,我都会知道我每个角色的位置是否正确。

我正在使用以下方法:

  1. 维护每个字符可以到达的位置的索引列表
  2. 从上方生成一个随机序列并更新每个响应的列表

这是我的代码:

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('');
}

注意:另一个限制是生成的序列不应包含任何重复项。

0 个答案:

没有答案