Шифр Цезаря

101x101

Новичок
Автор темы
3
0
Как говорится - спасибо @chapo за это
Оригинальная тема: https://www.blast.hk/threads/90305/

Вкратце - пишите /ma [текст] - в чат отправляется ваш текст зашифрованный на шифре Цезаря, перед шифром добавляется специальный символ который помогает определить что это шифр цезаря в дешифровщик.

Всё сыро, но кому интересно взять под идею - велком

Отличие от оригинала - есть дешифровщик (костыльный)

Со словарём:
local ev = require('lib.samp.events')

local list1 = {
    ['а'] = 'в', ['б'] = 'г', ['в'] = 'д', ['г'] = 'е', ['д'] = 'ё', ['е'] = 'ж', ['ё'] = 'з', ['ж'] = 'и', ['з'] = 'й', ['и'] = 'к',
    ['й'] = 'л', ['к'] = 'м', ['л'] = 'н', ['м'] = 'о', ['н'] = 'п', ['о'] = 'р', ['п'] = 'с', ['р'] = 'т', ['с'] = 'у', ['т'] = 'ф',
    ['у'] = 'х', ['ф'] = 'ц', ['х'] = 'ч', ['ц'] = 'ш', ['ч'] = 'щ', ['ш'] = 'ъ', ['щ'] = 'ы', ['ъ'] = 'ь', ['ы'] = 'э', ['ь'] = 'ю',
    ['э'] = 'я', ['ю'] = 'ь', ['я'] = 'э', [' '] = ' ', ['.'] = '.', ['!'] = '!', [','] = ',', ['?'] = '?', [':'] = ':', ['"'] = '"',
    ['1'] = '3', ['2'] = '4', ['3'] = '5', ['4'] = '6', ['5'] = '7', ['6'] = '8', ['7'] = '9', ['8'] = '10', ['9'] = '11', ['0'] = '2',
    ['·'] = '·',
}

local list2 = {
    ['в'] = 'а', ['г'] = 'б', ['д'] = 'в', ['е'] = 'г', ['ё'] = 'д', ['ж'] = 'е', ['з'] = 'ё', ['и'] = 'ж', ['й'] = 'з', ['к'] = 'и',
    ['л'] = 'й', ['м'] = 'к', ['н'] = 'л', ['о'] = 'м', ['п'] = 'н', ['р'] = 'о', ['с'] = 'п', ['т'] = 'р', ['у'] = 'с', ['ф'] = 'т',
    ['х'] = 'у', ['ц'] = 'ф', ['ч'] = 'х', ['ш'] = 'ц', ['щ'] = 'ч', ['ш'] = 'ъ', ['щ'] = 'ы', ['ъ'] = 'ь', ['ы'] = 'э', ['ь'] = 'ю',
    ['э'] = 'я', ['ю'] = 'ь', ['я'] = 'э', [' '] = ' ', ['.'] = '.', ['!'] = '!', [','] = ',', ['?'] = '?', [':'] = ':', ['"'] = '"',
    ['1'] = '2', ['2'] = '0', ['3'] = '1', ['4'] = '2', ['5'] = '3', ['6'] = '4', ['7'] = '5', ['8'] = '6', ['9'] = '7', ['0'] = '9',
    ['·'] = '·',
}

function main()
    while not isSampAvailable() do wait(0) end

    sampRegisterChatCommand('ma', function(arg)
        local result = translate(arg, list1)
        sampSendChat('·' .. result)
    end)

    wait(-1)
end

function translate(text, translationTable)
    local result = ''

    for i = 1, #text do
        local char = text:sub(i, i)
        local replacement = translationTable[char:lower()]

        if replacement then
            if char:lower() == char then
                result = result .. replacement
            else
                result = result .. replacement:upper()
            end
        else
            result = result .. char
        end
    end

    return result
end

function ev.onServerMessage(color, text)
    local separator = '·'
    local index = string.find(text, separator)

    if index then
        local prefix = text:sub(1, index - 1)
        local postfix = text:sub(index + 1)

        local modifiedResult = prefix .. translate(postfix, list2)

        sampAddChatMessage(modifiedResult, 0xFF0000)
    end
end

С указанием смещения:
local ev = require('lib.samp.events')

local shiftAmount = 3  -- Количество позиций для сдвига, можно изменить

local function shiftChar(char, amount)
    local base = string.byte('а')
    local charCode = string.byte(char)

    if charCode >= base and charCode <= base + 32 then
        return string.char((charCode - base + amount) % 33 + base)
    else
        return char
    end
end

function main()
    while not isSampAvailable() do wait(0) end

    sampRegisterChatCommand('ma', function(arg)
        local result = ''

        for i = 1, #arg do
            local char = arg:sub(i, i)
            result = result .. shiftChar(char, shiftAmount)
        end

        sampSendChat('·' .. result)
    end)

    wait(-1)
end

function ev.onServerMessage(color, text)
    local separator = '·'
    local index = string.find(text, separator)

    if index then
        local prefix = text:sub(1, index - 1)
        local postfix = text:sub(index + 1)

        local modifiedResult = prefix .. translate(postfix, -shiftAmount)

        sampAddChatMessage(modifiedResult, 0xFF0000)
    end
end

function translate(text, amount)
    local result = ''

    for i = 1, #text do
        local char = text:sub(i, i)
        result = result .. shiftChar(char, amount)
    end

    return result
end
 

Вложения

  • Cesar.lua
    2.5 KB · Просмотры: 7
  • Bug
Реакции: wigel, Fott и MLycoris

bomb

Потрачен
19
8
Шифр Цезаря, также известный как шифр сдвига или код Цезаря — разновидность шифра подстановки, в котором каждый символ в открытом тексте заменяется символом, находящимся на некотором постоянном числе позиций левее или правее него в алфавите