더블 퀸으로 골프를 즐기세요!


18

안녕하세요, 신사 숙녀 여러분.

오늘 밤-코드 도전이 있습니다. 점수의 양 (라소 스테로이드)이 아니라 단순히 그것을 끝낼 수 있는지 (라 젤다)로 정의되는 경쟁 그리고 비교를 위해 바이트의 양 (어 ...하지만 당신은 말했다 ...).

귀하의 과제는 WhiteSpace 와 선택한 다른 언어로 컴파일되는 단일 quine을 작성하는 것 입니다. 두 퀴인은 모두 동일한 출력을 가져야합니다 (퀴인은 소스 코드와 완전히 동일 함). quine의 길이는 3 바이트 이상이어야합니다.

점수는 소스 코드의 크기 (바이트)입니다.

이 문제에는 WhiteSpace가 포함되어 있으므로 C 스타일과 같이 명확하게 대답을 피하십시오. 점수는 이스케이프 된 버전이 아닌 바이트 단위의 원본입니다.

행운을 빕니다.


1
xxd의 진수 덤프합니까?
Ilmari Karonen

예. 받아 들일 게요
lochok

답변:


19

공백 및 Perl, 992975 문자

좋은 저녁입니다 신사 숙녀 여러분.

우선 base64로 인코딩 된 제출물이 있는데, 이것이 큰 공백 프로그램을 전달하는 가장 좋은 방법이라고 생각합니다. (실제로 공백을 남겨 두는 인코딩을 사용하고 싶지 않으므로 더 "읽기 쉬운"항목을 선택할 필요가 없습니다.

c2F5PDwgeDI7c2F5PDwwLDAgIApzYXk8PCB4MjtzYXk8PDAsMCAgCgoJCQogICAJCSAgCSAgCSAJ
CSAgCSAgCQkgCSAJIAkJCQkJICAJCSAJCQkgCQkJCQkgCSAJIAkJIAkgCSAgIAkJCQkJICAgCQkg
IAkgCQkgCSAJCSAJICAgIAkJCQkgCSAgCSAJCSAJICAgIAkgCQkgICAJICAgICAgCQkJIAkJCQkJ
IAkJCSAJCQkJICAgICAJCQkgCSAgICAgIAkJCQkJICAgICAgCQkgICAJCSAgICAJCQkJCQkJCSAg
CSAJIAkgICAJCQkgICAJCQkJCSAgCQkJCSAJICAgIAkgCQkJCQkgCSAgICAgCSAgCSAJICAgICAg
CSAgICAJICAgICAJCSAgIAkJCSAJIAkJCQkJCSAJCSAJIAkgICAgICAgCQkgIAkgICAgICAgICAg
IAkJICAgCSAJCQkgCSAgICAgCQkJCQkJIAkgICAgCQkJCSAJCQkJICAJCQkgICAJCQkgCSAgCSAg
IAkJCQkgIAkJIAkJCSAgIAkJCSAJCQkgCQkJICAJCSAJICAJIAkJCSAJIAkgCQkgICAgIAkgCSAJ
ICAJICAJIAkJICAgICAJIAkgICAgCQkJCSAgCSAJCSAJIAkJIAkgIAkgCSAJCSAJCSAJCSAJCQkg
CQkJICAgIAkJCSAgCSAgCQogICAJICAgICAJCQkJCSAJCSAJIAkgCSAJICAJCQkgICAJICAgCSAg
ICAJCSAJICAgICAgICAgCSAgIAkJCQkgCQkgICAgCQkgCSAJICAJCQkgCQkJCSAJCQkgICAJICAg
IAkgCSAJCQkgIAkJCQkgCSAJCSAJIAkgCQkJCSAJICAJIAkJIAkgICAJCiAKICAKICAgIAogCSAg
CQoKICAJCiAKICAgIAkJCQkgCSAKCSAJCQkKICAgICAJCQkJIAkgCgkgCSAgCiAgIAkJCgkgIAoK
CQkJCiAKCgoJIAkKICAgCSAgIAkgIAoKIAkKIAkgIAkKCiAJIAogICAJIAoKIAkKCiAJIAoKIAkK
CQogCSAgIAkgCgogCQoKCgoKICAgCiAgIAogCiAKIAkKCiAJCgogICAgCiAKIAoJIAogCiAgICAJ
IAoJIAkJIAoJICAgCSAKCSAJIAogCSAgCgogIAogCiAgICAJCQoJIAkJICAJCSAJCQkKCSAgCiAg
CQkJICAgCgkgCQkgICAJICAgICAKCSAgIAkKICAgICAJCQoJIAkgIAogICAJCQoJICAKCgkJCiAK
CgoJCjAK

다음은 소스의 모든 보이는 부분을 강조한 발췌 부분입니다. 을 나타내고 개행을 나타내는 데 사용됩니다 .

say<< x2;say<<0,0  ↲
say<< x2;say<<0,0  ↲
↲
⇥⇥↲
   ⇥⇥  ⇥ [... etcetera ... skipping rest of a really long line ...]↲
   ⇥⇥⇥ ⇥⇥[... etcetera ... shorter but still quite a long line ...]↲
 ↲
  ↲
    ↲
 ⇥  ⇥↲
[... etcetera ... whole lotta whitespace in here ...]
⇥⇥↲
 ↲
↲
↲
⇥↲
0↲

펄은이 도전에서 제 2 언어를위한 자연스러운 선택이었으며, 콤팩트 한 퀴를 쓰는 데 가장 적합한 범용 언어 중 하나였습니다. 가장 짧은 Perl quine은 19 바이트입니다.

say<< x2
say<< x2
 

– 그리고 더블 퀴인의 펄 반쪽의 씨앗이 어떻게되는지 볼 수 있습니다. 필자의 최상의 공백 퀴네 길이는 541 바이트입니다. (단지 짧은 것이 존재하지만 내가 본 것 중 최고는 445 바이트입니다.)

Perl 인터프리터의 관점에서, 더블 퀴네 소스 파일의 첫 줄에는 나머지 내용이 인용 된 두 문자열이기 때문에 전체 프로그램을 적절하게 구성하는 두 개의 문장이 포함됩니다. 첫 번째 문자열은 Perl의 반복 된 행이며 공백의 세 번째 행으로 구분됩니다. 두 번째 문자열은 모두 공백이며 소스의 네 번째 줄부터 0파일 맨 아래의 구분 기호까지 이어집니다.

공백 프로그램으로 사용하면 처음 네 줄에는 크게 쓸모가없는 세 가지 명령이 포함됩니다. (그 효과는 두 개의 0 값을 스택에 넣은 다음 두 번째 값을 버리는 것입니다.) Perl 프로그램에 필요한 줄 바꿈을 안전하게 통과하기 위해 포함됩니다. 실제 프로그램은 그 후에 시작됩니다. 읽을 수없는 소스를 더 인용하지 않고 다음과 같이 어셈블리와 같은 형식으로 공백 프로그램을 구성하는 명령어를 설명합니다.

# Representation of "say<< ;say<<0,0  \n" in base 122 as ASCII chars.
PERLCODE = 44892457841068708924520433691075560592081

# Represention of the whitespace program, following the "push PERLCODE"
# instruction, in base 3 (see comments on wsout).
WSCODE = 9823454421986355730445143846606456399449033186160554878002671428613111806443504867738858766142050504887335990409088441824104338753030405625930185

# Set up the stack and the heap. The first three instructions are not
# particularly useful; they're just there to skip past the newlines in
# the Perl code. (Though the initial zero on the stack does get used
# at the very end.)

        push    0
        push    0
        jneg    wsout

        push    WSCODE
        push    PERLCODE
        dup
        dup
        push    0
        copy    1

# Output the first four lines of the file.

perl:   dup
        mod     122
        putchar
        div     122
        dup
        jnzero  perl
        pop
        jzero   perl
        push    68              # represents "jneg wsout"
        call    wsout

# Output the rest of the file.

        copy    1
        call    pushout
        push    2
        call    wsout
        call    pushout
        call    wsout
        putnum
        push    2
        call    wsout
        exit

# pushout: Output a Whitespace push instruction, using the number on
# the top of the stack as the instruction's argument. (Recursion is
# used to output the bits MSB-first.)

pushout:
        push    0
        dup
        call    wsout
        call    wsout
bits:   dup
        jzero   bitend
        dup
        mod     2
        swap
        div     2
        call    bits
bitend: call    wsout
        ret

# wsout: Output a sequence of whitespace characters as represented by
# the number on the top of the stack. The number is read in base 3,
# LSB-first, with 0 = SPC, 1 = TAB, 2 = NL. Calling wsout with a value
# of zero will output a single space.

wsout:
        dup
        mod     3
        mul     -23             # some ugly math that transforms
        mod     -24             # (0, 1, 2) into (32, 9, 10)
        add     32
        putchar
        div     3
        dup
        jnzero  wsout
        pop
        ret

상단의 숫자는 실제 사용자 대신 공백 사용자가 사용해야하는 숫자입니다. 적절한 bignum 지원이없는 공백 인터프리터에서이를 실행하려고하지 마십시오.

마지막으로 여기에 다시 프로그램이 있지만 이번에는 구체적으로 요청되었으므로 C 스타일 이스케이프를 사용합니다.

say<< x2;say<<0,0  \nsay<< x2;say<<0,0  \n\n\t\t\n   \t\t  \t  \t \t\t  \t  \t\t \t \t \t\t\t\t\t  \t\t \t\t\t \t\t\t\t\t \t \t \t\t \t \t   \t\t\t\t\t   \t\t  \t \t\t \t \t\t \t    \t\t\t\t \t  \t \t\t \t    \t \t\t   \t      \t\t\t \t\t\t\t\t \t\t\t \t\t\t\t     \t\t\t \t      \t\t\t\t\t      \t\t   \t\t    \t\t\t\t\t\t\t\t  \t \t \t   \t\t\t   \t\t\t\t\t  \t\t\t\t \t    \t \t\t\t\t\t \t     \t  \t \t      \t    \t     \t\t   \t\t\t \t \t\t\t\t\t\t \t\t \t \t       \t\t  \t           \t\t   \t \t\t\t \t     \t\t\t\t\t\t \t    \t\t\t\t \t\t\t\t  \t\t\t   \t\t\t \t  \t   \t\t\t\t  \t\t \t\t\t   \t\t\t \t\t\t \t\t\t  \t\t \t  \t \t\t\t \t \t \t\t     \t \t \t  \t  \t \t\t     \t \t    \t\t\t\t  \t \t\t \t \t\t \t  \t \t \t\t \t\t \t\t \t\t\t \t\t\t    \t\t\t  \t  \t\n   \t     \t\t\t\t\t \t\t \t \t \t \t  \t\t\t   \t   \t    \t\t \t         \t   \t\t\t\t \t\t    \t\t \t \t  \t\t\t \t\t\t\t \t\t\t   \t    \t \t \t\t\t  \t\t\t\t \t \t\t \t \t \t\t\t\t \t  \t \t\t \t   \t\n \n  \n    \n \t  \t\n\n  \t\n \n    \t\t\t\t \t \n\t \t\t\t\n     \t\t\t\t \t \n\t \t  \n   \t\t\n\t  \n\n\t\t\t\n \n\n\n\t \t\n   \t   \t  \n\n \t\n \t  \t\n\n \t \n   \t \n\n \t\n\n \t \n\n \t\n\t\n \t   \t \n\n \t\n\n\n\n\n   \n   \n \n \n \t\n\n \t\n\n    \n \n \n\t \n \n    \t \n\t \t\t \n\t   \t \n\t \t \n \t  \n\n  \n \n    \t\t\n\t \t\t  \t\t \t\t\t\n\t  \n  \t\t\t   \n\t \t\t   \t     \n\t   \t\n     \t\t\n\t \t  \n   \t\t\n\t  \n\n\t\t\n \n\n\n\t\n0\n

2
와! 나는 brainfuck이 첫 번째 해결책 일 것이라고 생각했습니다.
boothby

1
나는 그것에 대해 생각했지만 문제는 Brainfuck quines가 공백 quines보다 훨씬 길다는 것입니다. 그 둘 사이에서 결과는 거대했을 것입니다.
breadbox
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.