Bir Glif programını çevirme


17

Geçerli herhangi bir Glif programının bir girdisi verildiğinde , "insan tarafından okunabilir" muadili çıktısını alın.

Glif ilginç bir esolang fikri:

Talimat referansı burada verilmiştir. Her komut için, abcd karakterleri her bir komutu oluşturan sembolleri temsil eder. a ilk benzersiz sembolü, b ikinci benzersiz sembolü vb. belirtir.

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 [

(kredi: Brian Thompson aka Wildhalcyon)

Yani, örneğin, PPCGtemsil edeceğini itin instruction- PPCGkalıpla eşleşen aabc, atemsil P, btemsil Cve c temsil G.

Giriş yalnızca yazdırılabilir ASCII karakterlerinden oluşan tek bir dize olacaktır. Her zaman dört (duh) bölünebilir bir uzunluğa sahip olacaktır.

Çıktı, giriş dizesindeki dört karakterden oluşan her bir gruptur ve bunların yerine hangi komutu belirtirler. Tek harfli talimat adlarını kullanın (yukarıda belirtilen tablodaki beş noktadan hemen sonra olanlar).

Bu , bayt cinsinden en kısa kod kazanacaktır.

Test senaryoları:

In                                Out
------------------------------------------------
Programming Puzzles & Code Golof  ]!]!]]]+
nananananananana batman!          dddd]]
;;;;;;;:;;:;;;::                  ni>\
llamas sleep                      1-*
8488133190003453                  <[oe
<empty string>                    <empty string>

4
Ah evet Kod Golof. En sevdiğim sporot.
KoreanwGlasses

Yanıtlar:


5

Pyth, 37 35 34 bayt

Kod yazdırılamaz karakterler içeriyor, bu yüzden 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

İşte 36 baytta yazdırılabilir bir sürüm:

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

Çevrimiçi deneyin. Test odası.

açıklama

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


3

JavaScript (ES6), 97

4 karakterlik her blok için, her simgeyi bloktaki konumu ile değiştiririm ve bir taban 4 numarası alırım. Mesela 'aabc' -> '0023'. Olası sayılar 0..0123 aralığında, yani ondalık basamakta 0..27'dir. Numarayı, 28 karakter dizesinden doğru komut karakterini bulmak için dizin olarak kullanıyorum.

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

Ölçek

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>


3

MATLAB, 291 bayt

Cevabımı verirsem oldukça uzun süre tereddüt ettim. Sadece MATLAB ile oynuyordum. Yoğun kod (gerçekten az sayıda talimat / bayt; ~ 100 bayt çözümlerinizden yaklaşık 3 kat daha fazla larget) oluşturmanın gerçekten mümkün olmadığını ve MATLAB'ın kod golf için çok uygun olmayabileceğini ve golf kodunda yeniyim. . Ama sadece denemek istedim ve kod çalışıyor (yeni satır karakterleri tutuldu). Herhangi bir ipucu hoş geldiniz. : 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)

1
Programlama Bulmacaları ve Kod Golf hoş geldiniz! Saçma bir miktardan fazla olsalar bile, tüm cevaplar açıktır (daha önce başıma gelmişti). ;) Güzel ilk cevap!
Kapı Tokmağı

2

JavaScript (ES6), 115 101 bayt

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

@ Edc65 sayesinde 14 bayt kaydedildi !

açıklama

Talimatlar listesini her karakter temel-3 dizininde olan bir dizede saklar. Örneğin, baz-3'te veya ondalık olarak temsil edilebilecek +olanlara karşılık gelir . Base-3'te temsil edilemeyen tek talimat , ancak base-3 sayısını hesaplamak için kullanılan algoritma ile, dizenin sonunda 18. konumda olması gerektiği gibi sonuçlanır.abac010211]

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

Ölçek


parseIntSayıyı tekrar etmeyen ve çarpma ile kullanmayan ve hesaplamayan birçok bayt kaydedebilirsiniz . Bu, temel 3'te geçersiz olan, ancak iyi bir konum olan 1 * 9 + 2 * 6 + 3 == 18 veren '0123' sorununu önler. Sonuç: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 Harika bir öneri. Teşekkürler!
user81655

0

Python 2, 158 bayt

Gibi girdi alır "test". Çıktı, karakterlerin bir listesidir.

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

Çevrimiçi deneyin

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))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.