Как зашифровать предложение в Javascript, сохраняя место в пространстве? - PullRequest
0 голосов
/ 21 октября 2018

I нашел скрипт , который будет перетасовывать строку:

String.prototype.shuffle = function () {
    var a = this.split(""),
        n = a.length;

    for (var i = n - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }
    return a.join("");
}

Используя этот скрипт, следующее слово:

What is the difference in between 'Apache Environment', 'Environment' and 'PHP Variables'?

будет перетасовано с этим словомслучайным образом:

ftewE'eim rasent  VhiEAn'oeded ta ' mb one'ennfva'nbcr?n elcttpnP iaWePh'irH rshv ieinena,

Однако мне интересно, как сохранить исходное местоположение каждого пробела:

ftew E' eim rasentVhiE An 'oededt a'mbone 'ennfva'nbcr? nelcttpnPiaWe Ph' irHr shvieinena,

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Вы также можете просто проверить свою функцию, если a[i] & a[j] - пустые места:

const shuffleMeSoftly = function(str, breaker = ' ') {
  var a = str.split(""),
      n = a.length;

  for (var i = n - 1; i > 0; i--) {
    if (a[i] != breaker) {
      var j = Math.floor(Math.random() * (i + 1));
      if (a[j] != breaker) {
        var tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
      }
    }
  }
  return a.join("");
}

console.log(shuffleMeSoftly('What is the difference in between \'Apache Environment\', \'Environment\' and \'PHP Variables\'?'))
0 голосов
/ 21 октября 2018

Один из вариантов - создать массив случайных символов (без пробелов), а затем вызвать replace в исходной строке с помощью регулярного выражения, которое заменяет непробельные символы на элементы в массиве с соответствующим индексом, увеличиваяиндекс в процессе:

function shuffleArray(array) {
  for (let i = array.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }
  return array;
}

String.prototype.shuffle = function () {
  // pass to shuffleArray an array of all non-whitespace characters:
  const randomChars = shuffleArray([...this.replace(/\s+/g, '')]);
  let index = 0;
  // `\S` matches any non-whitespace character:
  return this.replace(/\S/g, () => randomChars[index++]);
}

console.log(
  `What is the difference in between 'Apache Environment', 'Environment' and 'PHP Variables'?`
  .shuffle()
);

Также обратите внимание, что изменение таких встроенных объектов, как String.prototype, обычно считается довольно плохой практикой и может привести к поломке;если вы не заполняете что-то официально, лучше использовать отдельную функцию:

function shuffleArray(array) {
  for (let i = array.length - 1; i > 0; i--) {
    let j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }
  return array;
}

function shuffle(str) {
  const randomChars = shuffleArray([...str.replace(/\s+/g, '')]);
  let index = 0;
  return str.replace(/\S/g, () => randomChars[index++]);
}

console.log(shuffle(
  `What is the difference in between 'Apache Environment', 'Environment' and 'PHP Variables'?`
));
...