Учитывая ввод любого действительного Glypho программы выведите ее «читабельный» аналог.
Glypho - интересная идея esolang:
Ссылка на инструкцию приведена здесь. Для каждой инструкции символы abcd представляют символы, составляющие каждую инструкцию. a относится к первому уникальному символу, b относится ко второму уникальному символу и т. д.
aaaa ..... n NOP - no operation; do nothing aaab ..... i Input - push input onto top of stack aaba ..... > Rot - pops top stack element and pushes to bottom of stack aabb ..... \ Swap - swaps top two stack elements aabc ..... 1 Push - pushes a 1 onto the top of stack (creates new element) abaa ..... < RRot - pops bottom element and pushes to top of stack abab ..... d Dup - Duplicates top stack element abac ..... + Add - pops top two elements and pushes their sum abba ..... [ L-brace - skip to matching ] if top stack element is 0 abbb ..... o Output - pops and outputs top stack element abbc ..... * Multiply - pops top two elements and pushes their product abca ..... e Execute - Pops four elements and interprets them as an instruction abcb ..... - Negate - pops value from stack, pushes -(value) abcc ..... ! Pop - pops and discards top stack element abcd ..... ] R-brace - skip back to matching [
( Фото : Брайан Томпсон, он же Wildhalcyon)
Так, например, PPCG
будет представлять инструкцию Push -PPCG
соответствует шаблону aabc
, где a
представляет P
, b
представляет C
и c
представляет G
.
На входе будет одна строка, состоящая только из печатных символов ASCII. Он всегда будет иметь длину, кратную четырем (дух).
Выходными данными является каждая группа из четырех символов во входной строке, заменяемая той инструкцией, которую они обозначают. Используйте однобуквенные названия инструкций (те, которые идут сразу после пяти точек в приведенной выше таблице).
Так как это код-гольф , победит самый короткий код в байтах.
Тестовые случаи:
In Out
------------------------------------------------
Programming Puzzles & Code Golof ]!]!]]]+
nananananananana batman! dddd]]
;;;;;;;:;;:;;;:: ni>\
llamas sleep 1-*
8488133190003453 <[oe
<empty string> <empty string>
Ответы:
Pyth,
373534 байтаКод содержит непечатаемые символы, поэтому вот
xxd
hexdump:Вот версия для печати в 36 байтов:
Попробуйте онлайн. Тестирование.
объяснение
источник
CJam,
423935 байтСохранено 4 байта, заимствуя идею пользователя 81655 об использовании базы 3 вместо базы 4.
Запустите все тестовые случаи.
Должен быть лучший способ сжать таблицу поиска команд ...
источник
JavaScript (ES6), 97
Для каждого блока из 4 символов я заменяю каждый символ его положением в блоке, получая базовое число 4. Например
'aabc' -> '0023'
. Возможные числа находятся в диапазоне 0..0123, то есть 0..27 в десятичном виде. Я использую число в качестве индекса, чтобы найти правильный символ инструкции из строки из 28 символов.Тестовое задание
источник
MATLAB, 291 байт
Я довольно долго колебался, если я должен совершить свой ответ. Я просто играл с MATLAB. Я знаю, что на самом деле невозможно создать плотный код (небольшое количество инструкций / байтов; примерно в 3 раза больше, чем ваши ~ 100-байтовые решения), и что MATLAB может быть не слишком подходящим для кодового гольфа, и я новичок в кодовом гольфе , Но я просто хотел попробовать, и код работает (символы новой строки сохраняются). Любые намеки приветствуются. :П
источник
JavaScript (ES6),
115101 байтСохранено 14 байт благодаря @ edc65 !
объяснение
Сохраняет список инструкций в строке с каждым символом в индексе base-3. Например,
+
соответствуетabac
которому может быть представлено в base-3 как0102
, или11
в десятичном виде. Единственная инструкция, которая не может быть представлена в base-3, это]
, но с алгоритмом, используемым для вычисления числа base-3, она удобно заканчивается тем, что должна находиться в позиции 18 в конце строки.Тестовое задание
Показать фрагмент кода
источник
parseInt
и вычисляя число с повторной суммой и умножением. Это позволяет избежать проблемы с '0123', который недопустим в базе 3, но дает 1 * 9 + 2 * 6 + 3 == 18, что является хорошей позицией. Результат:F=s=>s.replace(/..../g,g=>"ni]>\\1 <d+[o*e-!]"[[...g].map(c=>r=r*3+(m[c]=m[c]||++i)-1,r=i=0,m={})|r])
Python 2, 158 байт
Принимает участие как
"test"
. Вывод представляет собой список символов.Попробуйте онлайн
Ungolfed:
источник