Przetłumacz program Glypho

17

Biorąc pod uwagę dowolny poprawny program Glypho , wypisz jego odpowiednik „czytelny dla człowieka”.

Glif to ciekawy pomysł na esolang:

Odniesienie do instrukcji znajduje się tutaj. Dla każdej instrukcji znaki abcd reprezentują symbole tworzące każdą instrukcję. a odnosi się do pierwszego unikalnego symbolu, b odnosi się do drugiego unikalnego symbolu itp.

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 [

(kredyt: Brian Thompson alias Wildhalcyon)

Na przykład PPCGreprezentowałby instrukcję Push -PPCG odpowiada wzorowi aabc, w którym areprezentuje P, breprezentuje Ci c reprezentuje G.

Dane wejściowe będą stanowić pojedynczy ciąg składający się wyłącznie z drukowalnych znaków ASCII. Zawsze będzie miał długość podzielną przez cztery (duh).

Dane wyjściowe to każda grupa czterech znaków w ciągu wejściowym zastępowana przez wskazaną instrukcję. Użyj jednoliterowych nazw instrukcji (tych zaraz po pięciu kropkach w tabeli cytowanej powyżej).

Ponieważ jest to , wygra najkrótszy kod w bajtach.

Przypadki testowe:

In                                Out
------------------------------------------------
Programming Puzzles & Code Golof  ]!]!]]]+
nananananananana batman!          dddd]]
;;;;;;;:;;:;;;::                  ni>\
llamas sleep                      1-*
8488133190003453                  <[oe
<empty string>                    <empty string>
Klamka
źródło
4
Ach tak Code Golof. Mój ulubiony sporot.
KoreanwGlasses

Odpowiedzi:

5

Pyth, 37 35 34 bajtów

Kod zawiera znaki niedrukowalne, więc oto xxdzrzut heksowy:

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

Oto wersja do wydruku o wielkości 36 bajtów:

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

Wypróbuj online. Zestaw testowy.

Wyjaśnienie

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
źródło
3

CJam, 42 39 35 bajtów

Zaoszczędzono 4 bajty pożyczając pomysł użytkownika 81655 na użycie podstawy 3 zamiast podstawy 4.

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

Uruchom wszystkie przypadki testowe.

Musi być lepszy sposób na skompresowanie tabeli odnośników ...

Martin Ender
źródło
3

JavaScript (ES6), 97

Dla każdego bloku 4 znaków zastępuję każdy symbol jego pozycją w bloku, otrzymując podstawową liczbę 4. Na przykład 'aabc' -> '0023'. Możliwe liczby są w zakresie 0..0123, czyli 0..27 w systemie dziesiętnym. Używam tej liczby jako indeksu, aby znaleźć właściwy znak instrukcji z ciągu 28 znaków.

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

Test

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
źródło
3

MATLAB, 291 bajtów

Długo się wahałem, czy powinienem udzielić odpowiedzi. Po prostu bawiłem się z MATLABEM. Wiem, że tak naprawdę nie jest możliwe wygenerowanie gęstego kodu (niska liczba instrukcji / bajtów; około 3 razy większa niż twoje ~ 100 bajtowe rozwiązania) i że MATLAB może nie być zbyt odpowiedni do golfa kodowego i jestem nowy w golfa kodowego . Ale po prostu chciałem spróbować, a kod działa (znaki nowego wiersza są zachowane). Wszelkie wskazówki są mile widziane. : P

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)
Matthias W.
źródło
1
Witamy w Programowaniu Puzzle i Code Golf! Wszystkie odpowiedzi są mile widziane, nawet jeśli zostaną obezwładnione w absurdalny sposób (na pewno zdarzyło mi się to wcześniej). ;) Ładna pierwsza odpowiedź!
Klamka
2

JavaScript (ES6), 115 101 bajtów

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])

Zaoszczędź 14 bajtów dzięki @ edc65 !

Wyjaśnienie

Przechowuje listę instrukcji w ciągu z każdym znakiem pod indeksem base-3. Na przykład +odpowiada, abacktóre mogą być reprezentowane w bazie-3 jako 0102lub 11w systemie dziesiętnym. Jedyną instrukcją, której nie można przedstawić w bazie 3, jest ]jednak, ale z algorytmem stosowanym do obliczenia liczby bazy 3, wygodnie kończy się na pozycji 18 na końcu łańcucha.

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
    ]
  )

Test

użytkownik 81655
źródło
Możesz zapisać wiele bajtów, które nie używają parseInti nie obliczają liczby z powtarzaną sumą i mnożeniem. Pozwala to uniknąć problemu z „0123”, który jest nieprawidłowy w bazie 3, ale daje 1 * 9 + 2 * 6 + 3 == 18, która jest dobrą pozycją. Wynik: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 Świetna sugestia. Dzięki!
user81655
0

Python 2, 158 bajtów

Przyjmuje dane wejściowe jak "test". Dane wyjściowe to lista znaków.

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))

Wypróbuj online

Nie golfowany:

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
źródło