Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- ####--------------------------------####
- #--# Author: by uriid1 #--#
- #--# License: GNU GPLv3 #--#
- #--# Telegram: @main_moderator #--#
- #--# E-mail: [email protected] #--#
- ####--------------------------------####
- --]]
- --
- -- Decode/Encode по азбуке Морзе
- -- Небольшая либа специально для использования с Русским языком
- -- Минус либы в том, что при encode возможен разброс регистра.
- -- Т.е получить "ПрИвЕт МиР"
- -- Это связанно с тем, что не реализован перевод символов
- -- из нижнего регистра в верхний.
- -- В lua5.1 нет либы utf8, поэтому пришлось бы тут писать еще 100-200 срок кода
- --
- -- Пробегаемся по каждому 1 байту в строке
- -- И склеиваем каждые 2 байта
- local function gsub2bstr(str, cb)
- local bc = 0 -- Byte count
- local bs = '' -- Byte string
- for s in string.gmatch(str, '.') do
- bs = bs .. '\\' .. string.byte(s, 1)
- bc = bc + 1
- if bc == 2 then
- cb(bs)
- bc = 0
- bs = ''
- end
- end
- end
- -- Перевод азбуки(каждого символа) в 10-е число
- local function morse2bfmt(t)
- local tmp = {}
- for s,_ in next, t do
- gsub2bstr(s, function(charcode)
- tmp[charcode] = t[s]
- end)
- end
- return tmp
- end
- -- Закодировать слово
- local function encode(str, set_encode)
- local res = ''
- for s in string.gmatch(str, "%S+") do
- gsub2bstr(s, function(charcode)
- -- Исключаем сиволы, которых нет в morse_encode
- if set_encode[charcode] then
- res = res .. set_encode[charcode] .. ' '
- end
- end)
- res = res .. ' '
- end
- return res:match('^%s*(.-)%s*$')
- end
- -- Декодировать слово
- local function decode(str, set_decode)
- local res = ''
- -- Захватываем слова разделенные двумя пробелами
- -- Тут str..' ' чтобы сработало регулярное выражения
- for word in string.gmatch(str..' ', "(.-)%s%s+") do
- -- Пробегаемся по каджой закодированной 2х байтовой букве
- local c = ''
- for char in string.gmatch(word, "[-.]+") do
- -- Декодируем разделяя 2байта на 1байт и конкатенируем
- for d in string.gmatch(set_decode[char], "%d+") do
- c = c .. string.char(tonumber(d))
- end
- end
- res = res .. c .. ' '
- end
- return res:match('^%s*(.-)%s*$')
- end
- -- 'азбука'
- local morse_encode = morse2bfmt {
- ['Аа'] = '.-';
- ['Бб'] = '-...';
- ['Вв'] = '.--';
- ['Гг'] = '--.';
- ['Дд'] = '-..';
- ['Ее'] = '.';
- ['Жж'] = '...-';
- ['Зз'] = '--..';
- ['Ии'] = '..';
- ['Йй'] = '.---';
- ['Кк'] = '-.-';
- ['Лл'] = '.-..';
- ['Мм'] = '--';
- ['Нн'] = '-.';
- ['Оо'] = '---';
- ['Пп'] = '.--.';
- ['Рр'] = '.-.';
- ['Сс'] = '...';
- ['Тт'] = '-';
- ['Уу'] = '..-';
- ['Фф'] = '..-.';
- ['Хх'] = '....';
- ['Цц'] = '-.-.';
- ['Чч'] = '---.';
- ['Шш'] = '----';
- ['Щщ'] = '--.-';
- ['Ъъ'] = '.--.-.';
- ['Ыы'] = '-.--';
- ['Ьь'] = '-..-';
- ['Ээ'] = '...-...';
- ['Юю'] = '..--';
- ['Яя'] = '.-.-';
- }
- local morse_decode = {}
- for k,v in next, morse_encode do
- morse_decode[v] = k
- end
- return {
- encode = function(str)
- return encode(str, morse_encode)
- end;
- decode = function(str)
- return decode(str, morse_decode)
- end;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement