글 리포 프로그램 번역


17

유효한 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나타낼 것이다 푸시 안내 - PPCG패턴과 일치 aabc, a대표 P, b대표 Cc 대표를 G.

입력은 인쇄 가능한 ASCII 문자로만 구성된 단일 문자열입니다. 길이는 항상 4 (duh)로 나눌 수 있습니다.

출력은 입력 문자열에서 4 개의 문자로 구성된 각 그룹으로 지정된 명령으로 바뀝니다. 단일 문자 명령어 이름을 사용하십시오 (위 인용 된 표에서 5 개의 점 바로 뒤에있는 이름).

이것이 이므로 바이트 단위의 가장 짧은 코드가 승리합니다.

테스트 사례 :

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

4
아 예 코드 골 로프. 내가 가장 좋아하는 포자.
KoreanwGlasses

답변:


5

Pyth, 37 35 34 바이트

코드에는 인쇄 할 수없는 문자가 포함되어 있으므로 다음은 xxd16 진수 덤프입니다.

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

자바 스크립트 (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이 코드 골프에 너무 적합하지 않을 수 있으며 골프를 처음 접하는 것을 알고 있습니다 . 그러나 나는 단순히 시도하고 싶었고 코드는 작동합니다 (줄 바꿈 문자 유지). 어떤 힌트라도 환영합니다. :피

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
프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다! 그들이 말도 안되는 양만큼 아웃 골프 되더라도 모든 답변을 환영합니다. ;) 좋은 첫 답변!
Doorknob

2

자바 스크립트 (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 인덱스 인 문자열에 저장합니다. 예를 들어, base-3에서으로 또는 10 진수 로 표시 될 수있는에 +해당합니다 . 기수 3으로 표현할 수없는 유일한 명령어는 기수 이지만, 기수 3을 계산하는 데 사용되는 알고리즘을 사용하면 문자열 끝에서 위치 18에 있어야하는 것이 편리합니다.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
    ]
  )

테스트


parseInt반복 합계와 곱셈으로 숫자를 사용 하고 계산 하지 않고 많은 바이트를 절약 할 수 있습니다 . 이것은 기수 3에서는 유효하지 않지만 1 * 9 + 2 * 6 + 3 == 18을주는 '0123'의 문제를 피합니다. 이는 좋은 위치입니다. 결과 :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 큰 제안입니다. 감사!
user81655

0

파이썬 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))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.