Преобразуйте строку в [закрытую] азбуку Морзе

Вы идете об этом наоборот. Люди выбирают проблему/домены приложения, которой они интересуются. Выбор языка следует из того решения и довольно тривиален.

Никто не выбирает язык программирования. Языки программирования собой являются скучными и говорят о них независимо от проблемы/домена приложения, абсурдно.

Лично, я хотел работать в машинном обучении. Как выпускник. студент я работал над анализом представлений графика огромных наборов данных (IMDb, Netflix). Я использовал C++ для большей части своей работы. Я любил бы работать в C# или Java или еще лучше Python, но природа проблемы потребовала, чтобы я использовал C++. В течение 5 лет я влюбился в C++ для золотого баланса, которого он достигает между эффективностью и абстракцией. Я буду использовать C++ каждый раз, когда я вижу потребность в нем. Программисты на C++ являются прагматичными прагматистами, которые не позволят ничему стоять на пути добивания цели. Они не будут цепляться за C++ только для heck его.

57
задан 11 revs, 6 users 76% 16 November 2014 в 21:45
поделиться

32 ответа

C (131 символ)

Да, 13 1 !

main(c){for(;c=c?c:(c=toupper(getch())-32)?
"•ƒŒKa`^ZRBCEIQiw#S#nx(37+$6-2&@/4)'18=,*%.:0;?5"
[c-12]-34:-3;c/=2)putch(c/2?46-c%2:0);}

Я выделил еще несколько символов, объединив логику из while и for превращаются в один цикл for , и путем перемещения объявления переменной c в main определение в качестве входного параметра. Эту последнюю технику я позаимствовал из ответа Strager на другой вызов .


Тем, кто пытается проверить программу с помощью GCC или редакторов только ASCII, вам может понадобиться следующая, немного более длинная версия:

main(c){for(;c=c?c:(c=toupper(getchar())-32)?c<0?1:
"\x95#\x8CKa`^ZRBCEIQiw#S#nx(37+$6-2&@/4)'18=,*%.:0;?5"
[c-12]-34:-3;c/=2)putchar(c/2?46-c%2:32);}

Эта версия на 17 символов длиннее (при сравнительно огромных 148 символах) из-за следующих изменений:

  • +4: getchar () и putchar () вместо непереносимых getch () и putch ()
  • +6: escape-коды для два символа вместо символов, отличных от ASCII
  • +1: 32 вместо 0 для символа пробела
  • +6: добавлено « c <0? 1: » для подавления мусора из символов меньше чем 32 ASCII (а именно, из '\ n' ). Вы по-прежнему будете получать мусор из любого из ! "# $% & '() * + [\] ^ _ ` {|} ~ , или из любого кода выше ASCII 126.

Это должно сделать код полностью переносимым. Компилировать с помощью:

gcc -std=c89 -funsigned-char morse.c

-std = c89 не является обязательным. -funsigned-char является обязательным, хотя, иначе получится мусор для запятой и точки.


135 символов

c;main(){while(c=toupper(getch()))for(c=c-32?
"•ƒŒKa`^ZRBCEIQiw#S#nx(37+$6-2&@/4)'18=,*%.:0;?5"
[c-44]-34:-3;c;c/=2)putch(c/2?46-c%2:0);}

На мой взгляд, эта последняя версия также выглядит намного привлекательнее. И нет, он не переносится и больше не защищен от ввода за пределами допустимого диапазона. У него также довольно плохой пользовательский интерфейс, посимвольный ввод и преобразование его в код Морзе и условие выхода no (необходимо нажать Ctrl + Break ). Но переносимый надежный код с красивым пользовательским интерфейсом не был обязательным требованием.

Ниже приводится краткое объяснение кода:

main(c){
    while(c = toupper(getch())) /* well, *sort of* an exit condition */
        for(c =
            c - 32 ? // effectively: "if not space character"
            "•ƒŒKa`^ZRBCEIQiw#S#nx(37+$6-2&@/4)'18=,*%.:0;?5"[c - 44] - 34
            /* This array contains a binary representation of the Morse Code
             * for all characters between comma (ASCII 44) and capital Z.
             * The values are offset by 34 to make them all representable
             * without escape codes (as long as chars > 127 are allowed).
             * See explanation after code for encoding format.
             */
            : -3; /* if input char is space, c = -3
                   * this is chosen because -3 % 2 = -1 (and 46 - -1 = 47)
                   * and -3 / 2 / 2 = 0 (with integer truncation)
                   */
            c; /* continue loop while c != 0 */
            c /= 2) /* shift down to the next bit */
                putch(c / 2 ? /* this will be 0 if we're down to our guard bit */
                    46 - c % 2 /* We'll end up with 45 (-), 46 (.), or 47 (/).
                                * It's very convenient that the three characters
                                * we need for this exercise are all consecutive.
                                */
                    : 0 /* we're at the guard bit, output blank space */
                );
}

Каждый символ в длинной строке кода содержит закодированный код Морзе для одного текста характер. Каждый бит закодированного символа представляет собой тире или точку. Единица представляет тире, а ноль - точку. Наименьший значащий бит представляет собой первую черту или точку в азбуке Морзе. Последний «защитный» бит определяет длину кода. То есть старший бит в каждом кодированном символе представляет конец кода и не печатается. Без этого защитного бита символы с конечными точками не могут быть напечатаны правильно.

Например, буква «L» в азбуке Морзе означает « .- .. ». Чтобы представить это в двоичном формате, нам нужны 0, 1 и еще два нуля, начиная с младшего бита: 0010. Добавьте еще одну единицу для защитного бита, и мы получим наш закодированный код Морзе: 10010 или десятичный. 18. Добавьте смещение +34, чтобы получить 52, что является значением ASCII символа «4». Таким образом, в кодированном массиве символов 33-й символ (индекс 32) имеет «4».

Этот метод аналогичен тому, который используется для кодирования символов в ACoolie's , strager's (2 ) , Miles's , pingw33n's , Решения Алека и Андреа , но немного проще, требуя только одну операцию на бит (сдвиг / деление), а не две (сдвиг / деление и уменьшение).

РЕДАКТИРОВАТЬ :
Просматривая остальные реализации, я вижу, что Алек и Анон придумали эту схему кодирования - используя защитный бит - раньше меня. Решение Anon особенно интересно, используя функцию Python bin и удаляя префикс «0b» и защитный бит с помощью [3:] , а не зацикливание, движение и смещение, как мы с Алеком.

В качестве бонуса эта версия также обрабатывает дефис ( -....- ), косую черту ( -..-. ]), двоеточие ( ---... ), точка с запятой ( -.-.-. ), равно ( -. ..- ) и у знака (. - .-. ). Пока разрешены 8-битные символы, для поддержки этих символов не требуется дополнительных байтов кода. В этой версии не может поддерживаться больше символов без увеличения длины кода (если нет кодов Морзе для знаков больше / меньше).

Потому что я считаю старые реализации все еще интересными, и в тексте есть некоторые оговорки, применимые к этой версии , Я оставил предыдущее содержание этого поста ниже.


Ладно, по-видимому, пользовательский интерфейс отстой, верно? Итак, заимствовав из strager , я заменил gets () , который обеспечивает буферизованный ввод строки с эхом, на getch () , который обеспечивает небуферизованный и неэхогенный ввод. ввод символов. Это означает, что каждый вводимый вами символ немедленно переводится на экран в код Морзе. Может это круто. Он больше не работает ни с stdin, ни с аргументом командной строки, но чертовски мал.

Я сохранил старый код ниже для справки. Вот новый.

Новый код с проверкой границ, 171 символ:

W(i){i?W(--i/2),putch(46-i%2):0;}c;main(){while(c=toupper(getch())-13)
c=c-19?c>77|c<31?0:W("œ*~*hXPLJIYaeg*****u*.AC5+;79-@6=0/8?F31,2:4BDE"
[c-31]-42):putch(47),putch(0);}

Enter прерывает цикл и выходит из программы.

Новый код без проверки границ, 159 символов:

W(i){i?W(--i/2),putch(46-i%2):0;}c;main(){while(c=toupper(getch())-13)
c=c-19?W("œ*~*hXPLJIYaeg*****u*.AC5+;79-@6=0/8?F31,2:4BDE"[c-31]-42):
putch(47),putch(0);}

Ниже следует старый код 196/177 с некоторыми пояснениями:

W(i){i?W(--i/2),putch(46-i%2):0;}main(){char*p,c,s[99];gets(s);
for(p=s;*p;)c=*p++,c=toupper(c),c=c-32?c>90|c<44?0:W(
"œ*~*hXPLJIYaeg*****u*.AC5+;79-@6=0/8?F31,2:4BDE"[c-44]-42):
putch(47),putch(0);}

Это основано на ответе Андреа на Python с использованием той же техники для генерации кода Морзе, что и в этом ответе. Но вместо того, чтобы сохранять кодируемые символы один за другим и находить их индексы, я сохранял индексы один за другим и просматривал их по символам (аналогично в моем предыдущем ответе ). Это предотвращает появление длинных пробелов в конце, которые вызывали проблемы у более ранних разработчиков.

Как до , я использовал символ, который больше 127. Преобразование его только в ASCII добавляет 3 символа. Первый символ длинной строки необходимо заменить на \ x9C . На этот раз смещение необходимо, иначе большое количество символов меньше 32, и должен быть представлен с escape-кодами.

Также, как и раньше, обработка аргумента командной строки вместо стандартного ввода добавляет 2 символа , а использование реального пробела между кодами добавляет 1 символ.

С другой стороны, некоторые из других подпрограмм здесь не работают с вводом вне допустимого диапазона [, .0-9 \? A-Za- z]. Если бы такую ​​обработку убрали из этой процедуры, то можно было бы удалить 19 символов, в результате общее количество символов упало до 177. Но если это будет сделано и в эту программу будет подан недопустимый ввод, она может вылететь из строя и сгореть.

Код в этом случае может быть:

W(i){i?W(--i/2),putch(46-i%2):0;}main(){char*p,s[99];gets(s);
for(p=s;*p;p++)*p=*p-32?W(
"œ*~*hXPLJIYaeg*****u*.AC5+;79-@6=0/8?F31,2:4BDE"
[toupper(*p)-44]-42):putch(47),putch(0);}
70
ответ дан 24 November 2019 в 19:11
поделиться

C , 448 байт с использованием аргументов cmdline:

char*a[]={".-.-.-","--..--","..--..","/",".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..","-----",".----","..---","...--","....-",".....","-....","--...","---..","----."},*k=".,? ",*s,*p,x;main(int _,char**v){for(;s=*++v;putchar(10))for(;x=*s++;){p=strchr(k,x);printf("%s ",p?a[p-k]:isdigit(x)?a[x-18]:isalpha(x=toupper(x))?a[x-61]:0);}}

C , 416 байт с использованием stdin:

char*a[]={".-.-.-","--..--","..--..","/",".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..","-----",".----","..---","...--","....-",".....","-....","--...","---..","----."},*k=".,? ",*p,x;main(){while((x=toupper(getchar()))-10){p=strchr(k,x);printf("%s ",p?a[p-k]:isdigit(x)?a[x-18]:isalpha(x)?a[x-61]:0);}}
0
ответ дан 24 November 2019 в 19:11
поделиться

C (381 символ)

char*p[36]={".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..","-----",".----","..---","...--","....-",".....","-....","--...","---..","----."};
main(){int c;while((c=tolower(getchar()))!=10)printf("%s ",c==46?".-.-.-":c==44?"--..--":c==63?"..--..":c==32?"/":*(p+(c-97)));}
0
ответ дан 24 November 2019 в 19:11
поделиться

C89 (388 символов)

Это неполный , поскольку он не обрабатывает запятую, точку и запрос пока.

#define P putchar
char q[10],Q,tree[]=
"EISH54V 3UF    2ARL   + WP  J 1TNDB6=X/ KC  Y  MGZ7 Q  O 8  90";s2;e(x){q[Q++]
=x;}p(){for(;Q--;putchar(q[Q]));Q=0;}T(int x,char*t,int s){s2=s/2;return s?*t-x
?t[s2]-x?T(x,++t+s2,--s/2)?e(45):T(x,t,--s/2)?e(46):0:e(45):e(46):0;}main(c){
while((c=getchar())>=0){c-=c<123&&c>96?32:0;if(c==10)P(10);if(c==32)P(47);else
T(c,tree,sizeof(tree)),p();P(' ');}}

Обернут для удобства чтения. Требуются только два разрыва строки (один для #define, один за другим, который может быть пробелом). Я добавил несколько нестандартных символов, но не стал добавлять не 7-битные.

0
ответ дан 24 November 2019 в 19:11
поделиться

C, 533 символа

Я послушался совета некоторых комментариев и переключился на стандартный ввод. Примерно убиты еще 70 символов.

#include <stdio.h>
#include <ctype.h>
char *u[36] = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..","-----",".----","..---","...--","....-",".....","-....","--...","---..","----."};
main(){
char*v;int x;char o;
do{
o = toupper(getc(stdin));v=0;if(o>=65&&o<=90)v=u[o-'A'];if(o>=48&&o<=57)v=u[o-'0'+26];if(o==46)v=".-.-.-";if(o==44)v="--..--";if(o==63)v="..--..";if(o==32)v="/";if(v)printf("%s ", v);} while (o != EOF);
}
0
ответ дан 24 November 2019 в 19:11
поделиться

Использование шрифта кода Морзе ?

Console.Write(params[0]);
48
ответ дан 24 November 2019 в 19:11
поделиться

Python 2; 171 символ

В основном то же самое, что решение Андреа , но как полная программа, и с использованием глупых уловок, чтобы сделать ее короче.

for c in raw_input().lower():print"".join(".-"[int(d)]for d in bin(
('  etianmsurwdkgohvf_l_pjbxcyzq__54_3___2%7s16%7s7___8_90%12s?%8s.%29s,'
%(('',)*5)).find(c))[3:])or'/',

(все добавленные символы новой строки могут быть удалены)

Или, если вы предпочитаете не использовать функцию bin () в 2.6, мы можем сделать это в 176:

for c in raw_input():C=lambda q:q>0and C(~-q/2)+'-.'[q%2]or'';print C(
(' etianmsurwdkgohvf_l_pjbxcyzq__54_3___2%7s16%7s7___8_90%12s?%8s.%29s,'%
(('',)*5)).find(c.lower()))or'/',

(опять же, все добавленные символы новой строки могут быть удалены)

2
ответ дан 24 November 2019 в 19:11
поделиться

C89 (293 символа)

На основе некоторых других ответов.

РЕДАКТИРОВАТЬ: Уменьшить дерево (ура).

#define P putchar
char t['~']="~ETIANMSURWDKGOHVF~L~PJBXCYZQ~~54~3",o,q[9],Q=10;main(c){for(;Q;)t[
"&./7;=>KTr"[--Q]]="2167890?.,"[Q];while((c=getchar())>=0){c-=c<'{'&c>96?32:0;c-
10?c-32?0:P(47):P(10);for(o=1;o<'~';++o)if(t[o]==c){for(;o;o/=2)q[Q++]=45+(o--&1
);for(;Q;P(q[--Q]));break;}P(32);}}
1
ответ дан 24 November 2019 в 19:11
поделиться

Понимание списка Python, 159-символьный однострочный

for c in raw_input().upper():print c<","and"/"or bin(ord("•ƒwTaQIECBRZ^`šŒ#S#n|':<.$402&9/6)(18?,*%+3-;=>"[ord(c)-44])-34)[3:].translate(" "*47+"/.-"+" "*206),

Использует упаковку данных, аналогичную реализации P Daddy на C , но не сохраняет биты в обратном порядке и использует bin () для извлечения данных, а не арифметические операции. Также обратите внимание, что пробелы обнаруживаются с использованием неравенства; он считает каждый символ «меньше запятой» как пробел.

Python для цикла , 205 символов, включая символы новой строки

for a in raw_input().upper():
 q='_ETIANMSURWDKGOHVF_L_PJBXCYZQ__54_3___2__+____16=/_____7___8_90'.find(a);s=''
 while q>0:s='-.'[q%2]+s;q=~-q/2
 print['/','--..--','..--..','.-.-.-',''][' ,?.'.find(a)]+s,
16
ответ дан 24 November 2019 в 19:11
поделиться

Я возился с компактным кодированием для символов, но я не вижу, есть ли что-нибудь лучше, чем уже используемые неявные деревья, поэтому я представляю код здесь на случай, если кто-то еще сможет его использовать.

Рассмотрим строку:

 --..--..-.-.-..--...----.....-----.--/

, которая содержит все необходимые последовательности как подстроки. Мы могли закодировать символы по смещению и длине следующим образом:

       ET  RRRIIGGGJJJJ    
--..--..-.-.-..--...----.....-----.--/
          CCCC  DD WWW       00000
,,,,,,   AALLLL BBBB        11111
--..--..-.-.-..--...----.....-----.--/
  ??????  KKK  MMSSS       22222   
        FFFF  PPPP        33333
--..--..-.-.-..--...----.....-----.--/
        UUU XXXX         44444       
          NN  PPPP  OOO 55555
--..--..-.-.-..--...----.....-----.--/
               ZZZZ    66666
                      77777      YYYY
--..--..-.-.-..--...----.....-----.--/
       ......        88888 HHHH
                    99999 VVVV  QQQQ
--..--..-.-.-..--...----.....-----.--/

с пробелом (то есть границей слова), начинающимся и заканчивающимся на последнем символе ('/'). Не стесняйтесь использовать его, если видите хороший способ.

Большинство более коротких символов, конечно, имеют несколько возможных кодировок.


P Папа нашел более короткую версию этого трюка (и теперь я могу видеть по крайней мере, некоторая избыточность здесь) и сделал хорошую реализацию c. Алек выполнил реализацию Python с первой версией (с ошибками и неполной).

7
ответ дан 24 November 2019 в 19:11
поделиться

Python

Неполное решение, но, возможно, кто-то сможет сделать из него полное решение . Не обрабатывает цифры или знаки препинания, но занимает всего 154 символа.

def e(l):
 i='_etianmsurwdkgohvf_l_pjbxcyzq'.find(l.lower());v=''
 while i>0:v='-.'[i%2]+v;i=(i-1)/2;return v or '/'
def enc(s):return ' '.join(map(e,s))
4
ответ дан 24 November 2019 в 19:11
поделиться

C (248 символов)

Другое решение на основе дерева.

#define O putchar
char z[99],*t=
" ETINAMSDRGUKWOHBL~FCPJVX~YZQ~~54~3~~~2~~+~~~~16=/~~.~~7,~~8~90";c,p,i=0;
main(){gets(z);while(c=z[i++]){c-46?c-44?c:O(45):O(c);c=c>96?c-32:c;p=-1;
while(t[++p]!=c);for(;p;p/=2){O(45+p--%2);}c-32?O(32):(O(47),O(c));}}

Могут быть ошибки в дереве исходных текстов, потому что wikipedia , похоже, ошибается, или, может быть, я неправильно понял что-то.

3
ответ дан 24 November 2019 в 19:11
поделиться

Perl, 170 символов (с небольшая помощь от опытного гольфиста мауке ). Для наглядности завернут; все символы новой строки удаляются.

$_=uc<>;y,. ,|/,;s/./$& /g;@m{A..Z,0..9,qw(| , ?)}=
".-NINNN..]IN-NII..AMN-AI---.M-ANMAA.I.-].AIAA-NANMMIOMAOUMSMSAH.B.MSOIONARZMIZ"
=~/../g;1while s![]\w|,?]!$m{$&}!;print

Пояснение:

  1. Извлечь словарь Морзе. Каждый символ определяется в виде двух символов, которые могут быть буквальными точками или дефисами, или ссылкой на значение другого определенного символа. E и T содержат фиктивные символы, чтобы избежать рассинхронизации декодера; мы удалим их позже.
  2. Прочтите и отформатируйте ввод. «Привет, мир» становится «ПРИВЕТ / МИР D»
  3. Следующий шаг зависит от того, какие словари ввода и вывода различаются, поэтому замените точки во вводе на неиспользуемые символы (вертикальная черта, | )
  4. Замените любой символ во входных данных, который встречается в словаре Морзе, на его значение в словаре, пока не произойдет замена.
  5. Удалите фиктивный символ, упомянутый в шаге 1.
  6. Распечатайте результат.

В окончательной версии словарь оптимизирован для повышения эффективности выполнения:

  • Все односимвольные символы (E и T) и двухсимвольные символы (A, I, M и N) определены напрямую и декодировать за один проход.
  • Все трехсимвольные символы определены в терминах двухсимвольного символа и буквального символа, декодируемого за два прохода.
  • Все четырехсимвольные символы определены в терминах двух двухсимвольных символов, декодируемых за два проходит с тремя заменами.
  • Пяти- и шестизначные символы (числа и знаки препинания) декодируются за три прохода с четырьмя или пятью заменами соответственно.

Так как код игры заменяет только один символ в цикле (чтобы сэкономить один символ кода!) количество циклов ограничено пятикратной длиной ввода (трехкратной длиной ввода, если используются только буквы). Но при добавлении g к операции s /// количество циклов ограничивается тремя (двумя, если используется только алфавит).

Пример преобразования:

Hello 123
H E L L O / 1 2 3
II .] AI AI M- / AO UM SM
.... . .-.. .-.. --- / .-M- .A-- I.--
.... . .-.. .-.. --- / .---- ..--- ...--
23
ответ дан 24 November 2019 в 19:11
поделиться

Вот мой вклад в качестве консольного приложения в VB.Net

Module MorseCodeConverter

    Dim M() As String = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----."}

    Sub Main()
        Dim I, O
        Dim a, b

        While True
            I = Console.ReadLine()
            O = ""

            For Each a In I
                b = AscW(UCase(a))
                If b > 64 And b < 91 Then
                    O &= M(b - 65) & " "
                ElseIf b > 47 And b < 58 Then
                    O &= M(b - 22) & " "
                ElseIf b = 46 Then
                    O &= ".-.-.- "
                ElseIf b = 44 Then
                    O &= "--..-- "
                ElseIf b = 63 Then
                    O &= "..--.. "
                Else
                    O &= "/"
                End If

            Next

            Console.WriteLine(O)
        End While


    End Sub

End Module

. Я оставил пустое пространство, чтобы его можно было читать. Всего 1100 знаков. Он будет читать ввод из командной строки по одной строке за раз и отправлять соответствующий вывод обратно в выходной поток. Ниже приведена сжатая версия, содержащая всего 632 символа.

Module Q
    Dim M() As String={".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..","-----",".----","..---","...--","....-",".....","-....","--...","---..","----."}
    Sub Main()
        Dim I,O,a,b:While 1:I=Console.ReadLine():O="":For Each a In I:b=AscW(UCase(a)):If b>64 And b<91 Then:O &=M(b-65)&" ":ElseIf b>47 And b<58 Then:O &=M(b-22)&" ":ElseIf b=46 Then:O &=".-.-.- ":ElseIf b=44 Then:O &="--..-- ":ElseIf b=63 Then:O &= "..--.. ":Else:O &="/":End IF:Next:Console.WriteLine(O):End While
    End Sub
End Module
3
ответ дан 24 November 2019 в 19:11
поделиться

Вот третий, совершенно другой способ кодирования кода Морзе:

Python

232 символа

def d(c):
 o='';b=ord("Y_j_?><80 !#'/_____f_\x06\x11\x15\x05\x02\x15\t\x1c\x06\x1e\r\x12\x07\x05\x0f\x16\x1b\n\x08\x03\r\x18\x0e\x19\x01\x13"[ord(c.upper())-44])
 while b!=1:o+='.-'[b&1];b/=2
 return o
e=lambda s:' '.join(map(d,s))

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

Хорошо, теперь я потратил на это way слишком много времени.

1
ответ дан 24 November 2019 в 19:11
поделиться

Haskell

type MorseCode = String

program :: String
program = "__5__4H___3VS__F___2 UI__L__+_ R__P___1JWAE"
     ++ "__6__=B__/_XD__C__YKN__7_Z__QG__8_ __9__0 OMT "

decode :: MorseCode -> String
decode = interpret program
    where
    interpret         = head . foldl exec []
    exec xs       '_' = undefined : xs
    exec (x:y:xs)  c  = branch    : xs
        where
        branch (' ':ds) = c : decode ds
        branch ('-':ds) = x ds
        branch ('.':ds) = y ds
        branch []       = [c]

Например, decode "- --- .-. .... -.-. --- - ..." возвращает «КОД Морзе» .

Эта программа взята из прекрасной статьи Развлечения с азбукой Морзе .

1
ответ дан 24 November 2019 в 19:11
поделиться

Вот еще один подход, основанный на работе dmckee, демонстрирующий, насколько читабелен Python:

Python

244 символа

def h(l):p=2*ord(l.upper())-88;a,n=map(ord,"AF__GF__]E\\E[EZEYEXEWEVEUETE__________CF__IBPDJDPBGAHDPC[DNBSDJCKDOBJBTCND`DKCQCHAHCZDSCLD??OD"[p:p+2]);return "--..--..-.-.-..--...----.....-----.-"[a-64:a+n-128]
def e(s):return ' '.join(map(h,s))

Ограничения:

  • В строке dmckee отсутствует буква «Y» персонаж, и мне было лень его добавить. Я думаю, вам просто нужно изменить "??" часть и добавьте «-» в конце второго строкового литерала
  • , он не помещает «/» между словами; опять же, ленивый

Поскольку правила требовали наименьшего количества символов , а не наименьшего байтов , вы могли бы уменьшить хотя бы одну из моих таблиц поиска (вдвое), если бы вы были готовы выходите за пределы печатаемых символов ASCII.

РЕДАКТИРОВАТЬ: Если я использую наивно выбранные символы Unicode, но просто сохраняю их в экранированном ASCII в исходном файле, он все еще становится немного короче, потому что декодер проще:

Python

240 символов

def h(l):a,n=divmod(ord(u'\x06_7_\xd0\xc9\xc2\xbb\xb4\xad\xa6\x9f\x98\x91_____\x14_AtJr2<s\xc1d\x89IQdH\x8ff\xe4Pz9;\xba\x88X_f'[ord(l.upper())-44]),7);return "--..--..-.-.-..--...----.....-----.-"[a:a+n]
def e(s):return ' '.join(map(h,s))

Я думаю, что это также делает цель программы намного более ясной.

Если вы сохранили это как UTF-8, я полагаю, что программа будет сокращена до 185 символов, что сделает ее самым коротким полным решением Python, уступающим только Perl. : -)

1
ответ дан 24 November 2019 в 19:11
поделиться

C # Использование Linq (133 символа)

    static void Main()
    {
        Console.WriteLine(String.Join(" ", (from c in Console.ReadLine().ToUpper().ToCharArray()
                                            select m[c]).ToArray()));
    }

Хорошо, я обманул. Вам также необходимо определить словарь следующим образом (не заморачиваться с подсчетом символов, поскольку это выбивает меня из игры):

    static Dictionary<char, string> m = new Dictionary<char, string>() {
            {'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', "----."},
            {' ', "/"},
            {'.', ".-.-.-"},
            {',', "--..--"},
            {'?', "..--.."},
        };

Тем не менее, может ли кто-нибудь предоставить более лаконичную реализацию C #, которую также легко понять и поддерживать как это?

2
ответ дан 24 November 2019 в 19:11
поделиться

C, 338 символов

338 с удаленными отступами и всеми съемными переносами строк:

#define O putchar
#define W while
char*l="x@@@@@ppmmmmm@@FBdYcbcbSd[Kcd`\31(\b1g_<qCN:_'|\25D$W[QH0";
int c,b,o;
main(){
  W(1){
    W(c<32)
      c=getchar()&127;
    W(c>96)
      c^=32;
    c-=32;
    o=l[c/2]-64;
    b=203+(c&1?o>>3:0);
    o=c&1?o&7:o>>3;
    W(o>6)
      O(47),o=0;
    c/=2;
    W(c--)
      b+=(l[c]-64&7)+(l[c]-64>>3);
    b=(((l[b/7]<<7)+l[b/7+1])<<(b%7))>>14-o;
    W(o--)
      O(b&(1<<o)?46:45);
    O(32);
  }
}

Это не основано на древовидном подходе, который использовали другие люди. Вместо этого l сначала кодирует длины всех байтов от 32 до 95 включительно, по два байта на символ. Например, D равно - .. для длины 3, а E равно. для длины 1. Это кодируется как 011 и 001, что дает 011001. Чтобы сделать больше символов кодируемыми и избежать экранирования, затем к общему количеству добавляется 64, что дает 1011001 - 89, ASCII Y. Неморзским символам присваивается длина из 0. Вторая половина l (начиная с \ 031 ) - это биты самого кода Морзе, точка - 1, а тире - 0. Чтобы избежать высоких значений ASCII, эти данные кодируются 7 бит на байт.

Код сначала очищает c ,

2
ответ дан 24 November 2019 в 19:11
поделиться

Python (210 символов)

Это полное решение, основанное на Алека

def e(l):
 i=(' etianmsurwdkgohvf_l_pjbxcyzq__54_3___2%7s16%7s7___8_90%12s?%8s.%29s,'%tuple('_'*5)).find(l.lower());v=''
 while i>0:v='-.'[i%2]+v;i=(i-1)/2
 return v or '/'
def enc(s):return ' '.join(map(e,s))
2
ответ дан 24 November 2019 в 19:11
поделиться

Python 3 One Liner: 172 characters

print(' '.join('/'if c==' 'else''.join('.'if x=='0'else'-'for x in bin(ord("ijÁĕÁÿïçãáàðøüþÁÁÁÁÁČÁÅ×ÚÌÂÒÎÐÄ×ÍÔÇÆÏÖÝÊÈÃÉÑËÙÛÜ"[ord(c)-44])-192)[3:])for c in input().upper()))

(Encoding the tranlation table into unicode code points. Works fine, and they display here fine in my test on my Windows Vista machine.)

Edited to pare down to 184 characters by removing some unnecessary spaces and brackets (making list comps gen exps).

Edit again: More spaces removed that I didn't even know was possible before seeing other answers here - so down to 176.

Edit again down to 172 (woo woo!) by using ' '.join instead of ''.join and doing the spaces separately. (duh!)

5
ответ дан 24 November 2019 в 19:11
поделиться

F #, 256 символов

let rec D i=if i=16 then" "else
 let x=int"U*:+F8c]uWjGbJ0-0Dnmd0BiC5?\4o`h7f>9[1E=pr_".[i]-32
 if x>43 then"-"+D(x-43)else"."+D x
let M(s:string)=s.ToUpper()|>Seq.fold(fun s c->s+match c with
|' '->"/ "|','->"--..-- "|'.'->".-.-.- "|_->D(int c-48))""

Например,

M("Hello, Stack.") |> printfn "%s"

дает

.... . .-.. .-.. --- --..-- / ... - .- -.-. -.- .-.-.-

Я думаю, что пока моя техника может быть уникальной. Идея такова:

  • существует диапазон символов ascii, который охватывает большую часть того, что мы хотим (0..Z)
  • в этом диапазоне всего 43 символа
  • , поэтому мы можем кодировать один бит (тире или точка) плюс «следующий символ» в диапазоне 86 символов
  • диапазон ascii (32-117) полностью «печатается» и может служить этим диапазоном из 86 символов
  • , поэтому строковый литерал кодирует таблицу вдоль те строки

Это немного больше, но в этом суть. Запятая, точка и пробел не находятся в диапазоне 0..Z, поэтому они специально обрабатываются функцией match. Некоторые «неиспользуемые» символы в диапазоне 0..Z (например, «;») используются в таблице в качестве суффиксов других переводов Морзе, которые сами по себе не являются «буквами Морзе».

3
ответ дан 24 November 2019 в 19:11
поделиться

C (233 символа)

W(n,p){while(n--)putch(".-.-.--.--..--..-.....-----..../"[p++]);}main(){
char*p,c,s[99];gets(s);for(p=s;*p;){c=*p++;c=toupper(c);c=c>90?35:c-32?
"È#À#¶µ´³²±°¹¸·#####Ê#@i Že‘J•aEAv„…`q!j“d‰ƒˆ"[c-44]:63;c-35?
W(c>>5,c&31):0;putch(0);}}

Принимает ввод со стандартного ввода. При вводе из командной строки добавляются 2 символа. Вместо:

