Шифрование строки JavaScript

Я хотел бы зашифровать одну строку текста, используя следующую схему шифрования.

Это пример ввода. Сначала из текста удаляются пробелы.

haveaniceday

Затем возвращает длину строки (L = 12). Затем символы записываются в сетку, строки и столбцы которой имеют следующие ограничения:

Длина строки будет возвращать квадратный корень из L между 3 и 4. Таким образом, переписываем с 3 строками и 4 столбцами:

have
anic
eday

Наконец, закодированное сообщение получается путем отображения символов в столбце, вставки пробела, а затем отображения следующего столбца и вставки пробела и т. д.

Например, закодированное сообщение для прямоугольника выше:

hae and via ecy

В моих фрагментах кода сетка ["have", "anic", "eday"] уже создана, но я понятия не имею, как достичь следующего этапа.

const s = "haveaniceday";
let result = encryption(s);

function encryption(s) {

  let sqr = Math.sqrt(s.length),
    col = Math.ceil(sqr),
    row = Math.floor(sqr);

  let chunks = chunkSubstr(s, col);
  // => ["have", "anic", "eday"]
  console.info(chunks);

  for (var i = 0; i < chunks.length; i++) {
    // do some magic here...      
    // expected output: "hae and via ecy"
  }

}


function chunkSubstr(str, size) {
  const numChunks = Math.ceil(str.length / size)
  const chunks = new Array(numChunks)

  for (let i = 0, o = 0; i < numChunks; ++i, o += size) {
    chunks[i] = str.substr(o, size)
  }

  return chunks
}

Перестаньте относиться к программированию как к магии: теперь вам нужно получить первый символ из первого «слова», затем первый символ из второго «слова», ..., затем второй символ из первого «слова» и т. д.

zerkms 20.12.2018 03:20
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
463
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

easy => array.joint ('') в конце и двойной цикл

const s = "haveaniceday";
let result = encryption(s);

console.info ('result =', result );

function encryption(s) {

  let
    sqr = Math.sqrt(s.length),
    col = Math.ceil(sqr),
    row = Math.floor(sqr)
    ;

  let chunks = chunkSubstr(s, col);
  // => ["have", "anic", "eday"]

  let Respons = [];
  
  for (let i=0, iMax=chunks[0].length; i<iMax; i++ ) {

    Respons[i] = '';
    for (let txt of chunks ) {
      Respons[i] += txt.charAt(i);
    }
  }
  return Respons.join(' ');
}


function chunkSubstr(str, size) {
  const
    numChunks = Math.ceil(str.length / size),
    chunks    = new Array(numChunks)
    ;

  for (let i = 0, o = 0; i < numChunks; ++i, o += size) {
    chunks[i] = str.substr(o, size)
  }
    return chunks
}

Они хотят "hae and via ecy", а не "have anic eday"

Kaiido 20.12.2018 03:48
Ответ принят как подходящий

Вы можете получить каждый символ по частям, перебирая счетчик столбцов.

const s = "haveaniceday";
let result = encryption(s);

function encryption(s) {

  let sqr = Math.sqrt(s.length),
    col = Math.ceil(sqr),
    row = Math.floor(sqr);

  let chunks = chunkSubstr(s, col);
  // => ["have", "anic", "eday"]
  console.info(chunks);

  let output = '';
  for (var i=0; i<col; i++) {
    chunks.forEach((e) => {
      if (e[i]) {
        output += e[i];
      }
    });
    output += ' ';
  }
  console.info(output);

}


function chunkSubstr(str, size) {
  const numChunks = Math.ceil(str.length / size)
  const chunks = new Array(numChunks)

  for (let i = 0, o = 0; i < numChunks; ++i, o += size) {
    chunks[i] = str.substr(o, size)
  }

  return chunks
}
    const s = "haveaniceday";
    let result = encryption(s);

    function encryption(s) {

      let sqr = Math.sqrt(s.length),
        col = Math.ceil(sqr),
        row = Math.floor(sqr);

      let chunks = chunkSubstr(s, col);
      // => ["have", "anic", "eday"]
      console.info(chunks);
      var result = [];
      for (var i = 0; i < chunks.length; i++) {
        // do some magic here...      
        // expected output: "hae and via ecy"

         var split =  Array.from(chunks[i]);
         for (var s = 0; s < split.length; s++) {

            var previousValue = '';
            if (result[s])
             { previousValue = result[s];}

            result[s]=previousValue + split[s];
    }


      }

console.info(result);

    }


    function chunkSubstr(str, size) {
      const numChunks = Math.ceil(str.length / size)
      const chunks = new Array(numChunks)

      for (let i = 0, o = 0; i < numChunks; ++i, o += size) {
        chunks[i] = str.substr(o, size)
      }

      return chunks
    }

Вы можете уменьшать вашего массива ["have" "anic" "eday"] в другом массиве, длина ваших строк. Для каждых трех членов исходного массива вы сопоставите все его символы в новом массиве.

const original = ["have", "anic", "eday"];
const output = original.reduce((out, word) => {
 word.split("") // break into characters[]
  .forEach((char, i) =>
    out[i] += char // append this char to the corresponding string of `out`
  );
 return out;
}, new Array(original[0].length).fill('')) // ['', '', '', '']
console.info(output.join(' '));

Другие вопросы по теме