Advertisement
uriid1

Morse code encode/decode | Lua 5.1+

Oct 9th, 2022 (edited)
1,162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.97 KB | None | 0 0
  1. --[[
  2.     ####--------------------------------####
  3.     #--# Author:   by uriid1            #--#
  4.     #--# License:  GNU GPLv3            #--#
  5.     #--# Telegram: @main_moderator      #--#
  6.     #--# E-mail:   [email protected]   #--#
  7.     ####--------------------------------####
  8. --]]
  9.  
  10. --
  11. -- Decode/Encode по азбуке Морзе
  12. -- Небольшая либа специально для использования с Русским языком
  13. -- Минус либы в том, что при encode возможен разброс регистра.
  14. -- Т.е получить "ПрИвЕт МиР"
  15. -- Это связанно с тем, что не реализован перевод символов
  16. -- из нижнего регистра в верхний.
  17. -- В lua5.1 нет либы utf8, поэтому пришлось бы тут писать еще 100-200 срок кода
  18. --
  19.  
  20. -- Пробегаемся по каждому 1 байту в строке
  21. -- И склеиваем каждые 2 байта
  22. local function gsub2bstr(str, cb)
  23.     local bc = 0  -- Byte count
  24.     local bs = '' -- Byte string
  25.     for s in string.gmatch(str, '.') do
  26.         bs = bs .. '\\' .. string.byte(s, 1)
  27.         bc = bc + 1
  28.         if bc == 2 then
  29.             cb(bs)
  30.             bc = 0
  31.             bs = ''
  32.         end
  33.     end
  34. end
  35.  
  36. -- Перевод азбуки(каждого символа) в 10-е число
  37. local function morse2bfmt(t)
  38.     local tmp = {}
  39.     for s,_ in next, t do
  40.         gsub2bstr(s, function(charcode)
  41.             tmp[charcode] = t[s]
  42.         end)
  43.     end
  44.     return tmp
  45. end
  46.  
  47. -- Закодировать слово
  48. local function encode(str, set_encode)
  49.     local res = ''
  50.     for s in string.gmatch(str, "%S+") do
  51.         gsub2bstr(s, function(charcode)
  52.             -- Исключаем сиволы, которых нет в morse_encode
  53.             if set_encode[charcode] then
  54.                 res = res .. set_encode[charcode] .. ' '
  55.             end
  56.         end)
  57.  
  58.         res = res .. ' '
  59.     end
  60.        
  61.     return res:match('^%s*(.-)%s*$')
  62. end
  63.  
  64. -- Декодировать слово
  65. local function decode(str, set_decode)
  66.     local res = ''
  67.     -- Захватываем слова разделенные двумя пробелами
  68.     -- Тут str..'  ' чтобы сработало регулярное выражения
  69.     for word in string.gmatch(str..'  ', "(.-)%s%s+") do
  70.         -- Пробегаемся по каджой закодированной 2х байтовой букве
  71.         local c = ''
  72.         for char in string.gmatch(word, "[-.]+") do
  73.             -- Декодируем разделяя 2байта на 1байт и конкатенируем
  74.             for d in string.gmatch(set_decode[char], "%d+") do
  75.                 c = c .. string.char(tonumber(d))
  76.             end
  77.         end
  78.        
  79.         res = res .. c .. ' '
  80.     end
  81.  
  82.     return res:match('^%s*(.-)%s*$')
  83. end
  84.  
  85. -- 'азбука'
  86. local morse_encode = morse2bfmt {
  87.    ['Аа'] = '.-';
  88.    ['Бб'] = '-...';
  89.    ['Вв'] = '.--';
  90.    ['Гг'] = '--.';
  91.    ['Дд'] = '-..';
  92.    ['Ее'] = '.';
  93.    ['Жж'] = '...-';
  94.    ['Зз'] = '--..';
  95.    ['Ии'] = '..';
  96.    ['Йй'] = '.---';
  97.    ['Кк'] = '-.-';
  98.    ['Лл'] = '.-..';
  99.    ['Мм'] = '--';
  100.    ['Нн'] = '-.';
  101.    ['Оо'] = '---';
  102.    ['Пп'] = '.--.';
  103.    ['Рр'] = '.-.';
  104.    ['Сс'] = '...';
  105.    ['Тт'] = '-';
  106.    ['Уу'] = '..-';
  107.    ['Фф'] = '..-.';
  108.    ['Хх'] = '....';
  109.    ['Цц'] = '-.-.';
  110.    ['Чч'] = '---.';
  111.    ['Шш'] = '----';
  112.    ['Щщ'] = '--.-';
  113.    ['Ъъ'] = '.--.-.';
  114.    ['Ыы'] = '-.--';
  115.    ['Ьь'] = '-..-';
  116.    ['Ээ'] = '...-...';
  117.    ['Юю'] = '..--';
  118.    ['Яя'] = '.-.-';
  119. }
  120.  
  121. local morse_decode = {}
  122. for k,v in next, morse_encode do
  123.     morse_decode[v] = k
  124. end
  125.  
  126. return {
  127.     encode = function(str)
  128.         return encode(str, morse_encode)
  129.     end;
  130.     decode = function(str)
  131.         return decode(str, morse_decode)
  132.     end;
  133. }
Tags: lua Morse
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement