Dịch một chương trình Glypho


17

Đưa ra một đầu vào của bất kỳ chương trình Glypho hợp lệ nào , hãy xuất đối tác "có thể đọc được" của nó.

Glypho là một ý tưởng esolang thú vị:

Các tài liệu tham khảo hướng dẫn được đưa ra ở đây. Đối với mỗi lệnh, abcd ký tự đại diện cho các ký hiệu sáng tác mỗi lệnh. a đề cập đến biểu tượng duy nhất đầu tiên, b đề cập đến biểu tượng duy nhất thứ hai, v.v.

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 [

(tín dụng: Brian Thompson aka Wildhalcyon)

Vì vậy, ví dụ, PPCGsẽ đại diện cho Đẩy instruction- PPCGphù hợp với mô hình aabc, nơi ađại diện P, bđại diện Cc đại diện G.

Đầu vào sẽ là một chuỗi duy nhất chỉ bao gồm các ký tự ASCII có thể in được. Nó sẽ luôn có độ dài chia hết cho bốn (duh).

Đầu ra là mỗi nhóm bốn ký tự trong chuỗi đầu vào được thay thế bởi lệnh mà chúng chỉ định. Sử dụng tên hướng dẫn một chữ cái (tên ngay sau năm dấu chấm trong bảng được trích dẫn ở trên).

Vì đây là , mã ngắn nhất tính bằng byte sẽ thắng.

Các trường hợp thử nghiệm:

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

4
À đúng Mã Golof. Sporot yêu thích của tôi.
KoreanwGlass

Câu trả lời:


5

Pyth, 37 35 34 byte

Mã chứa các ký tự không thể in được, vì vậy đây là 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

Đây là phiên bản có thể in ở 36 byte:

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

Hãy thử trực tuyến. Bộ thử nghiệm.

Giải trình

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

Đối với mỗi khối gồm 4 ký tự, tôi thay thế mỗi ký hiệu bằng vị trí của nó trong khối, lấy số 4 cơ sở. Chẳng hạn 'aabc' -> '0023'. Các số có khả năng nằm trong phạm vi 0..0123, tức là 0,27 trong số thập phân. Tôi sử dụng số này làm chỉ mục để tìm đúng ký tự lệnh từ chuỗi ký tự 28 ký tự.

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

Kiểm tra

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 byte

Tôi đã do dự khá lâu nếu tôi nên cam kết câu trả lời của mình. Tôi chỉ chơi xung quanh với MATLAB. Tôi biết rằng thực sự không thể tạo mã dày đặc (số lượng lệnh / byte thấp; lớn hơn khoảng 3 lần so với các giải pháp ~ 100 byte của bạn) và MATLAB có thể không quá phù hợp với môn đánh gôn và tôi chưa quen với môn đánh gôn . Nhưng tôi chỉ đơn giản muốn thử và mã hoạt động (giữ các ký tự dòng mới). Bất kỳ gợi ý chào đón. : 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
Chào mừng bạn đến với Câu đố lập trình & Code Golf! Tất cả các câu trả lời đều được chào đón, ngay cả khi chúng bị vượt qua bởi một số tiền vô lý (chắc chắn đã xảy ra với tôi trước đây). ;) Câu trả lời đầu tiên tốt đẹp!
Doorknob

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

Đã lưu 14 byte nhờ @ edc65 !

Giải trình

Lưu trữ danh sách các hướng dẫn trong một chuỗi với mỗi ký tự ở chỉ mục cơ sở 3. Ví dụ, +tương ứng với abacsố có thể được biểu diễn trong cơ sở 3 dưới dạng 0102hoặc 11theo số thập phân. Lệnh duy nhất không thể được biểu diễn trong cơ sở 3 là ], nhưng với thuật toán được sử dụng để tính số cơ sở 3, kết thúc thuận tiện cần phải ở vị trí 18 ở cuối chuỗi.

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

Kiểm tra


Bạn có thể lưu nhiều byte không sử dụng parseIntvà tính toán số với tổng và nhân lặp lại. Điều này tránh được vấn đề với '0123' không hợp lệ trong cơ sở 3 nhưng cho 1 * 9 + 2 * 6 + 3 == 18 đó là một vị trí tốt. Kết quả: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 Gợi ý tuyệt vời. Cảm ơn!
dùng81655

0

Python 2, 158 byte

Đưa đầu vào như thế nào "test". Đầu ra là một danh sách các ký tự.

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

Dùng thử trực tuyến

Ung dung:

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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.