...main(){char*p,c,s[99];gets(s);for(p=s;...

вы получите:

...main(int i,char**s){char*p,c;for(p=s[1];...

Я использую кодовую страницу Windows-1252 для символов выше 127, и я не уверен, как они будут отображаться в браузерах других людей. Я заметил, что, по крайней мере, в моем браузере (Google Chrome) два символа (между «@» и «i») не отображаются. Однако, если вы скопируете из браузера и вставите в текстовый редактор, они появятся, хотя и в виде маленьких прямоугольников.

Его можно преобразовать в формат только ASCII, но это добавляет 24 символа, увеличивая количество символов до 257 Для этого я сначала смещаю каждый символ в строке на -64, минимизируя количество символов, превышающих 127. Затем я заменяю символы \ x XX , где это необходимо. Он изменяет это:

...c>90?35:c-32?"È#À#¶µ´³²±°¹¸·#####Ê#@i Že‘J•aEAv„…`q!j“d‰ƒˆ"[c-44]:63;
c-35?W(...

на это:

...c>90?99:c-32?"\x88#\x80#vutsrqpyxw#####\x8A#\0PA)\xE0N%Q\nU!O\5\1\66DE 1
\xE1*S$ICH"[c-44]+64:63;c-99?W(...

Вот более красиво отформатированная и прокомментированная версия кода:

/* writes `n` characters from internal string to stdout, starting with
 * index `p` */
W(n,p){
    while(n--)
        /* warning for using putch without declaring it */
        putch(".-.-.--.--..--..-.....-----..../"[p++]);

        /* dmckee noticed (http://tinyurl.com/n4eart) the overlap of the
         * various morse codes and created a 37-character-length string that
         * contained the morse code for every required character (except for
         * space).  You just have to know the start index and length of each
         * one.  With the same idea, I came up with this 32-character-length
         * string.  This not only saves 5 characters here, but means that I
         * can encode the start indexes with only 5 bits below.
         *
         * The start and length of each character are as follows:
         *
         *   A:  0,2    K:  1,3    U: 10,3    4: 18,5
         *   B: 16,4    L: 15,4    V: 19,4    5: 17,5
         *   C:  1,4    M:  5,2    W:  4,3    6: 16,5
         *   D:  9,3    N:  1,2    X:  9,4    7: 25,5
         *   E:  0,1    O: 22,3    Y:  3,4    8: 24,5
         *   F: 14,4    P:  4,4    Z:  8,4    9: 23,5
         *   G:  5,3    Q:  5,4    0: 22,5    .:  0,6
         *   H: 17,4    R:  0,3    1: 21,5    ,:  8,6
         *   I: 20,2    S: 17,3    2: 20,5    ?: 10,6
         *   J: 21,4    T:  1,1    3: 19,5
         */
}

main(){ /* yuck, but it compiles and runs */
    char *p, c, s[99];
    /* p is a pointer within the input string */
    /* c saves from having to do `*p` all the time */
    /* s is the buffer for the input string */

    gets(s); /* warning for use without declaring */

    for(p=s; *p;){ /* begin with start of input, go till null character */
        c = *p++; /* grab *p into c, increment p.
                   * incrementing p here instead of in the for loop saves
                   * one character */

        c=toupper(c); /* warning for use without declaring */

        c = c > 90 ? 35 : c - 32 ?
            "È#À#¶µ´³²±°¹¸·#####Ê#@i Že‘J•aEAv„…`q!j“d‰ƒˆ"[c - 44] : 63;

        /**** OR, for the ASCII version ****/

        c = c > 90 ? 99 : c - 32 ?
           "\x88#\x80#vutsrqpyxw#####\x8A#\0PA)\xE0N%Q\nU!O\5\1\66DE 1\xE1"
           "*S$ICH"[c - 44] + 64 : 63;

        /* Here's where it gets hairy.
         *
         * What I've done is encode the (start,length) values listed in the
         * comment in the W function into one byte per character.  The start
         * index is encoded in the low 5 bits, and the length is encoded in
         * the high 3 bits, so encoded_char = (char)(length << 5 | position).
         * For the longer, ASCII-only version, 64 is subtracted from the
         * encoded byte to reduce the necessity of costly \xXX representations.
         * 
         * The character array includes encoded bytes covering the entire range
         * of characters covered by the challenge, except for the space
         * character, which is checked for separately.  The covered range
         * starts with comma, and ends with capital Z (the call to `toupper`
         * above handles lowercase letters).  Any characters not supported are
         * represented by the "#" character, which is otherwise unused and is
         * explicitly checked for later.  Additionally, an explicit check is
         * done here for any character above 'Z', which is changed to the
         * equivalent of a "#" character.
         * 
         * The encoded byte is retrieved from this array using the value of
         * the current character minus 44 (since the first supported character
         * is ASCII 44 and index 0 in the array).  Finally, for the ASCII-only
         * version, the offset of 64 is added back in.
         */

        c - 35 ? W(c >> 5, c & 31) : 0;

        /**** OR, for the ASCII version ****/

        c - 99 ? W(c >> 5, c & 31) : 0;

        /* Here's that explicit check for the "#" character, which, as
         * mentioned above, is for characters which will be ignored, because
         * they aren't supported.  If c is 35 (or 99 for the ASCII version),
         * then the expression before the ? evaluates to 0, or false, so the
         * expression after the : is evaluated.  Otherwise, the expression
         * before the ? is non-zero, thus true, so the expression before
         * the : is evaluated.
         *
         * This is equivalent to:
         *
         *     if(c != 35) // or 99, for the ASCII version
         *         W(c >> 5, c & 31);
         *
         * but is shorter by 2 characters.
         */

        putch(0);
        /* This will output to the screen a blank space.  Technically, it's not
         * the same as a space character, but it looks like one, so I think I
         * can get away with it.  If a real space character is desired, this
         * must be changed to `putch(32);`, which adds one character to the
         * overall length.
    } /* end for loop, continue with the rest of the input string */
} /* end main */

Это превосходит все здесь, за исключением пары реализаций Python. Я все думаю, что короче не может быть, но потом я нахожу способ избавиться от еще нескольких персонажей. Если кто-нибудь сможет найти еще возможности для улучшения, дайте мне знать.

EDIT:

Я заметил, что, хотя эта процедура отклоняет любые недопустимые символы выше ASCII 44 (выводит только пустое пространство для каждого из них), это не так. t проверьте наличие недопустимых символов ниже этого значения. Чтобы проверить это, к общей длине добавляется 5 символов, изменяя это:

...c>90?35:c-32?"...

на это:

...c-32?c>90|c<44?35:"...
3
ответ дан 24 November 2019 в 19:11
поделиться

Вы можете избежать копирования, если каждый уровень запрашивает пустой буфер у следующего нижнего уровня, а не выделяет его сам:

  • Уровень приложения запрашивает буфер используя идею dmckee

    Это длиннее, чем первая, которую я представил, но я все же думаю интересной . И / или ужасно. Я еще не уверен. Здесь используется идея кодирования dmckee, а также пара других хороших идей, которые я видел. Сначала я думал, что «длина / смещение в фиксированной строке» не может дать меньше данных, чем схема в другом моем решении, которое использует фиксированные два байта на символ (и все байты для печати). На самом деле мне удалось сократить объем данных до значительно меньшего размера (один байт на символ плюс четыре байта для хранения 26-битного шаблона, который мы индексируем), но код для его повторного вывода длиннее, несмотря на все мои усилия. играть в гольф. (Менее сложно, ИМО, но все равно длиннее.)

    Так или иначе, 206 символов; новые строки можно удалить, кроме первого.

    #!perl -lp
    ($a,@b)=unpack"b32C*",
    "\264\202\317\0\31SF1\2I.T\33N/G\27\308XE0=\x002V7HMRfermlkjihgx\207\205";
    $a=~y/01/-./;@m{A..Z,0..9,qw(. , ?)}=map{substr$a,$_%23,1+$_/23}@b;
    $_=join' ',map$m{uc$_}||"/",/./g
    

    Пояснение:

    • Данные состоят из двух частей. Первые четыре байта ( "\ 264 \ 202 \ 317 \ 0" ) представляют 32 бита кода Морзе ( "--.-..-.-.----- .. ... - ..-------- "), хотя используются только первые 26 бит. Это «ссылочная строка».
    • В оставшейся части строки данных хранится начальная позиция и длина подстрок ссылочной строки, которые представляют каждый символ - по одному байту на символ в порядке (A, B, .. .Z, 0, 1, ... 9, ".", ",", "?"). Значения кодируются как 23 * (длина - 1) + pos, и декодер меняет это значение на обратное. Последняя начальная позиция, конечно же, 22.
    • Итак, распаковка выполняет половину работы по извлечению данных, а третья строка (как показано здесь) делает все остальное, теперь у нас есть хэш с $ m {'a '} =' .- ' и так далее, так что все, что осталось, - это сопоставить символы ввода, найти их в хэше и отформатировать вывод, что и делает последняя строка ... с некоторой помощью shebang, который сообщает perl об удалении новой строки на вводе, поместите строки ввода в $ _ , и когда код завершит выполнение, напишите $ _ обратно в вывод, снова добавив новые строки.
2
ответ дан 24 November 2019 в 19:11
поделиться

PHP

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

$a=array(32=>"/",44=>"--..--",1,".-.-.-",48=>"-----",".----","..---","...--","....-",".....","-....","--...","---..","----.",63=>"..--..",1,".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..");
foreach(str_split(strtoupper("hello world?"))as$k=>$v){echo $a[ord($v)]." ";}

Komodo говорит, что 380 символов в 2 строках - дополнительная строка предназначена только для удобства чтения. ; D Перемежающиеся единицы в массиве предназначены просто для экономии 2 байтов, заполняя эту позицию массива данными вместо того, чтобы вручную переходить к позиции массива после этого.

Рассмотрим первое и второе. Разница хорошо видна. :)

array(20=>"data",22=>"more data";
array(20=>"data",1,"more data";

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

Конечный результат: 578 символов, вплоть до 380 (198 символов, или ~ 34,26% экономии).

1
ответ дан 24 November 2019 в 19:11
поделиться

C # 266 символов

Решение 131 символа C, переведенное на C #, дает 266 символов:

foreach(var i in Encoding.ASCII.GetBytes(args[0].ToUpper())){var c=(int)i;for(c=(c-32!=0)?Encoding.ASCII.GetBytes("•ƒŒKa`^ZRBCEIQiw#S#nx(37+$6-2&@/4)'18=,*%.:0;?5")[c-44]-34:-3;c!=0;c/=2)Console.Write(Encoding.ASCII.GetChars(new byte[]{(byte)((c/2!=0)?46-c%2:0)}));}

, что более читается как:

foreach (var i in Encoding.ASCII.GetBytes(args[0].ToUpper()))
{
    var c = (int)i;
    for (c = ((c - 32) != 0) ? Encoding.ASCII.GetBytes("•ƒŒKa`^ZRBCEIQiw#S#nx(37+$6-2&@/4)'18=,*%.:0;?5")[c - 44] - 34 : -3
        ; c != 0
        ; c /= 2)
        Console.Write(Encoding.ASCII.GetChars(new byte[] { (byte)((c / 2 != 0) ? 46 - c % 2 : 0) }));
}
5
ответ дан 24 November 2019 в 19:11
поделиться

Golfscript - 106 символов - БЕЗ ВЕСЕЛЫХ СИМВОЛОВ :)

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

echo -n Здравствуйте, Stackoverflow | ../golfscript.rb morse.gs

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

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

5
ответ дан 24 November 2019 в 19:11
поделиться

REBOL (118 символов)

Примерно Реализация 10-летней давности

foreach c ask""[l: index? find" etinamsdrgukwohblzfcpövxäqüyj"c while[l >= 2][prin pick"-."odd? l l: l / 2]prin" "]

Цитируется по: http://www.rebol.com/oneliners.html

(цифры отсутствуют, а слова просто разделяются двойными пробелами: / ...)

3
ответ дан 24 November 2019 в 19:11
поделиться

Bash, скрипт, который я написал некоторое время назад (по временной метке - в прошлом году), весом в 1661 символ. Просто для развлечения :)

#!/bin/sh
txt=''
res=''
if [ "$1" == '' ]; then
    read -se txt
else
    txt="$1"
fi;
len=$(echo "$txt" | wc -c)
k=1
while [ "$k" -lt "$len" ]; do
    case "$(expr substr "$txt" $k 1 | tr '[:upper:]' '[:lower:]')" in
        'e')    res="$res"'.' ;;
        't')    res="$res"'-' ;;
        'i')    res="$res"'..' ;;
        'a')    res="$res"'.-' ;;
        'n')    res="$res"'-.' ;;
        'm')    res="$res"'--' ;;
        's')    res="$res"'...' ;;
        'u')    res="$res"'..-' ;;
        'r')    res="$res"'.-.' ;;
        'w')    res="$res"'.--' ;;
        'd')    res="$res"'-..' ;;
        'k')    res="$res"'-.-' ;;
        'g')    res="$res"'--.' ;;
        'o')    res="$res"'---' ;;
        'h')    res="$res"'....' ;;
        'v')    res="$res"'...-' ;;
        'f')    res="$res"'..-.' ;;
        'l')    res="$res"'.-..' ;;
        'p')    res="$res"'.--.' ;;
        'j')    res="$res"'.---' ;;
        'b')    res="$res"'-...' ;;
        'x')    res="$res"'-..-' ;;
        'c')    res="$res"'-.-.' ;;
        'y')    res="$res"'-.--' ;;
        'z')    res="$res"'--..' ;;
        'q')    res="$res"'--.-' ;;
        '5')    res="$res"'.....' ;;
        '4')    res="$res"'....-' ;;
        '3')    res="$res"'...--' ;;
        '2')    res="$res"'..---' ;;
        '1')    res="$res"'.----' ;;
        '6')    res="$res"'-....' ;;
        '7')    res="$res"'--...' ;;
        '8')    res="$res"'---..' ;;
        '9')    res="$res"'----.' ;;
        '0')    res="$res"'-----' ;;
    esac;
    [ ! "$(expr substr "$txt" $k 1)" == " " ] && [ ! "$(expr substr "$txt" $(($k+1)) 1)" == ' ' ] && res="$res"' '
    k=$(($k+1))
