Переводчик азбуки Морзе


32

Напишите самую короткую программу для преобразования стандартного ввода в азбуку Морзе . Символы, которых нет в таблице, должны быть напечатаны как есть.

Международный азбука Морзе


1
Кодируются ли заглавные и строчные буквы?
Джои Адамс,

9
Кроме того, не могли бы вы предоставить пример ввода и вывода для уточнения деталей, таких как расстояние между словами?
Джои Адамс

Ну, в Морзе нет разницы между строчными и прописными буквами. Там нет реального символа для пробела (это просто 3/4 раза тишина), поэтому я думаю, что это должно быть переведено как пробел.
Шикирю

@Joey: детали до вас.
Александру

Аналогично вопросу о переполнении стека. Код Гольф: азбука Морзе .
dmckee

Ответы:


11

Golfscript - 74 символа

Этот ответ поддерживает только прописные буквы и цифры. Буквы разделены новыми строками, а слова разделены двумя строками

{." ETIANMSURWDKGOHVF L PJBXCYZQ"?)"?/'#! 08<>"@))10%=or 2base(;{!45+}%n}%

Анализ

    {}% как обычно работает как карта над массивом
    , положить копию символа в стек
    «ETIAN ...» это таблица поиска символов верхнего регистра
    ? как string.find возвращает индекс символа в строке
                  или -1, если он не найден (т.е. это цифра)
    ) увеличить этот индекс так, чтобы E => 2 T => 3 I => 4 и т. д. заметили, что если
                  char - это не заглавная буква или пробел, теперь это 0 (False)
    "? / '#! ..." это таблица поиска для цифр. это будет использоваться в
                  обратный путь к другой справочной таблице.
    @ вытащите ту копию, которую мы сделали из символа, на вершину стека
    ))% 10 преобразовать цифру ASCII в число, добавив 2 и взяв мод 10.
                  Это важно сделать так, потому что все прописные буквы
                  буквы также попадают в этот код, и мы должны убедиться, что они выпадают
                  в диапазоне 0,9 или следующий шаг не удастся.
    = вытащить n-ный символ из строки, например "Hello" 1 = дает "e"
    или помните, что если поиск в верхнем регистре завершится неудачно, у нас будет 0 результат,
                  будет использован поиск цифр
    2base преобразовать в базу 2, так что E => [1 0], T => [1 1], I => [1 0 0] и т. Д.
    (; вытолкните перед списком и выбросьте его так, чтобы E => [0], T => [1]
    {! 45 +}% отменяет каждый бит и добавляет 45, это дает значение ascii. а также -
    Новая строка отделяет каждое слово. это может быть 32, если вы хотите
                  разделить слова пробелами за 1 удар

Golfscript - 85 символов

Это короче, чем мой SO ответ из-за смягченных требований здесь. Ввод должен быть в верхнем регистре / цифрах и знаках препинания ".,?"

{." ETIANMSURWDKGOHVF!L!PJBXCYZQ"?)"UsL?/'#! 08<>"@".,?"58,48>+?=or
2base(;{!45+}%n}%

Поскольку пунктуация здесь даже не требуется, я могу сократить ответ еще больше

Мой ответ от SO
Golfscript - 107 символов

символ новой строки в конце ввода не поддерживается, поэтому используйте что-то вроде этого

echo -n Hello, Codegolfers| ../golfscript.rb morse.gs

Буквы представляют собой особый случай и преобразуются в нижний регистр и упорядочиваются в своих двоичных позициях. Все остальное делается с помощью таблицы перевода

' '/{{.32|"!etianmsurwdkgohvf!l!pjbxcyzq"?)"UsL?/'#! 08<>"@".,?0123456789"?=or
2base(;>{'.-'\=}%' '}%}%'/'*

Порядок ваших блоков кода здесь сбивает с толку пользовательский код Джорджа . Могу ли я побеспокоить вас переставить? И я бы хотел, чтобы это объяснили. Я получаю неявное дерево, но остальное для меня загадка.
dmckee

@dmckee, готово. Сценарий Джорджа заметил, что мой счет был на единицу, поэтому я тоже это
исправил

Требуя откликов, чтобы увидеть анализ ... бу! Анализ - это то, что делает ответы полезными!
Ник Ларсен

@ Ник, хорошо, я думаю, что это настолько коротко, насколько я могу получить, поэтому я
приступлю

20

C # (213 символов)

Я уверен, что это не продлится долго, но, по крайней мере, я сначала получил технику здесь!

class P{static void Main(string[] a){foreach(var t in a[0]){var c="";for(int i=" ETIANMSURWDKGOHVF L PJBXCYZQ  54 3   2       16       7   8 90".IndexOf(t);i>0;i/=2)c="-."[i--%2]+c;System.Console.Write(c+"  ");}}}

И в читаемом формате:

class P
{
    static void Main(string[] a)
    {   
        foreach(var t in a[0])
        {
            var c="";
            for(int i=" ETIANMSURWDKGOHVF L PJBXCYZQ  54 3   2       16       7   8 90".IndexOf(t);i>0;i/=2)c="-."[i--%2]+c;
            System.Console.Write(c+" ");
        }
    }
}

Для краткого объяснения, строка символов - это куча, в которой левый потомок - точка, а правый - тире. Чтобы построить письмо, пройдите обратно вверх и измените порядок.


2
Это лучшая идея, которую я видел до сих пор.
Александру

А потом я прочитал связанную ветку и заметил, что это далеко от оригинала.
Ник Ларсен

1
Когда я увидел ETIAN...там, я предположил, что он работает так же, как сценарий гольфа, но у вас есть другой способ интерпретации строки. Я думаю, что это эквивалентно, но я добавляю 1 к индексу и использую двоичное представление, чтобы получить точки и тире для всех цифр после F=>18=>0b10010=>..-.
начального

Вам не нужно место вString[] a
Cyoce

9

tr + sed (347)

tr a-z A-Z | sed 's/0/--O/g;s/1/.-O/g;s/2/.J/g;s/3/..W/g;s/4/.V/g;s/5/.H/g;
 s/6/-.H/g;s/7/-B/g;s/8/-Z/g;s/9/--G/g;s/X/-U/g;s/V/.U/g;s/U/.A/g;
 s/Q/-K/g;s/K/-A/g;s/A/.T/g;s/J/.O/g;s/O/-M/g;s/Y/-W/g;s/W/.M/g;
 s/M/-T/g;s/T/- /g;s/H/.S/g;s/B/-S/g;s/S/.I/g;s/L/.D/g;s/Z/-D/g;
 s/D/-I/g;s/I/.E/g;s/C/-R/g;s/F/.R/g;s/R/.N/g;s/P/.G/g;s/G/-N/g;
 s/N/-E/g;s/E/. /g'

1
Пространство вокруг трубы также может быть устранено ;-)
Ясир Арсанукаев

1
Да, я не считаю эти пробелы, я просто напечатал их здесь для ясности :)
Eelvex

2
Вы можете использовать расширение скобки, чтобы сократить его много ( /g;s/становится ,- плюс немного накладных расходов).
Набб

@nabb хорошая идея.
Eelvex

1
Вы можете сбросить tr, используя yвместо этого команду sed
Hasturkun

6

Haskell - 314 292 291 символов

import Data.List
i=intercalate
m=i"       ".map(i" ".map(\c->words".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----."!!(head.findIndices(==c)$['a'..'z']++['0'..'9']))).words

Более читаемая форма:

tbl :: [String]
tbl = words ".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----."

lookupChar :: Char -> String
lookupChar c = tbl !! (fromJust . elemIndex c $ ['a'..'z'] ++ ['0'..'9'])

encWord :: String -> String
encWord = intercalate " " . map lookupChar

encSent :: String -> String
encSent = intercalate "       " . map encWord . words

Образец прогона:

*Main> m "welcome humans"
".-- . .-.. -.-. --- -- .       .... ..- -- .- -. ..."

Между двумя буквами один пробел, а между двумя словами семь пробелов.


Просто проверил вопрос, на который ссылается @dmckee "Code Golf: азбука Морзе", и не нашел версию на Haskell. Я думаю, что короче 314 было бы возможно.
Ясир Арсанукаев

fromJust.elemIndex cможно записать как head.findIndices(==c). Это на один символ больше, но вы можете избавиться от него import Data.Maybe, так что вы сэкономите всего 17 символов. Вы также можете сохранить два символа, удаляя пробел перед строкой каждый раз, когда вы вызываете intercalate. И еще несколько символов, выполнив i=intercalateв начале и заменив два вызова на intercalateна i.
sepp2k

@ sepp2k: Хорошая идея! Спасибо. Я также играл с intercalateи сохранил еще 6 символов! :-)
Ясир Арсанукаев

Вы также можете сделать w=words, что сохраняет один символ, если я не ошибаюсь. И вместо l c=...и map l, вы должны это сделать map\c->...(вам даже не нужны парены вокруг лямбды, так как потом уже есть закрывающий парен).
sepp2k

@ sepp2k: вставка l c=...спасла мне 1 символ, но я не мог поставить его без символов, только как map(\c->...). GHC версия 6.12.3.
Ясир Арсанукаев

4

постскриптум (310) (462) (414)(319) в том числе (46) для таблицы.

Комбинированные цифры и буквы с троичной кодировкой. 5 троичных цифр вписываются в байт! Это устраняет эти глупые разностные циклы и номера специальных корпусов полностью.

ASCII85 режет 1/3 каждого стола. И упрощение кода (наконец-то!) Возвращается под 400!

errordict/undefined{pop( )dup 0 4 3 roll put print{}}put<</*{{[exch/@ cvx]cvx 1
index 1 add}forall pop}def/C{<~#:VD<!AP07"A]ga#R),'7h?+2(./s-9e6~>*}def/#{load
exec}/P{print}0{}1{(.)P}2{(---)P}/S{( )P}48<~o'u/0b'A;]L7n~>* 65 C 97 C/@{5{dup
3 mod # S 3 idiv}repeat # S S S}>>begin{(%stdin)(r)file read not{exit}if #}loop

Образец вывода

Luser Dr00g!
, --- , , , --- , , , , --- --- , , --- --- --- --- --- --- --- --- --- --- --- --- ---. !

Разоблаченный и прокомментированный. Я очень горжусь этим. Я чувствую, что это элегантно, заставлять цифры работать. :)

%!
%Morse Code Translator (Simplified)

%if `load` signals /undefined in /#{load exec},
%  pop --load--,
%  print the char,
%  leave dummy object for `exec` to find
errordict/undefined{pop( )dup 0 4 3 roll put print{}}put

<<
%create int->proc pairs
%from initial int and string values
/*{{[exch/@ cvx]cvx 1 index 1 add}forall pop}def

%the alpha map is applied to Upper and Lower case
/C{<~#:VD<!AP07"A]ga#R),'7h?+2(./s-9e6~>*}def
65 C 97 C

%the number map
48<~o'u/0b'A;]L7n~>*

/#{load exec}  %execute a number
/P{print}

0{}       % 0: nop
1{(.)P}   % 1: '.' dit
2{(---)P} % 2: '---' dah
/S{( )P}  % S: space

%execute a morse sequence, from the table
/@{5{dup 3 mod # S 3 idiv}repeat # S S S}
>>begin

%read and execute each char from stdin
{(%stdin)(r)file read not{exit}if #}loop

Таблицы (33) + (13) = (46)

Вот как строки кодируют таблицу. Каждый байт представляет собой 5-значное троичное число. И байты далее кодируются в ASCII85 (который PostScript может автоматически декодировать).

%The Morse Table in Ternary Encoding
% 3  ^4 ^3 ^2 ^1 ^0
%    81 27  9  3  1                 Dec  Hex  dc ->ASCII85
%   ---------------                 ---  ---  ---
% A            2  1            6+1    7    7  7 256*41+256*50+256*14+
% B      1  1  1  2      27+ 9+3+2   41   29  d85%n85/d85%n85/d85%n85/d85%n85/n
% C      1  2  1  2      27+18+3+2   50   32  2 25 53 35 27  chr(x+33)
% D         1  1  2          9+3+2   14    E  #  :  V  D  <
% E               1              1    1    1
% F      1  2  1  1      27+18+3+1   49   31
% G         1  2  2          9+6+2   17   11  0 32 47 15 22
% H      1  1  1  1      27+ 9+3+1   40   28  !  A  P  0  7
% I            1  1            3+1    4    4
% J      2  2  2  1      54+18+6+1   79   4F
% K         2  1  2         18+3+2   23   17  1 32 60 70 64
% L      1  1  2  1      27+ 9+6+1   43   2B  "  A  ]  g  a
% M            2  2            6+2    8    8
% N            1  2            3+2    5    5
% O         2  2  2         18+6+2   26   1A  2 49 8 11 6
% P      1  2  2  1      27+18+6+1   52   34  #  R )  , '
% Q      2  1  2  2      54+ 9+6+2   71   47
% R         1  2  1          9+6+1   16   10
% S         1  1  1          9+3+1   13    D  22 71 30 10 17
% T               2              2    2    2   7  h  ?  +  2
% U         2  1  1         18+3+1   22   16
% V      2  1  1  1      54+ 9+3+1   67   43
% W         2  2  1         18+6+1   25   19  7 13 14 82 12
% X      2  1  1  2      54+ 9+3+2   68   44  (  .  /  s  -
% Y      2  2  1  2      54+18+3+2   77   4D  77 256*44+256*256*
% Z      1  1  2  2      27+ 9+6+2   44   2C  24 68 21 [23 36]
%                                              9  e  6 [ 8  E] (omit final 2)
% 0   2  2  2  2  2  162+54+18+6+2  242   F2
% 1   2  2  2  2  1  162+54+18+6+1  241   F1
% 2   2  2  2  1  1  162+54+18+3+1  238   EE  78 6 84 14 15
% 3   2  2  1  1  1  162+54+ 9+3+1  229   E5   o '  u  /  0
% 4   2  1  1  1  1  162+27+ 9+3+1  202   CA
% 5   1  1  1  1  1   81+27+ 9+3+1  121   79
% 6   1  1  1  1  2   81+27+ 9+3+2  122   7A  65 6 32 26 60
% 7   1  1  1  2  2   81+27+ 9+6+2  125   7D   b '  A  ;  ]
% 8   1  1  2  2  2   81+27+18+6+2  134   86  134 256*161+256*256*
% 9   1  2  2  2  2   81+54+18+6+2  161   A1  43 22 77 [50 40]
%                                              L  7  n [ S  I] (omit final 2)

4

Руби, 161

d=proc{|x|x>1?d[x/2]+".-"[x&1]:' '}
$><<$<.gets.bytes.map{|i|
e=i>64?"-@B4*:68,?5</.7>E20+193ACD"[(i&95)-65]:i>47?"gWOKIHX`df"[i-48]:nil
e ?d[e.ord-40]:i.chr}*''

Кодирует каждую цифру в один символ, где 1 - тире, 0 - точка, с ведущим 1 в качестве бита маркера (плюс смещение, чтобы сохранить его для печати. ​​Используется математика ASCII для использования входных символов в качестве индексов поиска.


4

VB.NET, 233 байта

Module Module1
 Sub Main(a$())
   For Each c In a(0)
     Dim i = "ETIANMSURWDKGOHVF L PJBXCYZQ  54 3   2       16       7   8 90".IndexOf(c)
     If c <> " " And i >= 0 Then
       Console.Write("{0} ", Morse(i))
     Else
       Console.Write(c)
     End If
   Next
End Sub

Function Morse(i) As String
  Dim b = Math.Log(i) / Math.Log(2)
  Return (From m In MorseSeq(If(Double.IsInfinity(b), 0, b)) Order By m.Length)(i)
End Function

Function MorseSeq(i) As IEnumerable(Of String)
  Return If(i < 0, {}, From n In ".-" From m In MorseSeq(i - 1).DefaultIfEmpty
                       Select n & m)
End Function
End Module

Эта последняя функция зла.

Отредактируйте пару улучшений.

Function Morse(i) As String
  Return (From m In MorseSeq(i) Order By m.Length)(i)
End Function

Function MorseSeq(i) As IEnumerable(Of String)
  Return If(i=0,{".","-"},From n In".-"From m In MorseSeq(i>>1) Select n & m)
End Function

Я решил +1, потому что я не помню, чтобы когда-либо видел VB.net, используемый для игры в гольф.
mbomb007

3

Лисп ( 532 466 символов)

(loop(princ(let((c(read-char)))(case c(#\a".- ")(#\b"-... ")(#\c"-.-. ")(#\d"-.. ")(#\e". ")(#\f"..-. ")(#\g"--. ")(#\h".... ")(#\i".. ")(#\j".--- ")(#\k"-.- ")(#\l".-.. ")(#\m"-- ")(#\n"-. ")(#\o"--- ")(#\p".--. ")(#\q"--.- ")(#\r".-. ")(#\s"... ")(#\t"- ")(#\u"..- ")(#\v"...- ")(#\w".-- ")(#\x"-..- ")(#\y"-.-- ")(#\z"--.. ")(#\1".---- ")(#\2"..--- ")(#\3"...-- ")(#\4"....- ")(#\5"..... ")(#\6"-.... ")(#\7"--... ")(#\8"---.. ")(#\9"----. ")(#\0"----- ")(t c)))))

Это кодирует строчные буквы, а последовательности кода Морзе печатаются с завершающим пробелом


3

На Яве 475 символов.

    import java.io.*;class M{public static void main(String[]b){String s,t="-",m=t+t,o=m+t,z="",e=".",i=e+e,p=t+e,a=e+t,n=i+e,c[]={o+m,a+o,i+o,n+m,n+a,n+i,p+n,m+n,o+i,o+p,z,z,z,z,z,z,z,a,t+n,p+p,t+i,e,i+p,m+e,n+e,i,e+o,p+t,a+i,m,p,o,a+p,m+a,e+p,n,t,i+t,n+t,e+m,p+a,p+m,m+i};BufferedReader r=new BufferedReader(new InputStreamReader(System.in));try{s=r.readLine().toUpperCase();for(int j=48;j<91;j++)s=s.replace(z+(char)j,c[j-48]+" ");System.out.println(s);}catch(Exception x){}}}

Переводит az, AZ и 0-9.

Редактировать:

Или из 447 символов, если вы не возражаете, Java выдает ошибку после перевода.

    import java.io.*;class M{static{String s,t="-",m=t+t,o=m+t,z="",e=".",i=e+e,p=t+e,a=e+t,n=i+e,c[]={o+m,a+o,i+o,n+m,n+a,n+i,p+n,m+n,o+i,o+p,z,z,z,z,z,z,z,a,t+n,p+p,t+i,e,i+p,m+e,n+e,i,e+o,p+t,a+i,m,p,o,a+p,m+a,e+p,n,t,i+t,n+t,e+m,p+a,p+m,m+i};BufferedReader r=new BufferedReader(new InputStreamReader(System.in));try{s=r.readLine().toUpperCase();for(int j=48;j<91;j++)s=s.replace(z+(char)j,c[j-48]+" ");System.out.println(s);}catch(Exception x){}}}

3

Perl6 (238)

my%h="A.-B-...C-.-.D-..E.F..-.G--.H....I..J.---K-.-L.-..M--N-.O---P.--.Q--.-R.-.S...T-U..-V...-W.--X-..-Y-.--Z--..0-----1.----2..---3...--4....-5.....6-....7--...8---..9----.".split(/<wb>/)[1..72];while$*IN.getc ->$c{print %h{$c.uc}||$c}

Читаемая версия

# Split string on word breaks to create a hash
# I get an extra token at the beginning and end for some reason
# [1..72] is a slice without the extra pieces
my %h = "A.-B-...C-.-.D-..E.F..-.G--.H....I..J.---K-.-L.-..M--N-.O---P.--.Q--.-R.-.S...T-U..-V...-W.--X-..-Y-.--Z--..0-----1.----2..---3...--4....-5.....6-....7--...8---..9----."
    .split(/<wb>/)[1..72];

# For each character in STDIN, print either the looked up value, or itself
while $*IN.getc -> $c {
    print %h{$c.uc} || $c;
}

«Я получаю дополнительный токен в начале и конце по какой-то причине»: я не знаю Perl 6, но думаю, это потому, что пустая строка совпадает до первой границы слова и после последней.
msh210

2

sed, 159 байт

s/.*/\L&/
s/[02]/&-/g
s/[89]/&./g
:
s/[b-ilnprsz5-9]/&./g
s/[ajkmoqt-y0-4]/&-/g
y/abcdefghijklmnopqrstuvwxyz0123456789/edri umsewnrttmwkai isadkgojuvhhbzoo/
t

Мы начинаем с уменьшения строки целиком (потому что yне можем выполнять преобразования без учета регистра); вычтите 10 байтов, если нам нужно обрабатывать только строчные буквы. Тогда мы препроцессировать цифры 0, 2, 8и 9испускать их окончательные символы.

Цикл генерирует последний символ для каждого входного символа, а затем переводит каждый символ для следующей итерации. Это эквивалентно переходу к дихотомической таблице поиска, показанной в статье Википедии; у цифр, которые нуждались в специальном лечении, можно видеть родителей, которых нет в наших буквенно-цифровых цифрах ASCII.

Цикл завершается, когда все символы достигают завершающего пробела (после 'e' или 't').

Например, письмо kпреобразуется в три прохода:

  1. k=> k-=>n-
  2. n-=> n.-=>t.-
  3. t.-=> t-.-=>-.-

2

Python 3, 99 символов

lambda a:print(*[str(ord('ӆҼzࢤpࢮ࠿yࡊoࡀѡÔÞÝࢭÓӅһѢ'[ord(c)%32])).translate(' -.'*18)for c in a])

Работает в верхнем и нижнем регистре.


2

C 162 160 символов

char M[256] = "_^\\XP@ACGO       &15)\"4+0$>-2'%/6;*(#,8.9=3", v;
main(c) {
  for (;
         c = getchar(), v = M[c + 208 & 255] - 32, ~c;
         putchar(v-1? c : 32))
    for (; v > 1; v /= 2) putchar(".-"[v & 1]);
}

(С не значительным пропущенным пробелом, без новой строки)

char M[256]="_^\\XP@ACGO       &15)\"4+0$>-2'%/6;*(#,8.9=3",v;main(c){for(;c=getchar(),v=M[c+208&255]-32,~c;putchar(v-1?c:32))for(;v>1;v/=2)putchar(".-"[v&1]);}

Mтаблица поиска, где битовые шаблоны символов соответствуют точкам и тире в азбуке Морзе. Символы [0-9A-Z]декодируются на азбуку Морзе с использованием этой таблицы (с пробелом, добавленным после кода Морзе), другие символы просто пропускаются без изменений.

Образец прогона:

HELLO WORLD
.... . .-.. .-.. ---  .-- --- .-. .-.. -.. 
hello world
hello world
ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
.- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----. 

Это не 162 символа ... пожалуйста, отправьте версию для гольфа.
Cyoce

@Cyoce Извините, я не удалял незначительные пробелы, так как это скучный механический процесс и только усложняет чтение исходного кода, что (раньше было?) Довольно стандартная практика в PPCG. Добавлена ​​версия с таким зарезанным для вас пробелом :).
FireFly


1

Perl (489 символов)

%c=("A"=>".-","B"=>"-...","C"=>"-.-.","D"=>"-..","E"=>".","F"=>"..-.","G"=>"--.","H"=>"....","I"=>"..","J"=>".---","K"=>"-.-","L"=>".-..","M"=>"--","N"=>"-.","O"=>"---","P"=>".--.","Q"=>"--.-","R"=>".-.","S"=>"...","T"=>"-","U"=>"..-","V"=>"...-","W"=>".--","X"=>"-..-","Y"=>"-.--","Z"=>"--..",1=>".----",2=>"..---",3=>"...--",4=>"..---",5=>".....",6=>"-....",7=>"--...",8=>"---..",9=>"----.",0=>"-----");while(<>){foreach(split(//)){if(exists($c{$_})){printf"%s ",$c{$_}}else{print"$_"}}}

Может быть выполнен через командную строку, как это.

$ perl -e '$CODE' < textfile

Редактировать: Спасибо @tobyodavies за то, что указал на то, что мое оригинальное решение имеет перевод назад!


1
Вы можете получить это до 286 символов:%c=qw(A .- B -... C -.-. D -.. E . F ..-. G --. H .... I .. J .--- K -.- L .-.. M -- N -. O --- P .--. Q --.- R .-. S ... T - U ..- V ...- W .-- X -..- Y -.-- Z --.. 1 .---- 2 ..--- 3 ...-- 4 ..--- 5 ..... 6 -.... 7 --... 8 ---.. 9 ----. 0 -----);while(<>){print($c{$_}||$_)for split//}
msh210

1

PHP, 474 символа

<?$a=strtoupper(fgets(STDIN));$m=array(65=>".-",66=>"-...",67=>"-.-.",68=>"-..",69=>".",70=>"..-.",71=>"--.",72=>"....",73=>"..",74=>".---",75=>"-.-",76=>".-..",77=>"--",78=>"-.",79=>"---",80=>".--.",81=>"--.-",82=>".-.",83=>"...",84=>"-",85=>"..-",86=>"...-",87=>".--",88=>"-..-",89=>"-.--",90=>"--..",49=>".----",50=>"..---",51=>"...--",52=>"..---",53=>".....",54=>"-....",55=>"--...",56=>"---..",57=>"----.",48=>"-----",32=>" ");while($i++<strlen($a))echo$m[ord($a[$i])];

Его 462 символа, если все входные данные в верхнем регистре:

<?$a=fgets(STDIN);$m=array(65=>".-",66=>"-...",67=>"-.-.",68=>"-..",69=>".",70=>"..-.",71=>"--.",72=>"....",73=>"..",74=>".---",75=>"-.-",76=>".-..",77=>"--",78=>"-.",79=>"---",80=>".--.",81=>"--.-",82=>".-.",83=>"...",84=>"-",85=>"..-",86=>"...-",87=>".--",88=>"-..-",89=>"-.--",90=>"--..",49=>".----",50=>"..---",51=>"...--",52=>"..---",53=>".....",54=>"-....",55=>"--...",56=>"---..",57=>"----.",48=>"-----",32=>" ");while($i++<strlen($a))echo$m[ord($a[$i])];

С некоторыми незначительными уловками, которые можно уменьшить до:<?$a=strtoupper(fgets(STDIN));$m=array(65=>12,2111,2121,211,1,1121,221,1111,11,1222,212,1211,22,21,222,1221,2212,121,111,2,112,1112,122,2112,2122,2211)+array(48=>22222,12222,11222,11122,11222,11111,21111,22111,22211,22221)+array(32=>' ');while($a[$i++])echo strtr($m[ord($a[$i])],12,'.-');
Манатворка

1

05AB1E , 81 байт (не конкурирует)

Çvy©58‹i®58-•6V%·,Õo•2B5ôsè}®64›i®64-•4…·]ÑUZ“×\ó$9™¹“ÌLÈÎ%´•3B4ôsè}"012"".- "‡})

Попробуйте онлайн!

Преобразование буквенных шаблонов в основание-3, числовых шаблонов в основание-2, использование нулевой индексированной транслитерации ascii для перехода к точкам и дефисам. Не работает в нижнем регистре.



1

Powershell, 142 байта

-join($args|% t*y|%{if($_-match'\w'){for($d='ihfbZJKMQY+mazzy+0;?3,>5:.H7<1/9@E42-6B8CG='[$_-48]-42;$d-1){'.-'[$d%2]
$d=$d-shr1}' '}else{$_}})

Менее гольф тестовый скрипт:

$f = {

-join(
    $args|% toCharArray|%{
        if($_-match'\w'){
            for($d='ihfbZJKMQY+mazzy+0;?3,>5:.H7<1/9@E42-6B8CG='[$_-48]-42;$d-1){
                '.-'[$d%2]
                $d=$d-shr1
            }
            ' '
        }else{
            $_
        }
    }
)

}

@(
    ,("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----. ")
    ,("HELLO WORLD", ".... . .-.. .-.. ---  .-- --- .-. .-.. -.. ")
    ,("#$%^&","#$%^&")
) | % {
    $s,$expected = $_
    $result = &$f $s
    "$($result-eq$expected): $result"
}

Выход:

True: .- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----.
True: .... . .-.. .-.. ---  .-- --- .-. .-.. -..
True: #$%^&

Примечание. Выходные данные содержат завершающие пробелы.


1
+mazzy+какая-то дерзкая набивка
Веска

1

APL (NARS), 71 символ, 142 байта

{36≥y←⍵⍳⍨⎕A,⎕D:'•-'[0∼⍨⌽(5⍴3)⊤y⊃∊(2⍴256)∘⊤¨⎕AV⍳'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ᥃䴫쩸穼蚠']⋄⍵}

тест:

  q←{36≥y←⍵⍳⍨⎕A,⎕D:'•-'[0∼⍨⌽(5⍴3)⊤y⊃∊(2⍴256)∘⊤¨⎕AV⍳'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ᥃䴫쩸穼蚠']⋄⍵}
  q¨'0123456789'
----- •---- ••--- •••-- ••••- ••••• -•••• --••• ---•• ----• 
  q¨"HELLO WORLD"
•••• • •-•• •-•• ---   •-- --- •-• •-•• -••  

каждая буква отделяется от одного пробела, каждое слово будет отделяться от 3 пробелов. Таблица построена на буквенно-цифровой строке ⎕A,⎕Dи 16-битных символах, которые 'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ᥃䴫쩸穼蚠'они разбивают на 8-битные символы, каждый из которых преобразуется в основание 3 с обращенными цифрами.


1

05AB1E , 52 байта

Ažh«•1Ju&àøΘn₆δβαLmSÂZΘ=+BD1
 ÷ΓùwÒмVšh•… .-ÅвJ#ðδJ‡

Попробуйте онлайн!

    •1Ju&àøΘn₆δβαLmSÂZΘ=+BD1
    ÷ΓùwÒмVšh•                push compressed number 
              … .-ÅвJ#        convert to custom base " .-"
                      ðδJ     append a space to each morse code
Ažh«                     ‡    transliterate

1

JavaScript (ES6), 184 байта

Для обеих этих версий они будут ставить пробелы между любыми символами. Преобразует 0-9 и az (без учета регистра). Пробел конвертируется в 3.

s=>s.split("").map(e=>isNaN(d=parseInt(e.toLowerCase(),36))?e:`_OGCA@PX\\^\r\n  `.charCodeAt(d).toString(2).substr(1).split("").map(e=>".-"[e]).join("")).join(" ")

Заменить \nсимволом новой строки ( 0x0a). Это не показывает пару непечатных символов из-за SE. Переход в режим редактирования показывает это.

Вот гекс:

73 3d 3e 73 2e 73 70 6c 69 74 28 22 22 29 2e 6d 61 70 28 65 3d 3e 69 73 4e 61 4e 28 64 3d 70 61 72 73 65 49 6e 74 28 65 2e 74 6f 4c 6f 77 65 72 43 61 73 65 28 29 2c 33 36 29 29 3f 65 3a 60 5f 4f 47 43 41 40 50 58 5c 5c 5e 05 18 1a 0c 02 12 0e 10 04 17 5c 72 14 07 06 0f 16 1d 0a 08 03 09 11 0b 19 1b 1c 60 2e 63 68 61 72 43 6f 64 65 41 74 28 64 29 2e 74 6f 53 74 72 69 6e 67 28 32 29 2e 73 75 62 73 74 72 28 31 29 2e 73 70 6c 69 74 28 22 22 29 2e 6d 61 70 28 65 3d 3e 22 2e 2d 22 5b 65 5d 29 2e 6a 6f 69 6e 28 22 22 29 29 2e 6a 6f 69 6e 28 22 20 22 29

Ungolfed

s=>            //declare anonymous function
s.split("")    //split into array of characters
.map(          //for each character
e=>            //declare anonymous function
 isNaN(        //is the character not in range 0-9a-zA-Z
  d=parseInt(e.toLowerCase(),36)
               //take it as base 36(digits are 0-9a-z) and assign to d
 )?e:          //if outside range, return as is
 `_OGCA@PX\\^\r\n  `
               //table of the morse code as binary as code point with leading 1
 .charCodeAt(d)//get the corresponding code
 .toString(2)  //convert to binary, 0=., 1=-, with an extra 1 bit
 .substr(1)    //remove the extra 1 bit
 .split("")    //split into each bit
 .map(         //for each bit
  e=>          //declare anonymous function
  ".-"         //the corresponding symbol for bits
  [e]          //get it
 )
 .join("")     //join the bits
)
.join(" ")     //join the characters with a space between each character

Читаемая версия, 234 байта

s=>s.split("").map(e=>isNaN(d=parseInt(e.toLowerCase(),36))?e:[95,79,71,67,65,64,80,88,92,94,5,24,26,12,2,18,14,16,4,23,13,20,7,6,15,22,29,10,8,3,9,17,11,25,27,28][d].toString(2).substr(1).split("").map(e=>".-"[e]).join("")).join(" ")

Ungolfed

s=>            //declare anonymous function
s.split("")    //split into array of characters
.map(          //for each character
e=>            //declare anonymous function
 isNaN(        //is the character not in range 0-9a-zA-Z
  d=parseInt(e.toLowerCase(),36)
               //take it as base 36(digits are 0-9a-z) and assign to d
 )?e:          //if outside range, return as is
 [95,79,71,67,65,64,80,88,92,94,
   5,24,26,12, 2,18,14,16, 4,23,
  13,20, 7, 6,15,22,29,10, 8, 3,
   9,17,11,25,27,28]
               //table of the morse code as binary with leading 1
 [d]           //get the corresponding code
 .toString(2)  //convert to binary, 0=., 1=-, with an extra 1 bit
 .substr(1)    //remove the extra 1 bit
 .split("")    //split into each bit
 .map(         //for each bit
  e=>          //declare anonymous function
  ".-"         //the corresponding symbol for bits
  [e]          //get it
 )
 .join("")     //join the bits
)
.join(" ")     //join the characters with a space between each character

0

Python 2, 283 274 байта

Я создал строку буквенно-цифровых символов, чтобы их размещение в строке описывало их представление азбукой Морзе. Первоначально я собирался использовать двоичный файл, но 01будет так же, как 1. Так что я использовал троичный с - = 1и . = 2. Таким образом, символ cнаходится в индексе 1121в этой строке, его представление кода Морзе есть --.-.

  • Чтобы сохранить байты, я создал переменные для пробела, тире и точки.
  • Затем я жестко закодировал строку 'decoder', используя пару операторов замены, чтобы уменьшить количество пробелов.
  • Часть функции преобразует индекс в массив троичных цифр
  • Другая функция части берет строку и преобразует каждый символ в азбуку Морзе с 3 пробелами после букв и 7 (4 дополнительных) между словами
