Last active
January 5, 2019 23:01
-
-
Save Titiaiev/b07bafd225972c63e3b7f62bddbedd9c to your computer and use it in GitHub Desktop.
Шифр Цезаря. Перебирает варианты сдвига в строке и возвращает массив вариантов строк.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// для теста | |
// const str = 'ПГПГ ПЮОГ УГПЦ'; | |
// расшифровывается в "мама мыла раму" | |
const caesarCipher = function caesarCipher(string) { | |
const codesMap = { | |
а: 1, | |
б: 2, | |
в: 3, | |
г: 4, | |
д: 5, | |
е: 6, | |
ё: 7, | |
ж: 8, | |
з: 9, | |
и: 10, | |
й: 11, | |
к: 12, | |
л: 13, | |
м: 14, | |
н: 15, | |
о: 16, | |
п: 17, | |
р: 18, | |
с: 19, | |
т: 20, | |
у: 21, | |
ф: 22, | |
х: 23, | |
ц: 24, | |
ч: 25, | |
ш: 26, | |
щ: 27, | |
ъ: 28, | |
ы: 29, | |
ь: 30, | |
э: 31, | |
ю: 32, | |
я: 33, | |
}; | |
const charsMap = [ | |
null, | |
'а', | |
'б', | |
'в', | |
'г', | |
'д', | |
'е', | |
'ё', | |
'ж', | |
'з', | |
'и', | |
'й', | |
'к', | |
'л', | |
'м', | |
'н', | |
'о', | |
'п', | |
'р', | |
'с', | |
'т', | |
'у', | |
'ф', | |
'х', | |
'ц', | |
'ч', | |
'ш', | |
'щ', | |
'ъ', | |
'ы', | |
'ь', | |
'э', | |
'ю', | |
'я', | |
]; | |
let _string = string.toLocaleLowerCase(); | |
const results = []; | |
let iterations = charsMap.length - 1; | |
while (iterations > 0) { | |
const chars = _string.split(''); | |
// eslint-disable-next-line no-loop-func | |
const nextChars = chars.map((char) => { | |
if (codesMap[char]) { | |
let position = codesMap[char] + 1; | |
if (position > charsMap.length - 1) position = 1; | |
return charsMap[position]; | |
} | |
return char; | |
}); | |
_string = nextChars.join(''); | |
results.push(_string); | |
iterations -= 1; | |
} | |
// console.log(results); | |
return results; | |
}; | |
export default caesarCipher; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html lang="ru"> | |
<head> | |
<meta charset="UTF-8"> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
<meta http-equiv="X-UA-Compatible" content="ie=edge"> | |
<title>Document</title> | |
</head> | |
<body> | |
<script type="module" src="cezar.js"></script> | |
</body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// eslint-disable-next-line import/extensions | |
import caesarCipher from './Caesar-cipher.js'; | |
const str = 'ПГПГ ПЮОГ УГПЦ'; | |
console.log(caesarCipher(str)); | |
// ниже второй вариант | |
const results = []; | |
let iter = 32; | |
function convertToCode(str) { | |
let cursor = 0; | |
const charCodes = []; | |
while (cursor < str.length) { | |
charCodes.push(str.charCodeAt(cursor)); | |
cursor += 1; | |
} | |
return charCodes; | |
} | |
function convertToWord(codes) { | |
if (!codes) return null; | |
const chars = []; | |
codes.forEach((code) => { | |
if (code) { | |
chars.push(String.fromCharCode(code)); | |
} | |
}); | |
return chars.join(''); | |
} | |
function splitString(str = '') { | |
return str.toLocaleLowerCase().split(' '); | |
} | |
const splited = splitString(str); | |
let convertedAndSplited = []; | |
splited.forEach((word) => { | |
convertedAndSplited.push(convertToCode(word)); | |
}); | |
while (iter > 0) { | |
let temp = []; | |
convertedAndSplited.forEach((item) => { | |
// console.log(convertToWord(item)); | |
const _item = item.map((i) => { | |
if (i < 1103) return i += 1; | |
i = 1072; | |
return i; | |
}); | |
temp.push(_item); | |
}); | |
let _temp = []; | |
temp.forEach((code) => { | |
_temp.push(convertToWord(code)); | |
}); | |
results.push(_temp.join(' ')); | |
convertedAndSplited = temp; | |
temp = []; | |
_temp = []; | |
iter -= 1; | |
} | |
// console.log(results); | |
// а - 1072 | |
// я - 1103 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment