Шифрование по квадрату Полибия
После одной из недавних тем решил заморочиться над шифрованием по квадрату Полибия, пару дней изобретал велосипед, просьба оценить насколько близко получилось к уже существующему.
Корректно работает только для квадратных матриц, что, как я понял, обусловлено самим способом формирования шифра (в википедии он идёт как метод под номером 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> |
Странно, неужели ни к чему нельзя придраться??
|
У Вас создаётся куча глобальных переменных.
|
Цитата:
|
Везде где объявление переменной без var
|
Цитата:
|
Цитата:
|
Цитата:
str.length -вычисляется при каждой итерации |
Цитата:
Цитата:
после выполнения функции, эта глобальная переменная висит в памяти, когда функция запускается вновь она использует уже созданную переменную i. |
Цитата:
Цитата:
|
Цитата:
Если так как я подумал, то все циклы всех запускаемых функций, в которых используется счётчик i, будут использовать эту переменную. Поэтому наверное имеет смысл объявить i как глобальную (или совсем её не объявлять, раз уж всё равно сама создаётся), а в условиях циклов не использовать выражение var i (и не использовать i для других целей, так как её значение будет зависеть от последнего исполненного цикла). Попробую проверить. Цитата:
|
nerv_, посмотрите функцию createTable2(), это вы имели в виду?
|
Цитата:
Array.push() Array.join() Цитата:
|
Цитата:
|
Мое мнение заключается в том, что переменные надо объявлять всегда. Предпочитаю делать это в начале функции.
Кстати, однобуквенные переменные не есть гуд. Имена переменных должны говорить сами за себя |
Цитата:
Цитата:
Как, например, назвать переменную k в функции createTable (увеличительНаКоличествоС олбцов что ли, не очень-то понятное выражение получится из таких имён). Проверка показала, что я правильно думал, то есть во всех циклах используется одна и та же переменная i, то есть B@rmaley.e><e был неправ, что в коде создаётся много глобальных переменных. Тут вопрос спорный получается использовать или не использовать var i в циклах: для порядка, конечно, чтобы не висела эта i в памяти, надо использовать var i, а в принципе, если уверен, что нигде эту i больше использовать не будешь, можно и без var. nerv_, не очень понял что нужно сделать в вашем способе, используя push() и join(): перевести строку в массив что ли, а потом каким-то образом вклинить туда <tr><td> и </tr><td>. |
Цитата:
Их вообще ни одной не должно быть. |
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Цитата:
Цитата:
Цитата:
|
(function(){ var localVariable = 5; window.getLocalVar = function () { return localVariable; }; window.setLocalVar = function (val) { localVariable = val; }; })(); alert( typeof localVariable); alert( getLocalVar() ); setLocalVar(10); alert( getLocalVar() ); |
из этого кода следует, что ты прав ;) Прикольное кино :)
var repeatCount = 100000; var pattern = "text"; var arrayFixSize = new Array( repeatCount ); var startTime; var counter; var line = ""; var arr = []; for( startTime = new Date(), counter = repeatCount; counter > 0; counter-- ) { line += pattern; } alert( 'concatenate - ' + ( new Date() - startTime ) ); /*********************************************************/ for( startTime = new Date(), counter = repeatCount; counter > 0; counter-- ) { arr.push( pattern ); } arr.join( '' ); alert( 'array + push - ' + ( new Date() - startTime ) ); /*********************************************************/ for( startTime = new Date(), counter = repeatCount; counter > 0; counter-- ) { arrayFixSize[ counter ] = pattern; } arrayFixSize.join( '' ); alert( 'array[ index ] - ' + ( new Date() - startTime ) ); Итог: во всех браузерах разное время, с точностью до наоборот :) |
bes, не пойму по какому принципу работает данная программа. она же должна присваивать букве определенное число, равное номеру ряда и столбца (первый ряд(1) и первый столбец(1) - буква а - 11), и выводить переведенный текст в другое окошко
|
Получается что к глобальным переменным придётся обращаться не напрямую, а через get/set методы, наподобие того как в Delphi обращаются к полям через свойства, только без сохранения синтаксиса обращения.
И всё это, как я понимаю, из-за того что не обеспечена модульность (весь скрипт по каким бы он файлам не был разбросан воспринимается как единый модуль). |
Цитата:
Я взял за основу описанный в википедии метод 2, когда получают координаты, затем к строке x-координат приписывают строку y-координат, а затем последовательно берут пары из строки, считают их координатами и переводят в буквы по той же таблице, то есть конечный шифр - слова. |
Цитата:
|
Цитата:
|
А Вам нигде из клиентского кода не нужно ею пользоваться.
|
nerv_, IE8 вообще подвисает на этом скрипте (потом отвисает выдавая результаты).
Хотя concat чаще выигрывает, изредка push немного опережает. Цитата:
|
B@rmaley.e><e, разрешите вопрос по приведенному мною коду: как правильней делать и есть ли среди данных вариантов "тот самый"? Т.е. как правильно (если можно так выразиться) в javascript выполнять конкатенацию? В vba могу сказать точно, этот способ line += pattern; самый медленный. Противоречивые результаты тестов в различных браузерах не позволяют прийти к единственно верному выводу. Или смысл в том, что заморачиваться не стоит line += pattern; да и фиг с ним?
bes, ты еще в хроме проверь ) |
Цитата:
|
Цитата:
Цитата:
|
Здесь рассказывается чем отличается переменная с var и без.
Тонкости ECMA-262-3. Часть 2. Объект переменных. Цитата:
|
B@rmaley.e><e, спасибо :)
|
Часовой пояс GMT +3, время: 09:02. |