q,d,D=" .-"
s=" TE MN AI.OG KD.WR US-.QZ.YC XB- JP  L. F VH---.09  8..7--  6---.1--  2..3  45".replace(D,d*3).replace(d,q*4)
lambda n:''.join(''.join([0,D,d][i]for i in [s.index(c)//3**i%3 for i in range(5)if s.index(c)//3**i!=0][::-1])+q*3 if c!=q else q*4for c in n.upper())

Test Harness

print(f("Hi")=="....   ..   ")
print(f("Hello")=="....   .   .-..   .-..   ---   ")
print(f("Hello World")=="....   .   .-..   .-..   ---       .--   ---   .-.   .-..   -..   ")
print(f("To be or not to be")=="-   ---       -...   .       ---   .-.       -.   ---   -       -   ---       -...   .   ")
print(f("3 14 15")=="...--       .----   ....-       .----   .....   ")

Обновить

  • -9 [16-05-09] Включение троичной вычислительной функции в основную функцию

[ПРИМЕЧАНИЕ: всегда есть конечный пробел, но пробел представляет собой паузу, так что я гость, это нормально ]


0

PHP, 157 150 157 байт

for(;$d=ord($c=$argv[1][$i++]);)echo ctype_alnum($c)?strtr(substr(decbin(ord($d>64?".CTRH@ZF\DUGXABEVOJL?K[ISQP"[$d&31]:"]muy{|ld`^"[$c])-48),1),10,".-"):$c;

принимает входные данные из первого аргумента командной строки. нет паузы между буквами. Беги с -nr.

сломать

for(;$d=ord($c=$argv[1][$i++]);)    # loop through input characters
    echo                                # print ...
    ctype_alnum($c)                     # if char is alphanumeric:
    ?   strtr(
        substr(
        decbin(                         
            ord($d>64                   # 1. map char to char-encoded morse
            ?".CTRH@ZF\DUGXABEVOJL?K[ISQP"[$d&31]
            :"]muy{|ld`^"[$c]
            )-60                        # 2. subtract 60 from ordinal value
        )                               # 3. decbin: convert to base 2
        ,1)                             # 4. substr: skip leading `1`
        ,10,".-")                       # 5. strtr: translate binary digits to dash/dot
    :$c;                                # not alphanumeric: no conversion

Победа над JavaScript, Python2, C, Ruby и sed. Я счастлив.

4-й шаг: отмените сопоставление для обработки строчных символов без использования strtoupper.

предыдущие версии:

ошибка для строчных букв; +12 байт для исправления: заменить $argv[1]на strtoupper($argv[1]).

простой перевод строки, 254 байта

<?=strtr($argv[1],["-----",".----","..---","...--","....-",".....","-....","--...","---..","----.",A=>".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]);

прямо: переводит всю строку сразу, символ в код Морзе.
Сохранить в файл , чтобы выполнить или заменить <?=с echoи работать с -r.

десятичная интерпретация азбуки Морзе, 184 байта (-70)

for(;""<$c=$argv[1][$i++];)echo($m=[32,48,56,60,62,63,47,39,35,33,A=>6,23,21,11,3,29,9,31,7,24,10,27,4,5,8,25,18,13,15,2,14,30,12,22,20,19][$c])?strtr(substr(decbin($m),1),10,".-"):$c;

первый шаг в игре в гольф: азбука Морзе, закодированная в двоичном коде, с дополнительным символом 1сохранения начальных нулей Перебирает символы и переводит их один за другим. Беги с -nr.

десятичные числа, закодированные в символ, 157 байтов (-27)

for(;""<$c=$argv[1][$i++];)echo ctype_alnum($c)?strtr(substr(decbin(ord("@"<$c?"CTRH@ZF\DUGXABEVOJL?K[ISQP"[ord($c)-65]:"]muy{|ld`^"[$c])-60),1),10,".-"):$c;

вторая игра в гольф: добавлено 60 к десятичному значению и закодировано в символ.

объединенное отображение, 150 байт (-7)

for(;""<$c=$argv[1][$i++];)echo ctype_alnum($c)?strtr(substr(decbin(ord("]muy{|ld`^8901234CTRH@ZF\DUGXABEVOJL?K[ISQP"[ord($c)-48])-60),1),10,".-"):$c;

третий гольф: объединение карт для цифр и букв в одну строку.


0

SmileBASIC, 194 190 байтов

INPUT S$WHILE""<S$B=INSTR(" ETIANMSURWDKGOHVFLPJBXCYZQ  54 3   2       16       7   8 90",S$[0])+1IF B THEN S=LOG(B,2)FOR I=0TO S-1?"._"[B-(1<<S)AND S>>I||0];:NEXT?" ";
?SHIFT(S$)*!B;
WEND
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.