翻译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 [

(图片来源:Brian Thompson或 Wildhalcyon)

因此,例如,PPCG将表示Push指令— PPCG匹配模式aabc,其中a表示Pb表示Cc 表示G

输入将是仅包含可打印ASCII字符的单个字符串。它的长度始终可以被四(duh)整除。

输出是输入字符串中每四个字符组成的一组,替换为它们指定的指令。使用单字母指令名称(上面引用的表格中五个点之后的名称)。

由于这是,因此以字节为单位的最短代码将获胜。

测试用例:

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

4
嗯,是代码戈洛夫。我最喜欢的sporot。
KoreanwGlasses '16

Answers:


5

Pyth,37 35 34字节

该代码包含不可打印的字符,因此这是xxd十六进制转储:

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


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>


3

MATLAB,291位元组

如果我要回答我,我犹豫了很长时间。我只是在玩MATLAB。我知道,实际上不可能生成密集的代码(少量的指令/字节;大约是您的100字节解决方案的3倍),而且MATLAB可能不太适合代码高尔夫,而我是代码高尔夫的新手。但是我只是想尝试一下,并且代码有效(保留了换行符)。任何提示欢迎。: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
欢迎来到编程难题和代码高尔夫球!所有的答案都是值得欢迎的,即使它们超出了荒谬的程度(以前肯定发生在我身上)也是如此。;)不错的第一个答案!
门把手

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

@ edc65节省了14个字节!

说明

将指令列表存储在字符串中,每个字符的基数为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
    ]
  )

测试


您可以节省许多不使用的字节,parseInt并通过重复的总和与乘法来计算数字。这样可以避免在基数3中无效的'0123'问题,但给出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 '16

@ edc65很棒的建议。谢谢!
user81655 '16

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

在线尝试

取消高尔夫:

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))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.