2016-04-23 1 views
0

Я пытаюсь создать цезарский шифр в Javascript и не знаю, как это сделать. Возможно, мой подход усложняет его, но я пытаюсь понять, как установить максимальное значение для добавления чисел, но добавление продолжения начинается с минимального числа. Вот код, у меня есть:Как вы обрабатываете сдвиг на шифре Цезаря в Javascript?

$(document).ready(function(){ 
var alpha = []; 
var encoded = []; 
alpha = { 
    '1': 'a', 
    '2': 'b', 
    '3': 'c', 
    '4': 'd', 
    '5': 'e', 
    '6': 'f', 
    '7': 'g', 
    '8': 'h', 
    '9': 'i', 
    '10': 'j', 
    '11': 'k', 
    '12': 'l', 
    '13': 'm', 
    '14': 'n', 
    '15': 'o', 
    '16': 'p', 
    '17': 'q', 
    '18': 'r', 
    '19': 's', 
    '20': 't', 
    '21': 'u', 
    '22': 'v', 
    '23': 'w', 
    '24': 'x', 
    '25': 'y', 
    '26': 'z' 
}; 
$('#cipher_form').submit(function(event){ 
    event.preventDefault(); 
    var input = $('#cipher_input').val(); 
    var key = $('#cipher_key').val(); 
    var chars = input.split(''); 
    for(var i = 0; i<chars.length; i++){ 
     console.log(chars[i]); 
     for(var index in alpha){ 
      if(alpha[index] == input[i]){ 
       encoded.push(index); 
      } 
     } 
    } 

    for(var i=0; i<encoded.length; i++){ 
     alert(encoded[i]); 

    } 

}); 
}); 

Итак, когда форма представляет, я захватывая значение входного сигнала, и превратить его в массив символов. Затем я прокручиваю свой объект и нахожу пару значений ключа, которая соответствует символу и нажимает ключ на другой массив. Мой план состоял в том, чтобы перебрать мой массив ключей и добавить cipher_key к этому номеру.

Итак, если в моем объекте есть буква «o», а мой cipher_key - «5», он добавит 15 + 5 и в итоге будет «20», что будет «t». Проблема, которую я вижу, заключается в том, что если мое письмо «z», и вы добавляете 26 + 5, вы получите 31, которого нет в моем объекте.

Моя задача - выяснить, как добавить cipher_key к моему номеру до 26, но если он переместится через 26, сбросьте и начните с 1 и продолжите добавление. Поэтому, если буква «z», а cipher_key - «5», это займет 26 + 5 и заканчивается на «5» для буквы «e».

Это можно сделать? Или мой подход совершенно не прав?

+0

Я бы пошел с нулевой структурой и затем использовал оператор остатка '%', чтобы переместить число в правый диапазон. другой момент - использовать объект, как тот, который у вас есть, для поиска по номеру. '{'A': 0, 'B': 1, ...}' –

ответ

1

Просто введите цифры в простом массиве, но в порядке.
var alpha = ['a', 'b', 'c', ... 'z']
Получить его номер значения в качестве var value = alpha.indexOf(the_number);
Затем добавьте ключ шифрования и предотвращения перехода вашей суммы с помощью %.
var newNumValue = (value + key) % 26; Я думаю, что все. Он охватывает вопрос. Кроме того - ваш подход был хорошим, да.
Другой подход
Также - если ваш текст может содержать некоторые специальные символы, я бы предложил взять начальное значение от ASCII table. Он будет охватывать все символы плюс разные строчные и прописные буквы. И вам не нужно хранить этот массив.
var value = yourChar.charCodeAt(0);
Чтобы получить символ обратно из кода ASCII, перейдите var symbol = value.fromCharCode();
Надеюсь, что это помогает.

+0

Спасибо! Это заставило меня двигаться в правильном направлении. –

+2

** Pro tip. ** Чтобы получить массив символов, вы можете объявить строку и разделить ее потом: 'var alpha = 'abcde ...'. Split ('');'. –

+0

Хорошо, но просто поймите, что 'fromCharCode' и' charCodeAt' используют [Unicode] (http://www.unicode.org/charts/nameslist/index.html)/UTF-16 (например, Java, .NET, ...) ., а не ASCII. –

Смежные вопросы