Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.05.2012, 23:42
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Шифрование по квадрату Полибия
После одной из недавних тем решил заморочиться над шифрованием по квадрату Полибия, пару дней изобретал велосипед, просьба оценить насколько близко получилось к уже существующему.

Корректно работает только для квадратных матриц, что, как я понял, обусловлено самим способом формирования шифра (в википедии он идёт как метод под номером 2), так как идёт перенос строки y-координат в конец строки x-координат и поэтому часть y-координат становятся х-координатами, что и даёт сбои при не квадратных матрицах.

Также для корректности работы приходится добавлять несколько лишних символов к алфавиту.
В моём примере вводимый текст может содержать только русские буквы, пробел, точку и запятую.
charAt() не использовал, хотя наверное можно было.


<body onload = "createTable()">

<style>
table, td {border: solid 1px; text-align: center; float: left}
textarea {wrap: virtual}
</style>

<table id="etable">
</table>

<div id="myDiv">
<textarea id="text"></textarea>
  <input type="button" value="Encode" onclick="encode(text, etext)"><br>
<textarea id="etext"></textarea>
  <input type="button" value="Decode" onclick="decode(etext, dtext)"><br>
<textarea id="dtext"></textarea>
</div>


<script>
//алфавит также включает точку, запятую и пробел
var alphabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ., ";
//параметры таблицы
var rows = 6;
var cols = 6;

//выводит таблицу
function createTable() {
var k = 0; 
  for (var i = 0; i < rows; i++) {
    tr = document.createElement('tr');
      etable.appendChild(tr);
  
    for (var j  = 0; j < cols; j++) {
       td = document.createElement('td');
       td.innerHTML = alphabet[j+k];
       tr.appendChild(td);
      }
      k = k + cols;
  }
}


//второй вариант вывода таблицы
function createTable2() {
var k = 0; 
var str = "";

  for (var i = 0; i < rows; i++) {
    str = str +'<tr>';

    for (var j = 0; j < cols; j++) {
      str = str + '<td>' + alphabet[j+k];
    }
    str = str + '</tr>'
    k = k + cols;
  }

etable.innerHTML = str;
}


//координаты символа
function pos(symbol) {
var  k = alphabet.indexOf(symbol);
var x = k % cols; 
var  y = parseInt(k/cols); 
var xy = [];
  xy[0] = x;
  xy[1] = y;
return xy; 
}


//символ по координатам
function symbol(x, y) {
var n = parseInt(y) * cols + parseInt(x);
  return alphabet[n]; 
}


//шифрует
function encode(source, target) {
var str = source.value.toUpperCase(); //регистронезависимость текста
var allX = "";
var allY = "";
var estr = "";
var mas = [];
var l = str.length;

  for (var i  = 0; i < l; i++) {
    mas = pos(str[i]); 
    allX = allX + mas[0]; 
    allY = allY + mas[1];
  }

var all = allX + allY; 
var k = all.length;

  for (var i = 0; i < k; i = i + 2) {
    estr = estr + symbol( all[i], all[i+1] ); 
  }   

target.value = estr;
}


//дешифрует
function decode(source, target) {
var str = source.value.toUpperCase(); 
var all = "";
var dstr = "";
var mas = [];
var l = str.length;

  for (var i = 0; i < l; i++) {
    mas = pos(str[i]); 
    all = all + mas[0] + mas[1] ;
  }

var k = all.length/2;
var allX = all.slice (0, k); 
var allY = all.slice(k); 

  for (var i = 0; i < k; i++) {
    dstr = dstr + symbol(allX[i], allY[i] ); 
  }

target.value = dstr;
}
</script>

Последний раз редактировалось bes, 12.05.2012 в 19:18.
Ответить с цитированием
  #2 (permalink)  
Старый 12.05.2012, 12:29
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Странно, неужели ни к чему нельзя придраться??
Ответить с цитированием
  #3 (permalink)  
Старый 12.05.2012, 12:38
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

У Вас создаётся куча глобальных переменных.
Ответить с цитированием
  #4 (permalink)  
Старый 12.05.2012, 13:19
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от B@rmaley.e><e
У Вас создаётся куча глобальных переменных.
Просьба пояснить, где именно.
Ответить с цитированием
  #5 (permalink)  
Старый 12.05.2012, 14:06
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

Везде где объявление переменной без var
Ответить с цитированием
  #6 (permalink)  
Старый 12.05.2012, 14:18
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от zebra
Везде где объявление переменной без var
Такие переменные только в циклах, но почему их создаётся куча?
Ответить с цитированием
  #7 (permalink)  
Старый 12.05.2012, 14:43
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от bes
но почему их создаётся куча?
потому, что они объявляются без инструкции var
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #8 (permalink)  
Старый 12.05.2012, 14:53
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от bes
for (i=0; i<str.length; i++) {
да и подобные конструкции
str.length -вычисляется при каждой итерации
Ответить с цитированием
  #9 (permalink)  
Старый 12.05.2012, 15:11
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от dmitriymar
str.length
Да, надо вынести из условия.

Сообщение от nerv_
потому, что они объявляются без инструкции var
Правильно ли я понимаю, что если в цикле внутри функции счётчик i не объявлен в выражении var i, то создаётся одна глобальная переменная i,
после выполнения функции, эта глобальная переменная висит в памяти, когда функция запускается вновь она использует уже созданную переменную i.
Ответить с цитированием
  #10 (permalink)  
Старый 12.05.2012, 15:42
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от bes
Правильно ли я понимаю
что мешает самому проверить?

Сообщение от bes
035 td = document.createElement('td');
036 td.innerHTML = alphabet[j+k];
037 tr.appendChild(td);
лучше создавать таблицу целиком (строкой) и затем ее парсить (innerHTML)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 12.05.2012 в 15:47.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
шифрование строки по ключу JAre Библиотеки/Тулкиты/Фреймворки 26 26.02.2015 16:06
Кликаем по квадрату - он сдвигается и перекрашивается. Как это осуществить? Kaur Общие вопросы Javascript 19 27.01.2012 07:06
Шифрование ссылки Korvin Общие вопросы Javascript 4 27.02.2009 13:05