Напишите самую короткую программу для преобразования стандартного ввода в азбуку Морзе . Символы, которых нет в таблице, должны быть напечатаны как есть.
32
Напишите самую короткую программу для преобразования стандартного ввода в азбуку Морзе . Символы, которых нет в таблице, должны быть напечатаны как есть.
Ответы:
Golfscript - 74 символа
Этот ответ поддерживает только прописные буквы и цифры. Буквы разделены новыми строками, а слова разделены двумя строками
Анализ
Golfscript - 85 символов
Это короче, чем мой SO ответ из-за смягченных требований здесь. Ввод должен быть в верхнем регистре / цифрах и знаках препинания ".,?"
Поскольку пунктуация здесь даже не требуется, я могу сократить ответ еще больше
Мой ответ от SO
Golfscript - 107 символов
символ новой строки в конце ввода не поддерживается, поэтому используйте что-то вроде этого
echo -n Hello, Codegolfers| ../golfscript.rb morse.gs
Буквы представляют собой особый случай и преобразуются в нижний регистр и упорядочиваются в своих двоичных позициях. Все остальное делается с помощью таблицы перевода
источник
C # (213 символов)
Я уверен, что это не продлится долго, но, по крайней мере, я сначала получил технику здесь!
И в читаемом формате:
Для краткого объяснения, строка символов - это куча, в которой левый потомок - точка, а правый - тире. Чтобы построить письмо, пройдите обратно вверх и измените порядок.
источник
ETIAN...
там, я предположил, что он работает так же, как сценарий гольфа, но у вас есть другой способ интерпретации строки. Я думаю, что это эквивалентно, но я добавляю 1 к индексу и использую двоичное представление, чтобы получить точки и тире для всех цифр послеF=>18=>0b10010=>..-.
String[] a
tr + sed (347)
источник
/g;s/
становится,
- плюс немного накладных расходов).y
вместо этого команду sedHaskell -
314292291 символовБолее читаемая форма:
Образец прогона:
Между двумя буквами один пробел, а между двумя словами семь пробелов.
источник
fromJust.elemIndex c
можно записать какhead.findIndices(==c)
. Это на один символ больше, но вы можете избавиться от негоimport Data.Maybe
, так что вы сэкономите всего 17 символов. Вы также можете сохранить два символа, удаляя пробел перед строкой каждый раз, когда вы вызываете intercalate. И еще несколько символов, выполнивi=intercalate
в начале и заменив два вызова наintercalate
наi
.intercalate
и сохранил еще 6 символов! :-)w=words
, что сохраняет один символ, если я не ошибаюсь. И вместоl c=...
иmap l
, вы должны это сделатьmap\c->...
(вам даже не нужны парены вокруг лямбды, так как потом уже есть закрывающий парен).l c=...
спасла мне 1 символ, но я не мог поставить его без символов, только какmap(\c->...)
. GHC версия 6.12.3.постскриптум
(310)(462)(414)(319) в том числе (46) для таблицы.Комбинированные цифры и буквы с троичной кодировкой. 5 троичных цифр вписываются в байт! Это устраняет эти глупые разностные циклы и номера специальных корпусов полностью.
ASCII85 режет 1/3 каждого стола. И упрощение кода (наконец-то!) Возвращается под 400!
Образец вывода
Разоблаченный и прокомментированный. Я очень горжусь этим. Я чувствую, что это элегантно, заставлять цифры работать. :)
Таблицы (33) + (13) = (46)
Вот как строки кодируют таблицу. Каждый байт представляет собой 5-значное троичное число. И байты далее кодируются в ASCII85 (который PostScript может автоматически декодировать).
источник
Руби, 161
Кодирует каждую цифру в один символ, где 1 - тире, 0 - точка, с ведущим 1 в качестве бита маркера (плюс смещение, чтобы сохранить его для печати. Используется математика ASCII для использования входных символов в качестве индексов поиска.
источник
VB.NET, 233 байта
Эта последняя функция зла.
Отредактируйте пару улучшений.
источник
Лисп (
532466 символов)Это кодирует строчные буквы, а последовательности кода Морзе печатаются с завершающим пробелом
источник
На Яве 475 символов.
Переводит az, AZ и 0-9.
Редактировать:
Или из 447 символов, если вы не возражаете, Java выдает ошибку после перевода.
источник
Perl6 (238)
Читаемая версия
источник
sed, 159 байт
Мы начинаем с уменьшения строки целиком (потому что
y
не можем выполнять преобразования без учета регистра); вычтите 10 байтов, если нам нужно обрабатывать только строчные буквы. Тогда мы препроцессировать цифры0
,2
,8
и9
испускать их окончательные символы.Цикл генерирует последний символ для каждого входного символа, а затем переводит каждый символ для следующей итерации. Это эквивалентно переходу к дихотомической таблице поиска, показанной в статье Википедии; у цифр, которые нуждались в специальном лечении, можно видеть родителей, которых нет в наших буквенно-цифровых цифрах ASCII.
Цикл завершается, когда все символы достигают завершающего пробела (после 'e' или 't').
Например, письмо
k
преобразуется в три прохода:k
=>k-
=>n-
n-
=>n.-
=>t.-
t.-
=>t-.-
=>-.-
источник
Python 3, 99 символов
Работает в верхнем и нижнем регистре.
источник
C
162160 символов(С не значительным пропущенным пробелом, без новой строки)
M
таблица поиска, где битовые шаблоны символов соответствуют точкам и тире в азбуке Морзе. Символы[0-9A-Z]
декодируются на азбуку Морзе с использованием этой таблицы (с пробелом, добавленным после кода Морзе), другие символы просто пропускаются без изменений.Образец прогона:
источник
Perl (489 символов)
Может быть выполнен через командную строку, как это.
Редактировать: Спасибо @tobyodavies за то, что указал на то, что мое оригинальное решение имеет перевод назад!
источник
%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//}
PHP, 474 символа
Его 462 символа, если все входные данные в верхнем регистре:
источник
<?$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,'.-');
05AB1E , 81 байт (не конкурирует)
Попробуйте онлайн!
Преобразование буквенных шаблонов в основание-3, числовых шаблонов в основание-2, использование нулевой индексированной транслитерации ascii для перехода к точкам и дефисам. Не работает в нижнем регистре.
источник
Желе , 50 байт
Полная программа, принимающая строку в формате Python в качестве аргумента командной строки, которая печатает выходные данные с разделителями.
Попробуйте онлайн!
источник
Powershell, 142 байта
Менее гольф тестовый скрипт:
Выход:
Примечание. Выходные данные содержат завершающие пробелы.
источник
+mazzy+
какая-то дерзкая набивкаAPL (NARS), 71 символ, 142 байта
тест:
каждая буква отделяется от одного пробела, каждое слово будет отделяться от 3 пробелов. Таблица построена на буквенно-цифровой строке
⎕A,⎕D
и 16-битных символах, которые'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ䴫쩸穼蚠'
они разбивают на 8-битные символы, каждый из которых преобразуется в основание 3 с обращенными цифрами.источник
05AB1E , 52 байта
Попробуйте онлайн!
источник
JavaScript (ES6), 184 байта
Для обеих этих версий они будут ставить пробелы между любыми символами. Преобразует 0-9 и az (без учета регистра). Пробел конвертируется в 3.
Заменить
\n
символом новой строки (0x0a
). Это не показывает пару непечатных символов из-за SE. Переход в режим редактирования показывает это.Вот гекс:
Ungolfed
Читаемая версия, 234 байта
Ungolfed
источник
Python 2,
283274 байтаЯ создал строку буквенно-цифровых символов, чтобы их размещение в строке описывало их представление азбукой Морзе. Первоначально я собирался использовать двоичный файл, но
01
будет так же, как1
. Так что я использовал троичный с- = 1
и. = 2
. Таким образом, символc
находится в индексе1121
в этой строке, его представление кода Морзе есть--.-
.Test Harness
Обновить
[ПРИМЕЧАНИЕ: всегда есть конечный пробел, но пробел представляет собой паузу, так что я гость, это нормально ]
источник
PHP,
157150157 байтпринимает входные данные из первого аргумента командной строки. нет паузы между буквами. Беги с
-nr
.сломать
Победа над JavaScript, Python2, C, Ruby и sed. Я счастлив.
4-й шаг: отмените сопоставление для обработки строчных символов без использования
strtoupper
.предыдущие версии:
ошибка для строчных букв; +12 байт для исправления: заменить
$argv[1]
наstrtoupper($argv[1])
.простой перевод строки, 254 байта
прямо: переводит всю строку сразу, символ в код Морзе.
Сохранить в файл , чтобы выполнить или заменить
<?=
сecho
и работать с-r
.десятичная интерпретация азбуки Морзе, 184 байта (-70)
первый шаг в игре в гольф: азбука Морзе, закодированная в двоичном коде, с дополнительным символом
1
сохранения начальных нулей Перебирает символы и переводит их один за другим. Беги с-nr
.десятичные числа, закодированные в символ, 157 байтов (-27)
вторая игра в гольф: добавлено 60 к десятичному значению и закодировано в символ.
объединенное отображение, 150 байт (-7)
третий гольф: объединение карт для цифр и букв в одну строку.
источник
SmileBASIC,
194190 байтовисточник