done;
echo "$res"
1
ответ дан 24 November 2019 в 19:11
поделиться

J, 124 130 134 символов

'.- /'{~;2,~&.>(]`(<&3:)@.(a:=])"0)}.&,&#:&.></.40-~a.i.')}ggWOKIHX`dfggggggg-@B4*:68,?5</.7>E20+193ACD'{~0>.45-~a.i.toupper

J лучше C! Потрясающие!

Использование:

   '.- /'{~;2,~&.>(]`(<&3:)@.(a:=])"0)}.&,&#:&.></.40-~a.i.')}ggWOKIHX`dfggggggg-@B4*:68,?5</.7>E20+193ACD'{~0>.45-~a.i.toupper 'Hello World'
.... . .-.. .-.. --- / .-- --- .-. .-.. -.. 

   '.- /'{~;2,~&.>(]`(<&3:)@.(a:=])"0)}.&,&#:&.></.40-~a.i.')}ggWOKIHX`dfggggggg-@B4*:68,?5</.7>E20+193ACD'{~0>.45-~a.i.toupper 'Hello, Stackoverflow.'
.... . .-.. .-.. --- .-.-.- / ... - .- -.-. -.- --- ...- . .-. ..-. .-.. --- .-- --..-- 
6
ответ дан 24 November 2019 в 19:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: