Перевести программу Glypho

17

Учитывая ввод любого действительного 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>
Дверная ручка
источник
4
Ах да, Код Голоф. Мой любимый спорот.
KoreanwGlasses

Ответы:

5

Pyth, 37 35 34 байта

Код содержит непечатаемые символы, поэтому вот xxdhexdump:

0000000: 5663 7a34 7040 2e22 216f d78c 40bf d4f0  Vcz4p@."!o..@...
0000010: 38d6 7dfe 7312 3ff8 ea22 6958 4e7b 4e55  8.}.s.?.."iXN{NU
0000020: 5433                                     T3

Вот версия для печати в 36 байтов:

Vcz4p@"ni >\\1   <d+[o*e-!]"iXN{NUT3

Попробуйте онлайн. Тестирование.

объяснение

Vcz4p@."…"iXN{NUT3       implicit: z = input
  z                      input
 c 4                     split to 4-character blocks
V                        loop over that in N
           X               replace...
            N                in current part
             {N              unique chars in current part, in order
               UT            with numbers 0-9
          i      3         interpret as base 3
     @                     take that item of
      ."…"                   string "ni >\\1   <d+[o*e-!]"
    p                      and print without newline
PurkkaKoodari
источник
3

CJam, 42 39 35 байт

Сохранено 4 байта, заимствуя идею пользователя 81655 об использовании базы 3 вместо базы 4.

l4/{__&f#3b"ni >\1   <d+[o*e-!]"=}%

Запустите все тестовые случаи.

Должен быть лучший способ сжать таблицу поиска команд ...

Мартин Эндер
источник
3

JavaScript (ES6), 97

Для каждого блока из 4 символов я заменяю каждый символ его положением в блоке, получая базовое число 4. Например 'aabc' -> '0023'. Возможные числа находятся в диапазоне 0..0123, то есть 0..27 в десятичном виде. Я использую число в качестве индекса, чтобы найти правильный символ инструкции из строки из 28 символов.

s=>s.replace(/.{4}/g,s=>'n..i....>.\\1....<d.+[o.*e-!]'[[...s].map(c=>n=n*4+s.indexOf(c),n=0),n])

Тестовое задание

F=s=>s.replace(/.{4}/g,s=>'n..i....>.\\1....<d.+[o.*e-!]'[[...s].map(c=>n=n*4+s.indexOf(c),n=0),n])

function test() { O.textContent=F(I.value) }

test();
#I { width:90% }
<input id=I value="nananananananana batman!" oninput="test()">
<br><span id=O></span>

edc65
источник
3

MATLAB, 291 байт

Я довольно долго колебался, если я должен совершить свой ответ. Я просто играл с MATLAB. Я знаю, что на самом деле невозможно создать плотный код (небольшое количество инструкций / байтов; примерно в 3 раза больше, чем ваши ~ 100-байтовые решения), и что MATLAB может быть не слишком подходящим для кодового гольфа, и я новичок в кодовом гольфе , Но я просто хотел попробовать, и код работает (символы новой строки сохраняются). Любые намеки приветствуются. :П

i=input('','s');
l=reshape(i,4,length(i)/4)';
m=']!- e';m(9)='*';m(12:22)='o[   + d  <';m(33:34)='1\';m(39)='>';m(57)='i';m(64)='n';
s='';
for k = 1:size(l,1)
n=l(k,:);
c=combvec(n,n);
t=triu(reshape(c(1,:)==c(2,:),4,4),1);
t=sum(t([5,9:10,13:15]).*2.^[5:-1:0]);
s=[s,m(t+1)];
end
display(s)
Матиас В.
источник
1
Добро пожаловать в Программирование Пазлов и Code Golf! Все ответы приветствуются, даже если они превзойдены смешной суммой (определенно случалось со мной раньше). ;) Хороший первый ответ!
Дверная ручка
2

JavaScript (ES6), 115 101 байт

s=>s.replace(/..../g,g=>"ni >\\1   <d+[o*e-!]"[[...g].map(c=>r=r*3+(m[c]=m[c]||++i)-1,i=r=0,m={})|r])

Сохранено 14 байт благодаря @ edc65 !

объяснение

Сохраняет список инструкций в строке с каждым символом в индексе base-3. Например, +соответствует abacкоторому может быть представлено в base-3 как 0102, или 11в десятичном виде. Единственная инструкция, которая не может быть представлена ​​в base-3, это ], но с алгоритмом, используемым для вычисления числа base-3, она удобно заканчивается тем, что должна находиться в позиции 18 в конце строки.

s=>
  s.replace(/..../g,g=>    // replace each four-character group with it's instruction
    "ni >\\1   <d+[o*e-!]" // list of instructions at their base-3 index
    [
      [...g].map(c=>       // for each character c
        r=r*3+(m[c]=m[c]   // shift r left and add the number associated with c to r
          ||++i)-1,        // if nothing is associated, associate the next number to c
                           // save i + 1 to m[c] so that it is truthy for 0
        i=                 // i = current number to assign to the next unique character
        r=0,               // r = 4-character group as a base-3 number
        m={}               // m = map of numbers assigned to each character
      )
      |r                   // return r
    ]
  )

Тестовое задание

user81655
источник
Вы можете сохранить много байтов, не используя 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])
edc65
@ edc65 Отличное предложение. Благодарность!
user81655
0

Python 2, 158 байт

Принимает участие как "test". Вывод представляет собой список символов.

def b(s,i=0):
    for c in s:i=i*4+s.index(c)
    return"n..i....>.\\1....<d.+[o.*e-!]"[i]
print map(b,(lambda l,n:[l[i:i+n]for i in range(0,len(l),n)])(input(),4))

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

Ungolfed:

def chunks(l, n):
    return (l[i:i+n] for i in range(0, len(l), n))

def convert(inst):
    i = 0
    for c in inst:
        i = i*4 + inst.index(c)

    return "n..i....>.\\1....<d.+[o.*e-!]"[i]

print map(convert, chunks(input(), 4))
mbomb007
источник