Вызов:
Напишите программу, которая производит следующий вывод:
. E .. I ... S .... H
...- V
..- U ..-. F
..--
.- A .-. R .-.. L
.-.-
.-- W .--. P
.--- J
- T -. N -.. D -... B
-..- X
-.- K -.-. C
-.-- Y
-- M --. G --.. Z
--.- Q
--- O ---.
----
Это отформатированная таблица азбуки Морзе для букв от А до Я. Каждый столбец разделен тремя пробелами.
Есть четыре пропущенных слота, которые используются международными наборами символов. Ваша программа должна написать там пробел.
Выходные данные должны состоять только из пробелов ASCII, точек, тире, букв верхнего регистра и новых строк (либо LF, либо CRLF).
Ваша программа не принимает ввод.
Ниже приведен пример программы на Python, который выдает желаемый результат:
b = "."
out = []
last = 0
ch = "EISHVUF ARL WPJTNDBXKCYMGZQO "
cx = 0
while b:
if last >= len(b):
print(" ".join(out))
out = [" ", " ", " ", " "][0:len(b) - 1]
out.append(b + " " + ch[cx])
cx += 1
last = len(b)
if len(b) < 4:
b += "."
elif b[-1] == ".":
b = b[0:-1] + "-"
else:
i = len(b) - 1
while b[i] == "-":
i -= 1
if i < 0:
break
if i < 0:
break
b = b[0:i] + "-"
print(" ".join(out))
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
code-golf
ascii-art
kolmogorov-complexity
morse
Locoluis
источник
источник
Ответы:
Желе , 85 байт
Полная программа печати шпаргалки.
Попробуйте онлайн!
Как?
Примечание: я действительно думаю, что может быть способ урезать это, формируя список, который правильно форматирует с использованием атома сетки
G
, но я не совсем понимаю, как.источник
Python 3.6,
201197193187 байтовИспользует некоторое форматирование, распаковку и магию A000918 .
источник
f'{i//k:0{j}b}'.replace(*'0.').replace(*'1-')
такой же длины, как и''.join('.-'[int(x)]for x in f'{i//k:0{j}b}')
Сетчатка , 125 байт
Попробуйте онлайн! Должно быть 121 байт, но мне было лень разбираться с пробелами в начале и в конце. Объяснение:
Буквы, код которых начинается с
.
и-
соответственно предварительно загружены. (Теоретически возможно избежать предварительной загрузки,.-
но это сохраняет байты таким образом.)_
Вместо пробелов используются символы s, поскольку они считаются буквами, что облегчает их сопоставление ниже.Здесь мы разбили каждую строку на пять частей:
.
)-
)Затем кусочки собираются в две строки:
.
суффиксом, первая половина оставшихся букв-
суффиксом, вторую половину оставшихся буквНовые строки следуют тому же формату, что и существующая, только с дополнительным префиксом Морзе и вдвое меньшим количеством букв, оставшихся для обработки. Это повторяется до тех пор, пока в каждой строке не будет только одной буквы.
Затем
_
s возвращаются в пробелы.источник
JavaScript (ES6),
154147145 байтисточник
PHP, 208 байт
Попробуйте онлайн!
PHP, 229 байт
Попробуйте онлайн!
источник
Perl 5,
158156 байтисточник
PHP,
184 183181 байтЗапустите
-nr
или попробуйте онлайн .сломать
-7 байт с ведущими пробелами : заменить
ltrim("$r\n")
на"$r\n"
и28
на31
.171 (= -10) байтов с завершающими пробелами :
пробой попробуйте онлайн
источник
for(;$y<16;$y++,print str_pad(ltrim("$r\n"),28," ",0))for($r="",$c="03231323"[$y&7];$c++<4;)$r.=strtr(sprintf(" %0${c}b ",$y>>4-$c),10,"-.")."EISHVUF ARL WPJTNDBXKCYMGZQO "[$i++];
должен сохранить 2 байта.----
не совпадает с остальной."EISHVUF ARL WPJTNDBXKCYMGZQO "
должно быть 2 пробела в конце.APL (Dyalog) , 92 байта
Требуется
⎕IO←0
по умолчанию во многих системах.Попробуйте онлайн!
{
...}¨'
...'
применять следующую анонимную функцию к каждой из строк:⍪⍵
сделать аргумент в столбце' ',
добавить пробел (в каждом ряду)'.-'[
…],
Добавить строку после того, как она была проиндексирована с помощью:≢⍵
длина аргумента⍳
индексы этого (0, 1, 2,…, длина -1)2⊥⍣¯1
anti-base-2 (использует столько битов, сколько необходимо)⍉
транспонировать (от одного представления в каждом столбце до одного в каждой строке)(
…)⍀
Развернуть (вставить пустые строки, как указано нулями в):≢⍵
длина аргумента16÷
разделите шестнадцать на это1↑⍨
(более) взять от одного (делает список из одного, за которым следуют 1- н ноль)16⍴
перерабатывать этот шаблон, пока не будет шестнадцать элементов' ',
ставить пробел⍕
формат (список таблиц в одну таблицу, дополняющий каждую пробелом с каждой стороны)¯1⌽
поверните на один шаг вправо (таким образом, перемещая заднее пространство вперед)0 3↓
отбросить ноль строк и три столбца (удалив три ведущих пробела)источник
16÷⍨
появляется в вашем коде?СОГЛ ,
106105102 байтаЕсли допускаются пробелы,
10299 байт141 байт, сжатие
просто хотел посмотреть, насколько хорошо SOGL может справиться с простым сжатием (ну, у него больше, чем просто сжатие, но это 97% сжатых строк)
источник
JavaScript (205 байт)
источник
Рубин,
144 143141 байтUngolfed
источник
Pyth , 106 байт
Проверьте это онлайн!
объяснение
В нескольких словах, что я делаю здесь, это для генерации таблицы столбец за столбцом, а затем транспонировать таблицу перед печатью. Мы заметили, что в столбце коды Морзе для букв могут быть представлены в виде двоичных строк (заменить
.
на0
и-
на1
) при подсчете от нуля до индекса последней буквы в столбце.Алгоритм основан на функции, из которой я приведу пример запуска ниже (для второго столбца):
Объяснение кода
Я разрезал код на две части. Первая часть - это функция, описанная выше, вторая часть - как я использую функцию:
(1) : В таблице Морзе, в первом столбце, есть семь строк после каждой строки, содержащей буквы («E» и «T»). Во втором столбце это три строки. Затем один (третий столбец), затем ноль (последний столбец). Вот
16 / n - 1
гдеn
находится количество букв в столбце (чтоN
в коде выше). Вот что делает код в строке (1) :Хорошо, теперь у нас есть хорошая полезная функция,
h
которая в основном генерирует столбец таблицы из последовательности символов. Давайте использовать его (обратите внимание на два пробела в коде ниже):Код все еще может быть сокращен; возможно я вернусь к этому позже.
источник
C
199195 байтовЖить на coliru (с #include, чтобы избежать предупреждения.)
ОБНОВЛЕНИЕ : сохранены четыре символа, перемещая «объявление» за
m
пределы функции, как предложено @zacharyTИспользует то, что кажется стандартной стратегией: храните буквы в двоичном дереве с кодировкой массива, чтобы потомки элемента
i
были2*i
и2*i+1
. Это дерево имеет корни в 2, а не в 1, потому что арифметика проработана немного короче, я думаю. Все остальное - игра в гольф.Ungolfed:
источник
int m
чтобы бытьm;
вне функции?Жевательная резинка , 133 байта
Сжатый как поток LZMA.
источник
C, 291 байт
Попробуйте онлайн
Как это работает
Сначала я проанализировал строку в C, считая пробелы, которые меньше 26, поэтому я
a, b, .. z
с помощью этой маленькой программы закодировал их строчными буквамиЗатем я написал парсер для этой кодировки, где
/
новая строка, а буква в маленьком регистре представляетt[i] - 'a'
пробелыисточник
Bash (с утилитами), 254 байта
источник
Dyalog APL, 159 байт (не конкурирует)
источник
⎕IO←0
(по умолчанию на многих системах) и используя⍨
(коммутировать) .JavaScript (ES7),
242240238 байтПопробуйте онлайн!
-2 байта благодаря Захари .
источник
a!='0'
наa!=0
.join('')
на.join<insert backtick here><insert backtick here>
? (<insert backtick here>
заменяется реальнымиa!='0'
на тоa!=0
, что должно сработать.''
деле.