Terjemahkan program Glypho

17

Diberikan masukan dari setiap program Glypho yang valid , mengeluarkan mitra "yang dapat dibaca manusia".

Glypho adalah ide esolang yang menarik:

Referensi instruksi diberikan di sini. Untuk setiap instruksi, karakter abcd mewakili simbol yang menyusun setiap instruksi. a mengacu pada simbol unik pertama, b mengacu pada simbol unik kedua, dll.

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 [

(kredit: Brian Thompson alias Wildhalcyon)

Jadi, misalnya, PPCGakan mewakili instruksi Push —PPCG cocok dengan pola aabc, di mana adiwakili P, bdiwakili C, dan c diwakili G.

Input akan berupa string tunggal yang hanya terdiri dari karakter ASCII yang dapat dicetak. Itu akan selalu memiliki panjang habis dibagi empat (duh).

Outputnya adalah setiap kelompok yang terdiri dari empat karakter dalam string input diganti dengan instruksi yang mereka pilih. Gunakan nama instruksi satu huruf (yang tepat setelah lima titik dalam tabel yang dikutip di atas).

Karena ini adalah , kode terpendek dalam byte akan menang.

Kasus uji:

In                                Out
------------------------------------------------
Programming Puzzles & Code Golof  ]!]!]]]+
nananananananana batman!          dddd]]
;;;;;;;:;;:;;;::                  ni>\
llamas sleep                      1-*
8488133190003453                  <[oe
<empty string>                    <empty string>
Gagang pintu
sumber
4
Ah ya Kode Golof. Sporot favorit saya.
KoreanwGlasses

Jawaban:

5

Pyth, 37 35 34 byte

Kode berisi karakter yang tidak patut xxddicetak , jadi di sini adalah hexdump:

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

Berikut adalah versi yang dapat dicetak pada 36 byte:

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

Cobalah online. Suite uji.

Penjelasan

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
sumber
3

CJam, 42 39 35 byte

Disimpan 4 byte meminjam ide pengguna81655 menggunakan basis 3, bukan basis 4.

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

Jalankan semua test case.

Pasti ada cara yang lebih baik untuk mengompresi tabel pencarian perintah ...

Martin Ender
sumber
3

JavaScript (ES6), 97

Untuk setiap blok 4 karakter, saya mengganti setiap simbol dengan posisinya di blok, mendapatkan nomor basis 4. Misalnya 'aabc' -> '0023'. Angka-angka yang memungkinkan berada dalam kisaran 0..0123, yaitu 0..27 dalam desimal. Saya menggunakan angka sebagai indeks untuk menemukan karakter instruksi yang tepat dari string 28 karakter.

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

Uji

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
sumber
3

MATLAB, 291 byte

Saya ragu-ragu untuk waktu yang cukup lama jika saya harus melakukan jawaban saya. Saya hanya bermain-main dengan MATLAB. Saya sadar bahwa sangat tidak mungkin untuk menghasilkan kode padat (jumlah instruksi / byte yang rendah; sekitar 3 kali lebih besar dari solusi ~ 100 byte Anda) dan bahwa MATLAB mungkin tidak terlalu cocok untuk kode golf dan saya baru mengenal kode golf . Tapi saya hanya ingin mencoba, dan kodenya berfungsi (karakter baris baru disimpan). Ada petunjuk yang diterima. : 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.
sumber
1
Selamat Datang di Programming Puzzles & Code Golf! Semua jawaban diterima, bahkan jika mereka dikalahkan oleh jumlah yang konyol (sudah pasti terjadi pada saya sebelumnya). ;) Jawaban pertama yang bagus!
Gagang Pintu
2

JavaScript (ES6), 115 101 byte

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

Disimpan 14 byte berkat @ edc65 !

Penjelasan

Menyimpan daftar instruksi dalam sebuah string dengan setiap karakter pada indeks base-3-nya. Misalnya, +sesuai dengan abacyang dapat direpresentasikan dalam basis-3 sebagai 0102, atau 11dalam desimal. Satu-satunya instruksi yang tidak dapat direpresentasikan dalam base-3 adalah ], tetapi dengan algoritma yang digunakan untuk menghitung nomor base-3, ia dengan mudah berakhir pada posisi 18 di ujung string.

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

Uji

pengguna81655
sumber
Anda dapat menyimpan banyak byte yang tidak menggunakan parseIntdan menghitung angka dengan jumlah berulang dan berlipat ganda. Ini menghindari masalah dengan '0123' yang tidak valid di basis 3 tetapi memberikan 1 * 9 + 2 * 6 + 3 == 18 yang merupakan posisi yang baik. Hasil: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 Saran bagus. Terima kasih!
user81655
0

Python 2, 158 byte

Mengambil input seperti "test". Output adalah daftar karakter.

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

Cobalah online

Tidak Disatukan:

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
sumber