당신에게 큰 이익을 위해 골프를하세요!


204

선택한 언어를 사용하여 골프를 즐기십시오 .

quine는 유일한 출력으로 자신의 소스 코드의 복사본을 더 입력을지지 않습니다 및 생산 비어 있지 않은 컴퓨터 프로그램입니다.

부정 행위가 없습니다. 즉, 소스 파일을 읽고 인쇄 할 수 없습니다. 또한 많은 언어에서 빈 파일도 quine입니다. 이는 합법적 인 quine으로 간주되지 않습니다.

오류 quines 없음- 오류 quines에 대해 이미 별도의 시도 가 있습니다.

포인트 :

  • 가장 작은 코드 (바이트)
  • 가장 난독 화 된 / 모호한 솔루션
  • 난해한 / 불분명 한 언어 사용
  • 골프하기 어려운 언어를 성공적으로 사용

다음 스택 스 니펫을 사용하여 각 언어의 현재 점수를 빠르게 확인할 수 있으므로 기존 답변이있는 언어와 어떤 종류의 목표를 달성해야하는지 알 수 있습니다.


4
"당신은 더 큰 이익을위한 골프 야!"를
Mateen Ulhaq

50
@muntoo "그것은 당신에게 큰 이익을 위해 Haskell을 배우십시오"에 대한 연극입니다.
Rafe Kettler

답변:


106

Hexagony 측면 길이 17 16 816 705 바이트

180963109168843880558244491673953327577233938129339173058720504081484022549811402058271303887670710274969455065557883702369807148960608553223879503892017157337685576056512546932243594316638247597075423507937943819812664454190530214807032600083287129465751195839469777849740055584043374711363571711078781297231590606019313065042667406784753422844".".>.@.#.#.#.#.#.#.#.>.(...........................<.".......".".>./.4.Q.;.+.<.#.>...........................<.".....".".>.#.#.>.N.2.'.\.>.............=.=......._.<.".....".".>.>.;.'.=.:.\.>.......................<."...".".>.\.'.%.'.<.#.>..............._.....<."...".".>.#.#.>.<.#.>...............=.=.<.".".".>.#.\.'.R./.>.................<.".!.........../.>.

온라인으로 사용해보십시오!

이것이 펼쳐진 것처럼 보입니다.

                1 8 0 9 6 3 1 0 9 1 6 8 8 4 3 8
               8 0 5 5 8 2 4 4 4 9 1 6 7 3 9 5 3
              3 2 7 5 7 7 2 3 3 9 3 8 1 2 9 3 3 9
             1 7 3 0 5 8 7 2 0 5 0 4 0 8 1 4 8 4 0
            2 2 5 4 9 8 1 1 4 0 2 0 5 8 2 7 1 3 0 3
           8 8 7 6 7 0 7 1 0 2 7 4 9 6 9 4 5 5 0 6 5
          5 5 7 8 8 3 7 0 2 3 6 9 8 0 7 1 4 8 9 6 0 6
         0 8 5 5 3 2 2 3 8 7 9 5 0 3 8 9 2 0 1 7 1 5 7
        3 3 7 6 8 5 5 7 6 0 5 6 5 1 2 5 4 6 9 3 2 2 4 3
       5 9 4 3 1 6 6 3 8 2 4 7 5 9 7 0 7 5 4 2 3 5 0 7 9
      3 7 9 4 3 8 1 9 8 1 2 6 6 4 4 5 4 1 9 0 5 3 0 2 1 4
     8 0 7 0 3 2 6 0 0 0 8 3 2 8 7 1 2 9 4 6 5 7 5 1 1 9 5
    8 3 9 4 6 9 7 7 7 8 4 9 7 4 0 0 5 5 5 8 4 0 4 3 3 7 4 7
   1 1 3 6 3 5 7 1 7 1 1 0 7 8 7 8 1 2 9 7 2 3 1 5 9 0 6 0 6
  0 1 9 3 1 3 0 6 5 0 4 2 6 6 7 4 0 6 7 8 4 7 5 3 4 2 2 8 4 4
 " . " . > . @ . # . # . # . # . # . # . # . > . ( . . . . . .
  . . . . . . . . . . . . . . . . . . . . . < . " . . . . . .
   . " . " . > . / . 4 . Q . ; . + . < . # . > . . . . . . .
    . . . . . . . . . . . . . . . . . . . . < . " . . . . .
     " . " . > . # . # . > . N . 2 . ' . \ . > . . . . . .
      . . . . . . . = . = . . . . . . . _ . < . " . . . .
       . " . " . > . > . ; . ' . = . : . \ . > . . . . .
        . . . . . . . . . . . . . . . . . . < . " . . .
         " . " . > . \ . ' . % . ' . < . # . > . . . .
          . . . . . . . . . . . _ . . . . . < . " . .
           . " . " . > . # . # . > . < . # . > . . .
            . . . . . . . . . . . . = . = . < . " .
             " . " . > . # . \ . ' . R . / . > . .
              . . . . . . . . . . . . . . . < . "
               . ! . . . . . . . . . . . / . > .
                . . . . . . . . . . . . . . . .

아, 이건 꽤 감정적 인 롤러 코스터였습니다 ... 나는 "하하, 이건 광기 야"와 "기다려, 이걸 하면 실제로 할 수있는 것" 사이에서 전환 한 횟수를 세지 않았습니다 . Hexagony의 레이아웃 규칙에 의해 코드에 부과 된 제약 조건은 ... 심각했습니다.

일반적인 접근 방식을 변경하지 않고 1 또는 2로 사이드 길이를 줄일 수있을 수도 있지만 (만 세포는 힘들 것 #현재 사용되지 않는 디코더 사용 가능). 현재로서는 더 효율적인 접근 방식에 대한 아이디어가 전혀 없지만 그 존재가 확실합니다. 나는 며칠 동안 이것을 생각하고 설명과 모든 것을 추가하기 전에 한쪽 길이로 골프를 치려고합니다.

적어도 나는 그것이 가능하다는 것을 증명했습니다 ...

내 미래의 참조를위한 일부 CJam 스크립트 :


51
pete 님,이게 뭐야?
Conor O'Brien

2
이것을 만드는 데 얼마나 걸렸습니까?
Adnan

3
@AandN 나는 어제부터 일반적인 "템플릿"에 대한 개념을 가지고 놀았습니다. (실제 테스트는 포함되지 않았습니다. 7x7 그리드에 몇 가지 내용을 입력하고 작동하는지 확인하십시오 .. 나는 이미 거기에 십여 가지 접근 방식을 버렸다). 실제 코딩은 오늘 저녁에 ... 3 시간 정도 걸렸습니다.
Martin Ender

10
Esoteric IDE를 사용하여 단계별로 이것을 볼 때 얼마나 놀랐는지 단어는 설명 할 수 없습니다 ...이 육각형을 이해하기를 원하는 사람 에게이 육각형은 "디코더"부분을 정수로 인코딩 !한 다음 /마지막 두 번째 줄의 미러 는 디코더 코드를 인쇄하여 quine을 완료하기 위해 디코더로 들어갑니다. 이것은 기적적으로 사용 <되며 여러 줄의 >매우 큰 정수를 읽고 디코더를 저장하기위한 영역을 구축했습니다. "수십 가지 접근 방식"이 무엇을 고려하고 있는지 알고 싶습니다.
Sunny Pun

3
설명? ---
MD XF

77

MySQL, 167 자

SELECT REPLACE(@v:='SELECT REPLACE(@v:=\'2\',1+1,REPLACE(REPLACE(@v,\'\\\\\',\'\\\\\\\\\'),\'\\\'\',\'\\\\\\\'\'));',1+1,REPLACE(REPLACE(@v,'\\','\\\\'),'\'','\\\''));

맞습니다. :-)

나는 이것을 직접 작성했다. 원래 내 사이트에 게시되었습니다 .


72

GolfScript, 2 바이트

1

(마지막 줄 바꿈 참고) 이렇게하면 숫자 1이 스택으로 푸시됩니다. 프로그램이 끝나면 GolfScript는 스택의 모든 항목을 공백없이 인쇄 한 다음 줄 바꿈을 인쇄합니다.

이것은 실제로 코드를 실행하기 때문에 (질문에 나열된) 진정한 퀴네입니다. 단지 PHP 제출과 달리 "소스 파일을 읽고 인쇄"하는 것이 아닙니다.


다른 예를 들어, 다음은 인쇄 할 GolfScript 프로그램입니다 12345678.

9,(;
  1. 9: 스택에 9를 밀어 넣습니다.
  2. ,: 9를 인수로 사용하여 배열 [0 1 2 3 4 5 6 7 8]을 스택으로 푸시하십시오.
  3. (: 배열을 인수로 사용하고 배열과 [1 2 3 4 5 6 7 8]항목 0을 스택으로 푸시하십시오.
  4. ;: 스택의 최상위 항목을 버립니다.

스택은 이제 배열을 포함합니다 [1 2 3 4 5 6 7 8]. 이것은 요소 사이에 공백없이 표준 출력에 기록되고 줄 바꿈 이옵니다.


18
또는 PowerShell 또는 PHP :-)
Joey

6
당신은 시간을 거슬러 올라가지 않고 발명가에게 GolfScript를 발명 할 아이디어를주었습니다.
Mateen Ulhaq

78
엄밀히 1말하면 GolfScript에서는 퀴네가 아닙니다 : 출력 1\n(여기서 \n줄 바꿈을 나타냄) 그러나 두 문자 프로그램 1\n 엉망입니다.
Ilmari Karonen

17
한 문자 프로그램도 \n아마?
Lynn

10
@ 가명 quine은 말 그대로 자체 소스를 인쇄하는 프로그램입니다. "구조"에 대한 임의의 제한이 없다고 생각합니다.
Hugo Zink

71

Brain-Flak , 9.8e580 1.3e562 9.3e516 12818 11024 4452 4332 4240 4200 4180 3852 3656 3616 3540 2485 + 3 = 2488 바이트

이제 관측 가능한 우주에 맞습니다!

(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(())(())(()())(())(())(())(()())(()()()())(())(()()()()())(()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(())(())(()())(())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(())(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(()()())(())(()()())(())(())(())(()())(()()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(())(())(())(()()())(())(())(())(()())(())(()())(()()()())(())(())(()()()()())(()())(()())(())(()()())(())(())(())(())(()()())(()())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(()()()()())(())(()()())(())(())(()())(())(()()()()())(())(()()()()())(())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()()()())(())(()()()()())(())(())(())(()())(())(()()()()())(())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()()()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(())(()())(()()()())(())(())(()())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(()()())(())(())(()())(())(())(()()()()())(()()()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(()()()())(()()()())(()())([[]]){({}()<(([{}]())<{({}())<>(((((()()()()()){}){}){}())[()])<>{({}())<>{}({}(((()()()){}())){}{})<>{({}())<>({}(((()()()()()){})){}{}())<>{{}<>({}(((()()()()){}){}){})(<>)}}<>(({})[()()])<>}}{}<>({}(<()>)<><{({}<>)<>}<>>){({}<>)<>}{}(<>)<>{({}<>)<>}{}(((((((()()()()()){}){}){}))()))>){({}()<((({}[()])()))>)}{}<>{({}<>)<>}{}>)}{}<>{({}<>)<>}<>

온라인으로 사용해보십시오!


설명

이 Quine는 비의 언어로 대부분의 Quines처럼 작동합니다. 인코더와 디코더의 두 부분으로 구성됩니다. 인코더는 처음에 모든 괄호이고 디코더는 끝에서 더 복잡한 부분입니다.

프로그램을 인코딩하는 순진한 방법은 디코더에있는 모든 문자의 ASCII 값을 스택에 넣는 것입니다. Brain-Flak은 8 자 ( ()<>[]{}) 만 사용 하므로 정보를 거의 인코딩하지 않기 위해 약간의 바이트를 지불하게되므로 이는 좋은 생각이 아닙니다 . 더 똑똑한 아이디어와 지금까지 사용 된 아이디어는 8 개의 중괄호 각각을 훨씬 작은 숫자 (1-8)에 할당하고 디코더로 ASCII 값으로 변환하는 것입니다. 이전 252와 달리 문자를 인코딩하는 데 18 바이트를 넘지 않기 때문에 좋습니다.

그러나이 프로그램은 그렇지 않습니다. Brain-Flak 프로그램은 모두 8 개의 중괄호를 숫자 5까지 인코딩하도록 균형이 맞춰져 있다는 사실에 의존합니다. 다음과 같이 인코딩합니다.

(       -> 2
<       -> 3
[       -> 4
{       -> 5
),>,],} -> 1

컨텍스트를 사용하여 특정 시나리오에서 사용해야하는 괄호 중 하나를 지정할 수 있으므로 모든 닫기 괄호에는 1이 할당됩니다. 이것은 Brain-Flak 프로그램의 어려운 작업처럼 들릴 수 있지만 실제로는 그렇지 않습니다. 예를 들어 열린 괄호가 해독되고 닫힌 괄호가 다음으로 대체 된 다음 인코딩을 사용하십시오 ..

(.
((..
<([.{...

알고리즘이 매우 간단하다는 것을 알 수 있기를 바랍니다. 왼쪽에서 오른쪽으로 읽습니다. 오픈 버팀대가 생길 때마다 닫는 버팀대를 가상 스택으로 밀고 우리가 만나면 .최상위 값을 팝하고 대신 .. 이 새로운 인코딩은 인코더에서 많은 수의 바이트를 절약하면서도 디코더에서 몇 바이트 만 잃게됩니다.

저수준 설명

진행중인 작업


25
나는 당신이 코드 골프 도전에 대한 가장 긴 해결책을이기는 것 같아요 ...
Mego

18
PPCG Nope 의 역사상 가장 큰 싱글 골프를 만들었습니다 . 9.8e580 은 여전히 ​​인상적입니다.
Dennis

19
관측 가능한 우주에 맞추기 위해 +1. 또한 TIO Nexus의 경우 영구 링크가 답에 맞아야합니다. tio.run/nexus/…
Dennis

3
... 매우 큰 골프 ...
파괴 가능한 레몬

3
나는 당신이 대부분의 바이트 컷에서 이길 것 같아요
Christopher

68

서곡 , 5,157 4,514 2,348 1,761 1,537 664 569 535 423 241 214 184 178 175 169 148 142 136 133 바이트

3 바이트를 절약 한 Sp3000에 감사합니다.

이것은 다소 길다 ... (좋아, 아직 길다. 적어도 지금은이 도전에 대해 가장 짧은 알려진 Brainfuck C # quine을 치고있다. ) 그러나 그것은 내가 스스로 발견 한 첫 번째 quine이다 (내 Lua와 Julia 제출은 실제로 단지 다른 언어로 된 표준 퀴네 기술) 그리고 지금까지 아무도 Prelude에서 퀴네를 쓰지 않았다는 것을 알고있는 한, 나는 이것을 정말로 자랑스럽게 생각합니다. :)

7( -^^^2+8+2-!( 6+ !
  ((#^#(1- )#)8(1-)8)#)4337435843475142584337433447514237963742423434123534455634423547524558455296969647344257)

이 숫자가 핵심 코드의 인코딩 일 뿐이므로 quine이 너무 길다.

퀴인을 인코딩하는 숫자는 이 CJam 스크립트 로 생성되었습니다 .

이를 위해서는 문자를 인쇄하는 표준 호환 인터프리터가 필요합니다 (값을 문자 코드로 사용). 따라서 파이썬 인터프리터 를 사용 하는 경우을 설정해야합니다 NUMERIC_OUTPUT = False.

설명

우선 Prelude에 대한 몇 마디 : Prelude의 각 줄은 자체 스택을 조작하는 별도의 "음성"입니다. 이 스택은 무한대의 0으로 초기화됩니다. 프로그램은 열 단위로 실행되며, 열의 모든 명령은 이전 스택 상태에 따라 "동시"실행됩니다. 숫자는 스택에 개별적으로 42푸시 되므로 a 4를 누른 다음 a를 푸시 합니다 2. 더 큰 숫자를 직접 입력 할 수있는 방법이 없으므로 숫자를 더해야합니다. 값은 인접한 스택에 복사 할 수 있습니다 v^. Brainfuck 스타일 루프는 괄호로 소개 할 수 있습니다. 자세한 내용은 헤드 라인의 링크를 참조하십시오.

quine의 기본 개념은 다음과 같습니다. 먼저 quine의 핵심을 인코딩하는 스택에 많은 자릿수를 푸시합니다. 그런 다음 코어는 해당 숫자를 가져 와서 자체 인쇄하도록 해독 한 다음 코드에 표시되는 숫자를 (및 후행 )) 인쇄합니다.

코어를 여러 줄로 나눠야하기 때문에 약간 복잡합니다. 원래는 처음에 인코딩을했지만 다른 줄을 같은 수의 공백으로 채워야했습니다. 이것이 초기 점수가 모두 너무 큰 이유입니다. 이제 인코딩을 마지막에 넣었지만 먼저 코어를 건너 뛰고 숫자를 누른 다음 다시 시작으로 이동하여 인쇄해야합니다.

인코딩

코드는 두 가지 음색을 가지고 있으며, 이후 인접는 순환이다, ^v동의어입니다. v문자 코드가 가장 큰 것이 좋으므로 항상 사용하여 코드를 피 ^하면 인코딩이 더 간단 해집니다. 이제 모든 문자 코드의 범위는 10-94입니다. 즉, 각 문자를 정확히 두 개의 10 진수로 인코딩 할 수 있습니다. 그래도 한 가지 문제가 있습니다. 일부 문자, 특히 줄 바꿈은 10 진수로 0을 갖습니다. 0은 스택의 바닥과 쉽게 구분할 수 없기 때문에 문제가됩니다. 운 좋게도 그에 대한 간단한 수정이 있습니다 : 우리는 문자 코드를로 오프셋 2하므로 12에서 96까지의 범위를 가지며 여전히 두 개의 십진수로 편안하게 맞습니다. Prelude 프로그램에 나타날 수있는 모든 문자 중0(50)의 표현에는 0이 있지만 실제로는 전혀 필요하지 않습니다 0. 이것이 제가 사용하는 인코딩으로, 각 숫자를 개별적으로 밀어냅니다.

그러나 스택으로 작업하기 때문에 표현이 반대로 진행됩니다. 따라서 인코딩의 끝을 보면 :

...9647344257

쌍으로 나누고 뒤집은 다음 2를 빼고 문자 코드를 찾습니다.

57 42 34 47 96
55 40 32 45 94
 7  (     -  ^

어디에 32공백에 해당합니다. 코어는이 변환을 정확하게 수행 한 다음 문자를 인쇄합니다.

핵심

이 숫자들이 실제로 어떻게 처리되는지 봅시다. 먼저 Prelude에서 일치하는 괄호가 같은 줄에있을 필요는 없습니다. 열당 하나의 괄호 만있을 수 있으므로 괄호가 함께 모호한 모호성은 없습니다. 특히 닫는 괄호의 세로 위치는 항상 관련이 없습니다. 루프가 종료되는지 (또는 완전히 건너 뛰는 지)를 확인하기 위해 검사되는 스택은 항상 (.

코드를 정확히 두 번 실행하려고합니다. 처음에는 코어를 건너 뛰고 마지막에 모든 숫자를 푸시하고 두 번째는 코어를 실행합니다. 실제로 코어를 실행 한 후에는 모든 숫자를 다시 푸시하지만 루프가 종료 된 이후에는 관련이 없습니다. 이것은 다음과 같은 골격을 제공합니다.

7(
  (                   )43... encoding ...57)

첫째, 우리는 밀어 7최초의 음성에 - 우리가 이렇게하지 않으면 (이 특별히 이유 ... 그것은이 제로가 아닌 만 중요한 골격을 위해, 우리는 루프를 입력하지 않겠다고 7우리가 나중에 볼 수 있습니다) . 그런 다음 메인 루프로 들어갑니다. 이제 두 번째 음색에는 다른 루프가 있습니다. 첫 번째 패스에서 두 번째 스택이 비어 있거나 0 만 포함하기 때문에이 루프는 건너 뜁니다. 따라서 인코딩으로 바로 이동하여 모든 숫자를 스택에 넣습니다. 7우리 제 스택으로 푸시 여전히 존재하므로, 루프 반복한다.

이번에 7는 두 번째 스택 에도 on이 있으므로 두 번째 음성에는 루프를 입력합니다. 두 번째 음색의 루프는 마지막에 스택이 다시 비워 지도록 설계되었으므로 한 번만 실행됩니다. 이 것 또한 최초의 스택을 고갈 ... 그래서 우리는 두 번째 음성에 루프를 떠날 때, 우리는 다시 모든 숫자를 밀어하지만 지금은 7메인 루프 종료되고 프로그램이 종료되도록 첫 번째 스택은 폐기되었습니다.

다음으로 실제 코어의 첫 번째 루프를 살펴 보겠습니다. 과 동시에 일을 (하거나하는 것은 )매우 흥미로운 일이다. 여기에 루프 본문을 표시했습니다 =.

-^^^2+8+2-!
(#^#(1- )#)
 ==========

이는 포함하는 열 (이 루프의 일부로 간주되지 않음을 의미합니다 (루프를 건너 뛴 경우에도 한 번만 실행되는 문자). 그러나이 포함 된 열 ) 입니다 루프의 일부가 반복 될 때마다 한 번 실행됩니다.

그래서 우리는 하나의 시작 -을 전환하는 7에 첫 스택에 -7나중에 그에 다시 .... 실제 루프는 ...

숫자 스택이 비워지지 않은 상태에서 루프가 계속됩니다. 한 번에 두 자리 숫자를 처리합니다. 이 루프의 목적은 인코딩을 디코딩하고 문자를 인쇄하며 동시에 숫자 스택을 첫 번째 음성으로 이동하는 것입니다. 이 부분부터 먼저 :

^^^
#^#

첫 번째 열은 1 자리 숫자를 첫 번째 음성으로 이동합니다. 두 번째 열은 10 자리를 첫 번째 음성으로 복사하고 1 자리를 두 번째 음성으로 다시 복사합니다. 세 번째 열은 해당 사본을 첫 번째 음성으로 다시 이동합니다. 즉, 첫 번째 음성은 이제 1 자리 숫자가 2 자리이고 10 자리 숫자가 10 자리입니다. 두 번째 음성에는 10 자리의 다른 사본 만 있습니다. 즉, 스택 상단의 값으로 작업하고 나중에 첫 번째 스택에 두 개의 사본이 남아 있는지 확인하십시오.

이제 두 자리에서 문자 코드를 복구합니다.

2+8+2-!
(1- )#

맨 아래는 10 자리를 0으로 줄이는 작은 루프입니다. 각 반복마다 상단에 10을 추가하려고합니다. 첫 번째 2는 루프의 일부가 아니므로 루프 바디는 실제로 +8+210을 더하고 ( 2이전 에 푸시 한 것을 사용하여 ) 다른 2를 푸시합니다. 따라서 루프로 완료되면 첫 번째 스택에는 실제로 기본이 있습니다. 10의 값과 또 다른 2 -입니다. 인코딩에서 오프셋을 설명하기 위해 2를 빼고을 사용하여 문자를 인쇄합니다 !. 은 #바로 바닥 루프의 끝에서 제로를 삭제합니다.

이 루프가 완료되면 두 번째 스택은 비어 있고 첫 번째 스택은 모든 숫자를 역순으로 (그리고 -7아래쪽에) 보유합니다. 나머지는 매우 간단합니다.

( 6+ !
8(1-)8)#

이것은 코어의 두 번째 루프이며 이제 모든 숫자를 다시 인쇄합니다. 정확한 문자 코드를 얻으려면 각 숫자에 48을 입력해야합니다. 우리는 8시간 을 실행 하고 6매번 추가 하는 간단한 루프 로이 작업을 수행합니다 . 그 결과로 인쇄 !하고 8끝은 다음 반복을위한 것입니다.

그래서 어떻 -7습니까? 예, 48 - 7 = 41의 문자 코드입니다 ). 마법!

마지막으로 루프가 끝나면 외부 루프를 두 번째 음성에 남겨두기 위해 8푸시 한 것을 버립니다 #. 모든 자릿수를 다시 누르면 프로그램이 종료됩니다.



19
마틴 어딘가에서 멈춰야 해
seequ

3
나는 이것이 전체적으로 5000 바이트 이상의 골프를 치고 Sp3000에 대한 3 개의 저축에 대한 승인을 좋아합니다.
카밀 드라 카리

2
@KamilDrakari 이것들은 마지막 3 바이트 였으므로 상당히 큰 문제입니다. ;)
Martin Ender

57

Hexagony , 측면 길이 11, 314 바이트

164248894991581511673077637999211259627125600306858995725520485910920851569759793601722945695269172442124287874075294735023125483.....!/:;.........)%'=a':\....................\...................\..................\.................\................\...............\..............\..$@.........\$><>'?2='%.<\:;_;4Q

온라인으로 사용해보십시오!


이전 버전 :

Hexagony , 측면 길이 11, 330 바이트

362003511553420961423766261426252539048636523959468260999944549820033581478284471415809677091006384959302453627348235790194699306179..../:{;+'=1P'%'a{:..\.....................\...................\..................\.................\................\...............\..............\.............\!$><........\..@>{?2'%<......:;;4Q/

온라인으로 사용해보십시오!

인코더 : 온라인으로 사용해보십시오!

이 프로그램은이 Python 코드와 거의 같습니다. 온라인으로 사용해보십시오!

펼쳐진 코드 :

           3 6 2 0 0 3 5 1 1 5 5
          3 4 2 0 9 6 1 4 2 3 7 6
         6 2 6 1 4 2 6 2 5 2 5 3 9
        0 4 8 6 3 6 5 2 3 9 5 9 4 6
       8 2 6 0 9 9 9 9 4 4 5 4 9 8 2
      0 0 3 3 5 8 1 4 7 8 2 8 4 4 7 1
     4 1 5 8 0 9 6 7 7 0 9 1 0 0 6 3 8
    4 9 5 9 3 0 2 4 5 3 6 2 7 3 4 8 2 3
   5 7 9 0 1 9 4 6 9 9 3 0 6 1 7 9 . . .
  . / : { ; + ' = 1 P ' % ' a { : . . \ .
 . . . . . . . . . . . . . . . . . . . . \
  . . . . . . . . . . . . . . . . . . . \ 
   . . . . . . . . . . . . . . . . . . \  
    . . . . . . . . . . . . . . . . . \   
     . . . . . . . . . . . . . . . . \    
      . . . . . . . . . . . . . . . \     
       . . . . . . . . . . . . . . \      
        . . . . . . . . . . . . . \       
         ! $ > < . . . . . . . . \        
          . . @ > { ? 2 ' % < . .         
           . . . . : ; ; 4 Q / .          

두 개의 .s는 1 비트를 사용합니다. 다른 문자는 1 비트와 기본 -97 자리를 사용합니다.

설명

큰 이미지를 보려면 이미지를 클릭하십시오. 각 설명 부분에는 이해를 돕기위한 해당 Python 코드가 있습니다.

데이터 부분

대신 (일부 다른 답변에서 사용되는 복잡한 구조 <, "그리고 다른 것들), 난 그냥 IP는 하단을 통과 할 수 있습니다.

데이터

첫째, IP는 많은 숫자와 무 작동 ( .) 및 미러 ( \)를 통해 실행됩니다 . 각 숫자는 메모리의 숫자에 추가되므로 결국 메모리 값은 프로그램 시작시의 숫자와 같습니다.

mem = 362003511...99306179

! 그것을 인쇄

stdout.write(str(mem))

그리고 $다음 통해 이동합니다 >.

에서 시작합니다 <. 메모리 값 mem이 잘못된 경우 ( <= 0즉, 조건 mem > 0이 충족되지 않은 경우) 프로그램 인쇄가 완료 되었으므로 종료해야합니다. IP는 상위 경로를 따릅니다.

출구

( 다른 곳에두면 약간의 추가 바이트가 발생하기 때문에 (프로그램 종료) 를 누르기 전에 약 33 개의 명령으로 전 세계 에서 IP를 실행하게하십시오 @)

그것이 사실이라면, 우리는 더 낮은 경로를 따르고, 몇 번 경로 재 지정되고, 다른 조건부에 도달하기 전에 더 많은 명령을 실행합니다.

# Python                    # Hexagony
# go to memory cell (a)     # {
a = 2                       # ?2
# go to memory cell (b)     # '
b = mem % a                 # %

이제 메모리는 다음과 같습니다

Mem1

가치가 진실이라면 :

if b > 0:

다음 코드가 실행됩니다.

# Python                    # Hexagony
b = ord('Q')                # Q
b = b*10+4                  # 4
# Note: now b == ord('.')+256*3
stdout.write(chr(b%256))    # ;
stdout.write(chr(b%256))    # ;

의 자세한 설명을 참조하십시오 Q4에서 MartinEnder의하여 HelloWorld Hexagony의 대답을 . 간단히 말해이 코드는 .두 번 인쇄 됩니다.

원래 나는 이것을 .한 번 인쇄하려고 계획했다 . 이것을 .두 번 인쇄 하고 구현했을 때 약 10 자리가 저장되었습니다.

그때,

b = mem // a                # :

여기에 약 14 자리가 절약되었다는 사실을 깨달았습니다. 시작 위치에 있지 않아도됩니다.


내가 말하는 것을 이해하기 위해 BF 비유를 봅시다. (이미 이해했다면 건너 뛰십시오)

주어진 코드

while a != 0:
    b, a = a * 2, 0
    a, b = b, 0
    print(a)

a현재 셀 b의 값을 오른쪽 셀의 값으로 가정하면 BF 로의 간단한 변환은 다음과 같습니다.

[             # while a != 0:
    [->++<]       # b, a = a * 2, 0
    >[-<+>]       # a, b = b, 0
    <.            # print(a)
]

그러나 프로그램을 진행하는 동안 항상 같은 위치에있을 필요는 없습니다. a각 반복이 시작될 때의 가치를 그대로 유지하면 다음 코드를 얻게됩니다.

[             # while a != 0:
    [->++<]       # b, a = a * 2, 0
                  # implicitly let (a) be at the position of (b) now
    .             # print(a)
]

몇 바이트 더 짧습니다.


또한 모서리 감싸기 동작으로 인해 \거울이 \생기는 .것을 막을 수 있습니다. 내가 없으면 숫자를 맞출 수 없습니다 ( 자체 +2 자리 , 오른쪽으로 짝 을 이루지 않은 경우 +2 자리) . 플래그)

(세부:

  • IP가 왼쪽 아래로 들어가고 왼쪽으로
  • 오른쪽 모서리로 뒤틀리고 여전히 왼쪽 머리
  • 그것을 \반영하는 a 를 만나면 이제 오른쪽으로 향합니다.
  • 모퉁이로 들어가 왼쪽 하단으로 다시 뒤 틀립니다.

)


위의 mod 2 연산의 값이 falsy (zero)이면 다음 경로를 따릅니다.

# Python                 # Hexagony   # Memory visualization after execution
b = mem // a             # :          # click here
base = ord('a') # 97     # a
y = b % base             # '%
offset = 33              # P1
z = y + offset           # ='+
stdout.write(chr(z))     # ;          # click here
mem = b // base          # {:         # click here

여기서는 너무 자세하게 설명하지 않지만 오프셋은 실제로 정확히는 33아니지만 33mod에 부합합니다 256. 그리고 chr암시 적 % 256입니다.


3
사람, 그것은 많은 노프입니다
Jo King

26
나는 "내가 말하는 것을 이해하기 위해 [BrainFuck] 비유를 보자"고 웃었다. PPCG에서만 ... :)
Lynn

2
나는 그것을
찬성

2
새 공간을 활용하여 310 바이트 를 줄임으로써 310 바이트
Jo King

2
더 많은 공간을 확보하여 308 바이트
Jo King

46

Vim, 11 바이트

q"iq"qP<Esc>hqP
  • iq"qP<Esc>: 녹음 외부 에 있어야 하는 텍스트 사본을 수동으로 삽입하십시오 .
  • q"hqP: 무명에 직접 내부를 기록 ""레지스터 때문에이 중간에 붙여 넣을 수 있습니다. 는 h필요한 경우에만 재배치입니다; 매크로 안에 넣으면 결과에 붙여 넣습니다.

편집하다

기록에 관한 참고 사항 q": 명명되지 않은 레지스터 ""는 재미있는 것입니다. 텍스트가 저장되지 않기 때문에 다른 것과 마찬가지로 실제 레지스터는 아닙니다. 실제로 다른 레지스터에 대한 포인터입니다 (보통 "-줄 바꿈이없는 삭제, 줄 바꿈 "0또는 "1줄 바꿈이있는 삭제). q"규칙을 어 기고; 실제로에 씁니다 "0. 귀하의 경우 ""이미 이외의 레지스터를 가리키는했다 "0, q"덮어 쓰게됩니다 "0만 남겨 ""변경. 새로운 Vim을 시작하면 ""자동 으로을 가리 키 므로이 "0경우에는 문제가 없습니다.

기본적으로 Vim은 이상하고 버그가 있습니다.


왜이 작품이 나를 위해 작동하지 않는지
Destructible Lemon

@DestructibleWatermelon 확실히 말할 수는 없지만 한 가지 설명이 가장 가능성이 높습니다. 아마도 사람들을 버릴 수 있기 때문에 글쓰기에 이미 있었을 것입니다. 편집 내용을 읽습니다.
udioica

y달리기 전에 누르 거나 누르는 것이 어떻게 도움이 될 수 있는지에 대한 정보를 넣어야합니다
Destructible Lemon

<Esc> 키를 누르는 것을 왜 사용하지 않습니까? 이 유니 코드 블록“제어 그림”의 일부
mbomb007

4
@ mbomb007 <Esc>표기법은 Vim 매핑 ( :help <>) 에서 표준이며 vimgolf.com이 사용하는 방식입니다. 경험이 많은 vimgolfer가 그것을 읽는 데 사용될 것입니다. 유니 코드의 경우 작은 글자를 읽으려면 곁눈질해야하며 입력하고 도움말 파일을 검색하는 방법을 모호하게합니다.
udioica

44

Cubix , 20 바이트

3434Qu$v@!<"OOw\o;/"

거의 \o/ ...

:

    3 4
    3 4
Q u $ v @ ! < "
O O w \ o ; / "
    . .
    . .

온라인으로 사용해보십시오

여기에서 보십시오 !

추가 사항

배경 이야기

@ ais523 의이 위대한 답변 을 읽음으로써 감동을받은 후 , 나는 퀴네를 더 골프 질하는 것에 대해 생각하기 시작했습니다. 결국, 거기에는 꽤 많은 놈이 없었고 압축되지 않았다. 그러나 그의 대답 (및 광산)이 사용하는 기술은 코드를 전체 라인으로 확장해야하므로 12 바이트 이상을 절약해야했습니다. 그의 설명에는 정말로 저를 생각하게 한 한 가지 언급이있었습니다.

더 이상 골프를 치는 주제에 대해, [...] 큐브의 윗면을 나타내는 [...] 다른 방법이 필요합니다 ...]

그런 다음 갑자기 일어나서 마실 물건을 얻기 위해 걸어 나갔을 때, 나는 충격을 받았다. 인쇄 할 숫자가 2 자리 인 경우 특히 짧습니다. Cubix 3 1 바이트 두 자리 숫자를 밀어 지침이 있습니다 N, S그리고 Q밀어 10, 32그리고 34각각을, 그래서 이것은 꽤 golfy해야한다, 나는 생각했다.

이 아이디어의 첫 번째 합병증은 이제 윗면에 쓸모없는 숫자가 채워져 더 이상 사용할 수 없다는 것입니다. 두 번째 합병증은 상단면의 크기가 정사각형 크기이고 균일 한 크기가 필요하다는 것입니다. 그렇지 않으면 하나의 숫자가 명령 포인터의 시작 위치에서 끝나고 오염 된 스택이됩니다. 이러한 복잡성으로 인해 내 코드는 2 크기의 큐브 (24 바이트 만 포함 할 수 있으므로 21 바이트 이상 골프를 쳐야 함)에 맞아야했습니다. 또한 상단과 하단면을 사용할 수 없으므로 유효 바이트는 16 개뿐이었습니다.

그래서 나는 윗면의 절반이 될 숫자를 선택하여 시작했습니다. 나는 N(10)으로 시작 했지만 모든 것을 인쇄하기 위해 취한 접근 방식으로 인해 제대로 작동하지 않았습니다. 어느 쪽이든, 나는 새로 시작 S하여 어떤 이유로 든 (32)를 사용했습니다 . 그로 인해 적절한 소동이 발생했습니다. 그래서 저는 생각했습니다. 모두 잘 작동했지만 따옴표가 누락되었습니다. 그런 다음 Q(34)가 실제로 유용하다는 것이 나에게 일어났습니다 . 결국 34는 큰 따옴표의 문자 코드이므로 스택에 유지하여 소중한 바이트를 절약 할 수 있습니다 (2, 레이아웃에서 사용). IP 경로를 약간 변경 한 후에 남겨진 모든 것은 공란을 채우기위한 운동이었습니다.

작동 원리

코드는 5 개 부분으로 나눌 수 있습니다. 하나씩 살펴 보겠습니다. 스택 모델이 처음부터 끝이므로 중간면을 역순으로 인코딩합니다.

1 단계 : 윗면 인쇄

관련이없는 명령어는 no-ops ( .) 로 대체되었습니다 . IP는 맨 왼쪽에서 세 번째 줄을 시작하여 동쪽을 가리 킵니다. 스택이 (분명히) 비어 있습니다.

    . .
    . .
Q u . . . . . .
O O . . . . . .
    . .
    . .

IP는 네 번째 줄의 가장 왼쪽 위치에서 서쪽을 가리키며 같은 줄의 가장 오른쪽 위치로 줄 바꿈됩니다. 실행되는 명령은 (제어 흐름 문자없이) 다음과 같습니다.

QOO
Q   # Push 34 (double quotes) to the stack
 OO # Output twice as number (the top face)

스택에는 소스의 마지막 문자를 나타내는 34 개만 포함됩니다.

2 단계 : 네 번째 줄 인코딩

이 비트는 당신이 기대하는 것을 거의 수행합니다 : 네 번째 줄을 인코딩하십시오. IP는 해당 줄의 끝에 큰 따옴표로 시작하여 일치하는 큰 따옴표를 찾을 때까지 모든 문자의 문자 코드를 밀면서 서쪽으로갑니다. 이 일치하는 큰 따옴표는 IP가 왼쪽 가장자리에 도달하면 다시 줄 바꿈하기 때문에 네 번째 줄의 마지막 문자이기도합니다.

사실상 IP는 한 위치 왼쪽으로 이동했으며 이제 스택에는 네 번째 줄을 문자 코드와 역순으로 표시합니다.

3 단계 : 다른 견적 제공

우리는 또 다른 인용문을 추진해야하며 Q, 프로그램을 시작할 때 오른쪽에서 접근 하여 재활용하는 것보다 더 좋은 방법은 무엇 입니까? 이것은 IP가 세 번째 줄을 인코딩하는 인용문에 직접 도달한다는 추가 보너스를 가지고 있습니다.

이 단계의 순 버전은 다음과 같습니다. 관련없는 intructions는 다시 no-ops로 대체되었으며, 실행 된 no-ops는 #설명 목적으로 해시 태그 ( ) 로 대체되었으며 IP는 네 번째 줄의 마지막 문자에서 시작합니다.

    . .
    . .
Q u $ . . . . .
. . w \ . . / .
    . #
    . #

IP는 첫 번째 명령에서 세 번째 줄에서 끝나고, 서쪽을 가리 키기 때문에 해당 줄의 끝으로 줄 바꿈됩니다. 다음 지시 사항 (제어 흐름 제외)은 제외됩니다.

$uQ
$u  # Don't do anthing
  Q # Push the double quote

이 큰 따옴표는 세 번째 줄의 끝에있는 따옴표를 나타냅니다.

4 단계 : 세 번째 줄 인코딩

2 단계와 동일하게 작동하므로 설명을 참조하십시오.

5 단계 : 스택 인쇄

이제 스택에는 네 번째와 세 번째 줄이 역순으로 포함되어 있으므로 이제해야 할 모든 것이 인쇄됩니다. IP는 세 번째 줄의 두 번째 명령에서 시작하여 서쪽으로 이동합니다. 큐브의 관련 부분은 다음과 같습니다 (다시 관련없는 부분은 no-ops로 대체되었습니다).

    . .
    . .
. . . v @ ! < .
. . . \ o ; / .
    . .
    . .

당신이 보거나 예상했을 수있는 것처럼 이것은 루프입니다. 본체는 :

o;
o  # Print top of stack as character
 ; # Delete top of stack

최상위 항목이 0이면 루프가 종료되며 스택이 비어있을 때만 발생합니다. 루프가 종료 @되면가 실행되어 프로그램을 종료합니다.


내가 더 이상
투표

바운티는 언제나 환영합니다 ;-)
누가 복음

42

자바 스크립트 ES6-21 바이트

$=_=>`$=${$};$()`;$()

이 퀴인을 "블 링퀸"이라고 부릅니다.

때때로, 당신은 스타일 골프를해야합니다.


!$=_=>`!$=${$}()`()2 바이트를 절약 합니까 ?
Downgoat

Invalid assignment left hand side. 그것이 효과가 있었으면 좋겠다 :(
Mama Fun Roll

1
@ TùxCräftîñg 템플릿 리터럴 주위에 괄호를 제거하면과 같은 기본 프로토 타입 함수에서만 작동합니다 Array.prototype.join.
Mama Fun Roll

2
흠, 확실하지 않다. 나는 1 년 전에 이것을 썼으며 (당시 유효한 것으로 간주 됨) 나는 퀴니 규칙 변경을 너무 밀접하게 따르지 않았습니다. 그러나 화살표 기능을 추가 alert하거나 사용한 console.log후 템플릿 문자열을 괄호로 묶으면 작동합니다.
Mama Fun Roll

3
또한 concole에서 이것을 실행하면이 사이트의 $ (jQuery 함수)를 덮어 쓰며 upvote 함수는 더 이상 작동하지 않습니다. :)
Steven Palinkas

41

Brainf * ck (755 자)

이것은 Erik Bosman (ejbosman at cs.vu.nl)이 개발 한 기술을 기반으로합니다. "ESultanik의 Quine!" 텍스트는 실제로 퀴네가되기 위해 필요합니다!

->++>+++>+>+>++>>+>+>+++>>+>+>++>+++>+++>+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>+>++>>>+++>>>>>+++>+>>>>>>>>>>>>>>>>>>>>>>+++>>>>>>>++>+++>+++>+>>+++>>>+++>+>+++>+>++>+++>>>+>+>+>+>++>+++>+>+>>+++>>>>>>>+>+>>>+>+>++>+++>+++>+>>+++>+++>+>+++>+>++>+++>++>>+>+>++>+++>+>+>>+++>>>+++>+>>>++>+++>+++>+>>+++>>>+++>+>+++>+>>+++>>+++>>>+++++++++++++++>+++++++++++++>++++++>+++++++++++++++>++++++++++>+++>+++>++++>++++++++++++++>+++>++++++++++>++++>++++++>++>+++++>+++++++++++++++>++++++++>++++>++++++++++++>+++++++++++++++>>++++>++++++++++++++>+++>+++>++++>++++++>+++>+++++++++>++++>+>++++>++++++++++>++++>++++++++>++>++++++++++>+>+++++++++++++++>+++++++++++++
ESultanik's Quine!
+[[>>+[>]+>+[<]<-]>>[>]<+<+++[<]<<+]>>+[>]+++[++++++++++>++[-<++++++++++++++++>]<.<-<]

13
그것은 영리한 방법입니다.
피터 올슨

13
어떻게 작동합니까?
자랑스런 Haskeller

3
@proudhaskeller IIRC (이전 부분) 는 각 문자에 대해 2 바이트의 메모리 (0x1F에서 ASCII 값 오프셋)로 메모리를 ESultanik's Quine!스택 인코딩으로 설정합니다 ESultanik's Quine!. 코드의 마지막 비트는 메모리를 순환하며, 먼저 ++>+++…각 문자 의 코드를 프로그래밍 방식으로 재생 한 다음 실제로 문자를 인쇄합니다.
ESultanik

4
@CatsAreFluffy 그들은 quine이어야합니다! 그것들이 제거 될 수있는 것은 사실이지만, quine 속성을 유지하기 위해 앞의 코드를 변경해야합니다.
ESultanik

1
사실입니다. 또한 개행이 필요합니다.
CalculatorFeline

36

Hexagony , 측면 길이 15 14 13 12 616 533 456 383 바이트

며칠 동안주의 깊게 골프를 치고 , 루프를 재정렬하고 다시 시작한 후 마침내 12면 육각형으로 내려갔습니다.

1845711724004994017660745324800783542810548755533855003470320302321248615173041097895645488030498537186418612923408209003405383437728326777573965676397524751468186829816614632962096935858"">./<$;-<.....>,.........==.........<"......."">'....>+'\.>.........==........<"......"">:>)<$=<..>..............$..<"...."">\'Q4;="/@>...............<"....."">P='%<.>.............<"..!'<.\=6,'/>

온라인으로 사용해보십시오!

펼쳐진 :

            1 8 4 5 7 1 1 7 2 4 0 0
           4 9 9 4 0 1 7 6 6 0 7 4 5
          3 2 4 8 0 0 7 8 3 5 4 2 8 1
         0 5 4 8 7 5 5 5 3 3 8 5 5 0 0
        3 4 7 0 3 2 0 3 0 2 3 2 1 2 4 8
       6 1 5 1 7 3 0 4 1 0 9 7 8 9 5 6 4
      5 4 8 8 0 3 0 4 9 8 5 3 7 1 8 6 4 1
     8 6 1 2 9 2 3 4 0 8 2 0 9 0 0 3 4 0 5
    3 8 3 4 3 7 7 2 8 3 2 6 7 7 7 5 7 3 9 6
   5 6 7 6 3 9 7 5 2 4 7 5 1 4 6 8 1 8 6 8 2
  9 8 1 6 6 1 4 6 3 2 9 6 2 0 9 6 9 3 5 8 5 8
 " " > . / < $ ; - < . . . . . > , . . . . . .
  . . . = = . . . . . . . . . < " . . . . . .
   . " " > ' . . . . > + ' \ . > . . . . . .
    . . . = = . . . . . . . . < " . . . . .
     . " " > : > ) < $ = < . . > . . . . .
      . . . . . . . . . $ . . < " . . . .
       " " > \ ' Q 4 ; = " / @ > . . . .
        . . . . . . . . . . . < " . . .
         . . " " > P = ' % < . > . . .
          . . . . . . . . . . < " . .
           ! ' < . \ = 6 , ' / > . .
            . . . . . . . . . . . .

그것이 가장 골치 아픈 Hexagony 코드처럼 보이지는 않지만, 내가 사용한 인코딩 유형은 더 오래 실행되지 않는 no-ops 실행에 최적화되어 있습니다.

설명

이것은 no-ops ( )를 다른 방식 으로 인코딩 하여 이전 Hexagony 답변 을 능가합니다 .. 그 대답은 다른 모든 문자를 a로 만들어 공간을 절약하는 반면 ., 광산 은 no-ops 를 인코딩합니다 . 또한 소스가 그렇게 제한 될 필요가 없다는 것을 의미합니다.

여기서는 기본 80 인코딩을 사용합니다. 여기서 16 미만의 숫자는 no-ops 실행을 나타내며 16과 79 사이의 숫자는 32 ( !)에서 95 ( _) 의 범위를 나타냅니다 (지금 막 내 골프 _중 코드 LOL). 일부 파이썬 의사 코드 :

i = absurdly long number
print(i)
base = 80
n = i%base
while n:
    if n < 16:
        print("."*(16-n))
    else:
        print(ASCII(n+16))
    i = i//base
    n = i%base

숫자는 육각형의 전반부에 인코딩되며

" " > 
 " " > 
  ... etc

왼쪽과

 > ,
< "
 >
< "
... etc

오른쪽에 포인터를 리디렉션하여 숫자를 하나의 셀로 인코딩합니다. 이것은 더 효율적인 방법을 알 수 없기 때문에 Martin Ender의 답변 (감사) 에서 가져 왔습니다 .

그런 다음 아래를 통해 하단 섹션으로 들어갑니다 ->.

       " " > \ ' Q 4 ; = " / @ > . . . .
        . . . . . . . . . . . < " . . .
         . . " " > P = ' % < . > . . .
          . . . . . . . . . . < " . .
     ->    ! ' < . \ = 6 , ' / > . .

!'루프를 시작하기 전에 숫자를 인쇄하고 올바른 메모리 셀로 이동합니다. P='%결과가 0이면 종료까지 올라가고 @그렇지 않으면 mod 결과 옆에 값을 가진 셀을 만듭니다 -16.

   . " " > ' . . . . > + ' \ . > . . . . . .
    . . . = = . . . . . . . . < " . . . . .
     . " " > : > ) < $ = < . . > . . . . .
      . . . . . . . . . $ . . < " . . . .
       " " > \ ' Q 4 ; = " / @ > . . . .
                      /
                     /

셀을 (mod value + -16)으로 설정하십시오. 해당 값이 음수이면 분기에서 위로 올라가고 >+'\그렇지 않으면 내려갑니다.

값이 양수인 경우 :

 " " > . / < $ ; - < . . . . . > , . . . . . .
  . . . = = . . . . . . . . . < " . . . . . .
   . " " > ' . . . . > + ' \ . > . . . . . .

포인터는 ;-<셀을 (mod value--16)으로 설정하고 인쇄합니다.

값은 음수입니다.

   . " " > ' . . . . > + ' \ . > . . . . . .
    . . . = = . . . . . . . . < " . . . . .
     . " " > : > ) < $ = < . . > . . . . .

> ) <루프를 시작하는 섹션으로 이동 하십시오. 여기에 격리되어 있습니다.

     . . > ) < $ = < . .
      . . . . . . . . .
       \ ' Q 4 ; = " /

이것은 ( 문자에 대한 문자-숫자 조합을 찾는 프로그램 을 작성한 Martin Ender에게 다시 감사합니다)을 'Q4;="=인쇄 하고 시작 셀로 다시 이동 하는 코드 를 실행합니다 . 그런 다음 mod 값 셀 을 증가 시키고 ( ) mod 값이 양수가 될 때까지 반복합니다..)

완료되면 다음 위치로 이동하여 다른 섹션과 결합합니다.

 " " > . / < $ ; - < . . .
            \
             \

그런 다음 포인터는 더 큰 루프의 시작 부분으로 다시 이동합니다.

 " " > . / <--
  . . . = =
   . " " > ' 
    . . . = = 
     . " " > :
      . . . . .
       " " > \ ' . .
        . . . . . . .
         . . " " > P = ' % < . > . . .

이것은 실행 ='=:'(80)에 의해 현재의 수를 분할하고, 정확한 셀을 탐색한다.

이전 버전 (측면 길이 13)

343492224739614249922260393321622160373961419962223434213460086222642247615159528192623434203460066247203920342162343419346017616112622045226041621962343418346002622192616220391962343417346001406218603959366061583947623434"">/':=<$;'<.....>(......................<"......"">....'...>=\..>.....................<"....."">....>)<.-...>...........==......<"...."">.."...'.../>.................<"..."">\Q4;3=/.@.>...............<".."".>c)='%<..>..!'<.\1*='/.\""

온라인으로 사용해보십시오!

다른 길이의 골프를 가장 확실하게 할 수는 있지만 내일까지 늦게 도착해야합니다. 내가 참을성이 없어 내일까지 기다릴 수 없다는 것이 밝혀졌습니다. 다른 쪽이 골프를 칠 수 있을까요? :( 아 아아아 !)

기본 77 인코딩 으로 두 자리 숫자추가로 골랐지만 동일한 바이트 수를 가지 므로 실제로 중요하지 않습니다.


13
이것은 놀랍다. 이 하이브리드 런 길이 인코딩에 대한 아이디어는 정말 깔끔합니다. :) 내가 잊어 버린 경우 현상금을 줄 것을 상기시켜주세요.
Martin Ender 2019

35

포스트 스크립트, 20 자

짧고 합법적입니다. 후행 개행 문자를 포함하여 20 자

(dup == =)
dup == =

33

Cubix , 45 바이트

.....>...R$R....W..^".<R.!'.\)!'"R@>>o;?/o'u"

이 코드를 여기서 테스트 할 수 있습니다 .

이 프로그램은 따르기가 매우 어렵지만 그렇게 할 수 있으려면 Cubix 인터프리터처럼 큐브로 확장해야합니다.

      . . .
      . . >
      . . .
R $ R . . . . W . . ^ "
. < R . ! ' . \ ) ! ' "
R @ > > o ; ? / o ' u "
      . . .
      . . .
      . . .

이것은 Befunge 스타일의 quine입니다. 줄 바꿈을 사용하여 문자열 리터럴을 "랩 어라운드"실행 가능 코드로 만듭니다 (한 개의 "마크 만으로 코드는 동시에 인용 부호의 내부와 외부에 있습니다. 비선형 및 비평면 프로그램). 큰 따옴표 중 두 개는 자체적으로 인코딩되지 않고 나중에 산술을 사용하여 계산되기 때문에 이는 올바른 quine 정의에 적합합니다.

그러나 Befunge와 달리 여기서는 1 개가 아닌 4 개의 문자열을 사용합니다. 다음은 스택에 푸시되는 방법입니다.

  1. 프로그램은 왼쪽 가장자리의 상단에서 시작하여 오른쪽으로 이동합니다. 오른쪽으로 두 번 회전 R하여 ( ) 전체 큐브를 감싸는 세 번째 줄과 마지막 줄을 따라 왼쪽으로 이동합니다. 큰 따옴표는 자체와 일치하므로 전체 세 번째 줄을 스택으로 뒤로 밉니다. 그런 다음 큰 따옴표 뒤에 실행이 계속됩니다.

  2. u명령은 오른쪽으로 U 턴을하므로 다음에 실행하는 것은 '"중간 줄부터 시작합니다. "스택에를 밀어 넣습니다 . 계속 감싸 <면서 큐브의 왼쪽 근처를 치고 튀어 오릅니다. 이 방향에서 접근하면 일반 "명령이 아닌 '"이므로 두 번째 줄 전체가 세 번째 줄과 큰 따옴표 위로 스택으로 푸시됩니다.

  3. !스택 에를 밀어 넣고 ( '!) 증분 하여 시작 합니다 ( )). 소스 코드에 큰 따옴표가 필요없는 큰 따옴표를 생성합니다 (문자열을 종료합니다). 거울 ( \)은 실행 방향을 북쪽으로 반영합니다. 그런 다음 W명령이 왼쪽으로 나옵니다. 이것은 우리가 일곱 번째 열에서 위로 향하게합니다. 이것은 큐브이기 때문에 세 번째 열에서 왼쪽으로 감싸고 세 번째 열에서 아래쪽으로 줄 바꿈됩니다. 우리는 명중 R, 우회전 맨 윗줄을 따라 왼쪽으로 이동; 그런 다음 $건너 뛰기는 R우리가 프로그램에 입력 한 비아를 건너 뛰 므로 실행 "은 줄 끝에서 끝으로 줄 바꿈하고 두 번째 및 세 번째와 동일한 방식으로 첫 번째 줄을 문자열로 캡처합니다.

  4. ^명령은 우리에게 11 번째 열을 북쪽으로 보내는데, 5 번째 열은 남쪽으로 (입방체 랩핑 허용) 있습니다. 우리가 직면하는 유일한 것은 !(제로가 아닌 경우 건너 뛰기; 스택의 맨 위가 실제로는 0 이 아닙니다 ) o명령 을 건너 뛰고 효과적으로 다섯 번째 열을 완전히 비 웁니다. 그래서 우리는 u명령으로 다시 돌아갑니다.이 명령은 다시 한 번 U 턴합니다. 이번에는 마지막 열을 남쪽으로 남겨두고 네 번째 열을 북쪽으로 감 쌉니다. 우리는 U 턴 중에 큰 따옴표를 쳤습니다. 그래서 우리는 네 번째 열 전체를 아래에서 위로 문자열로 캡처합니다. 프로그램에서 대부분의 큰 따옴표와 달리이 따옴표는 닫히지 않습니다. 오히려 "오른쪽 상단 모서리에 의해 닫혀 있습니다. 즉, 9 자리 문자열을 캡처합니다 ...>......

스택 레이아웃은 이제 위에서 아래로 : 네 번째 열; 상단 줄; "; 가운데 줄; "; 맨 아래 줄. 이들 각각은 스택 상단에 가장 가까운 첫 번째 문자로 스택에 표시됩니다 (Cubix는 Befunge와 마찬가지로이 순서의 역순으로 문자열을 푸시하지만 IP가 자연스러운 판독 방향과 반대 방향으로 이동할 때마다, 효과적으로 두 번 반전되었습니다). 스택 내용은 원래 프로그램과 거의 동일합니다 (네 번째 열과 큐브의 북쪽 / 상단면에는 동일한 순서로 동일한 문자가 포함되어 있기 때문에 의도적으로 의도적으로 설계되었습니다).

다음 단계는 스택의 내용을 인쇄하는 것입니다. 모든 푸시 후, IP는 네 번째 열에서 북쪽으로 가고 있으므로 >거기에서 충돌하여 타이트한 루프를 시작합니다 >>o;?(예 : "동쪽으로 돌리고 동쪽으로 돌리고 문자로 출력, 팝, 양수이면 오른쪽으로 돌리십시오"). 일곱 번째 줄은 NOP로 가득 차 있기 때문에 첫 번째 줄로 ?다시 줄 바꿈 >되므로 스택의 전체 내용을 효과적으로 푸시합니다 ( ?빈 스택의 no-op). 우리는 전체 프로그램을 거의 인쇄했습니다! 불행히도 아직 끝나지 않았습니다. 끝에 큰 따옴표가 없습니다.

루프가 끝나면 중앙선에 반사되어 한 쌍의 거울을 통해 서쪽으로 이동합니다. (우리는 \이전 에 미러 의 "다른 쪽"을 사용했습니다. 이제 남서쪽을 사용하고 있습니다. /미러는 이전에 사용 된 적이 없습니다.) 우리 '!는 느낌표 (예 : 33; ASCII를 사용하고 있습니다)를 발견했습니다. Cubix는 스택에서 정수와 문자를 구분하지 않습니다. (편리하게, 이것은 명령 !을 건너 뛰는 데 사용 된 것과 동일합니다 o.) 우리는 한 쌍의 R명령을 만나서 "수동"U 턴 R을하기 위해 사용 합니다 (두 번째 명령은 첫 번째 명령에 도달하기 위해 이전에 사용되었습니다) 행 R과 함께 다른 명령 을 맞추는 것이 가장 자연스러운 것처럼 보였습니다 .W명령을 왼쪽으로 돌립니다. 회피 >는 두 번째 줄 의 명령으로 바로 충돌하여 실행을 원래 위치로 되돌립니다. 그래서 우리는 다시 왼쪽으로 물러나지 만 이번에는 남쪽으로 가고 있으므로 다음으로 실행할 명령은 )(느낌표를 큰 따옴표로 묶는 것)과 그 뒤에 o(출력하는 것)입니다. 마지막으로, 실행은 여덟 번째 줄을 따라 두 번째 열로 줄 바꿈 @하여 프로그램을 종료 할 곳을 찾습니다 .

세 번째 줄에서 길 잃은 아포스트로피에 대해 사과드립니다. 이 버전의 프로그램에서는 아무것도하지 않습니다. 그것은 내가 가지고 있었지만 필요하지 않은 것으로 밝혀진 초기 아이디어의 일부였습니다. 그러나 일단 작업 quine을 얻은 후에는 특히 바이트 수를 변경하지 않기 때문에 더 이상 엉망이 아닌 제출하기를 원했습니다. 이 퀴니를 더 낮추는 주제에 관해서는 처음 5 줄만 사용하여 이것이 3 × 3에서 가능하다면 놀라지 않을 것입니다. 그러나 나는 그것을 할 수있는 확실한 방법을 볼 수 없으며, 필요합니다. 큐브의 윗면을 나타내는 다른 방법과 함께 모든 제어 흐름을 더 세밀하게 패킹 (또는 알고리즘을 수정하여 네 번째 열이 10 자 또는 11 자 임에도 불구하고 네 번째 열을 계속 사용할 수 있도록) .


잘 했어, 이것은 정말 인상적인 점수이다. 나는 당신이 윗면을 어떻게 인코딩했는지 좋아합니다. :)
Martin Ender

이것은 단지 믿어지지 않는다! 도움이된다면 다른 방법으로 밀어 넣는 것 "입니다 Q.
ETHproductions

1
와! 나는 cubix quine을 보지 못했지만!
FlipTack 2016

3
어제 설명을 읽을 시간이 없었지만 이제는 ... 그냥 ... 와우. 2 ~ 3 개의 완전히 다른 목적으로 몇 개의 문자가 사용되는지 믿을 수 없습니다. 이것은 내가 본 것 중 가장 멋진 Cubix 프로그램 일 것입니다.
ETHproductions

좋은 설명입니다.
Robert Fraser

33

파이썬 2, 30 바이트

_='_=%r;print _%%_';print _%_

여기에서 찍은


1
+1, 비슷한 솔루션을 이겼으므로 삭제했습니다. 이것은 파이썬 2에서만 작동한다는 점에 주목해야합니다.
nyuszika7h

2
변수 이름은으로 이상하게 보이지만 _문자에 할당하면 더 잘 읽습니다.s='s=%r;print s%%s';print s%s
Ehtesh Choudhury

5
이 솔루션이 자신의 창작물이 아닌 경우 Community Wiki로 만들어야합니다. 또한 연결이 끊어졌습니다.
mbomb007

1
나는 파티에 조금 늦었지만 누군가 이것이 어떻게 작동하는지 설명 할 수 있습니까?
MadTux

9
이를 위해서는 후행 줄 바꿈이 유효해야합니다. 소스 코드가 출력과 일치하지 않습니다.
Dennis

32

Vim, 17 , 14 키 스트로크

누군가 무작위로 이것을 찬성했습니다. 그래서 나는 그것이 존재한다는 것을 기억했습니다. 다시 읽을 때, "이봐, 그보다 더 잘할 수있다"고 생각해서 2 바이트를 떨어 뜨렸다. 여전히 가장 짧지는 않지만 적어도 개선입니다.


오랫동안 vim quine이 가능한지 궁금했습니다. 한편으로는 vim이 완전히 작동하기 때문에 가능해야합니다. 그러나 정말 오랜 시간 동안 vim quine을 찾은 후에는 찾을 수 없었습니다. 나는 않았다 발견 이 PPCG 도전을 하지만, 정확히에 대한 문자 quines을 폐쇄하고 아니에요. 그래서 나는 그것을 찾을 수 없었기 때문에 하나를 만들기로 결정했습니다.

가지 이유로 인해이 답변을 정말 자랑스럽게 생각합니다 .

  1. 이것은 내가 만든 첫 번째 quine이며

  2. 내가 아는 한, 이것은 세계 최초의 vim-quine입니다 . 나는 이것에 대해 틀릴 수 있으므로, 당신이 하나를 알고 있다면 알려주십시오.

그래서 긴 소개 후에는 다음과 같습니다.

qqX"qpAq@q<esc>q@q

온라인으로 사용해보십시오!

이것을 <esc>입력 하면 키 입력이로 표시 됩니다 ^[. ASCII 로 이스케이프 ^[ 나타내는 represent 0x1B이므로 vim은 내부적으로 키를 나타내는 방식 이므로 여전히 정확 합니다.<esc>

또한 기존 vim 세션을로드하면 테스트에 실패 할 수 있습니다. 내가 쓴 이 설명 대답 여기에 더 많은 정보를 원한다면,하지만 기본적으로 당신과 정력을 시작합니다

vim -u NONE -N -i NONE

또는qqq 이것을 실행하기 전에 입력 하십시오.

설명:

qq                  " Start recording into register 'q'
  X                 " Delete one character before the cursor (Once we play this back, it will delete the '@')
   "qp              " Paste register 'q'
      Aq@q<esc>     " Append 'q@q' to this line
               q    " Stop recording
                @q  " Playback register 'q'

참고로,이 답변은 아마도 PPCG 답변 또는 대부분의 'q'에 대한 세계 기록 일 것입니다.


1
2i2i<esc>너무 가깝습니다. 이 작업을 수행하기 위해 할 수있는 일이 있어야한다고 생각합니다.
Zwei

@zwei 알아요, 아파요! 실제로 <Esc>V에는 암시 적이므로 작동합니다 . 불행히도 개행을 추가하기 때문에 아직 게시하지 않았습니다.
DJMcMayhem

q"iq"qbP<Esc>qbP이것을 reddit에 넣은 후 여기에서 vimgolfing을 조사하고 계정을 만들기로 결정했습니다. 이것이 내가 게시 한 답변입니다.
udioica

2
@udioica 답변으로 게시 할 수 있습니까?
DJMcMayhem

28

손실 , 120116 98 96 76 70 66 바이트

편집 : 예, 100 미만

편집 : /결론 에서 모든 s 로 전환하여 많은 o 바이트를 저장했습니다.

:2+52*95*2+>::1?:[:[[[[@^%?>([ "
////////////////////////////////

온라인으로 사용해보십시오! + 가능한 모든 주에 대해 결정적인 검증

로스트는 시작 위치와 방향이 완전히 임의 인 2D 언어입니다. 이것은 올바른 지시 포인터를 가지고 있는지 확인하기 위해 모든 단계에서 많은 오류 검사가 필요하다는 것을 의미하며, 무작위로 방황 한 것이 아닙니다.

설명:

/맨 아래 줄의 모든 s는 세로 방향 또는 맨 아래 줄에 생성 된 모든 포인터가 올바른 방향으로 깔려 있는지 확인하기 위해 있습니다. 거기서부터 그들은 여러 곳에서 끝나지만 모두가

 ^%?>
 ////

스택에서 0이 아닌 숫자를 모두 지 웁니다. 그 ([후에는 여분의 0도 지 웁니다.

클리어의 중간 %에서을 누르면 '안전성'이 꺼 지므로 프로그램에 도달하면 프로그램을 종료 할 수 있습니다 @(이것이 없으면 포인터가에서 시작하면 프로그램이 즉시 종료 될 수 있습니다 @).

거기 "에서 첫 번째 줄 주위에 문자열 리터럴 ( )을 줄 바꿈 "하여 공백 ( :2+)과 줄 바꿈 ( 52*)을 문자로 밀어서 매우 간단한 2D 언어 퀴인 을 수행합니다 . 두 번째 줄의 경우 /문자 ( 95*2+)를 만들고 묶음 ( >::1?:[:[[[[)을 복제 한 다음 마지막으로 종료 @하고 스택을 암시 적으로 인쇄합니다. 는 ?1포인터가 초기 입력하면 나중에 취소하는 데 절감, 너무 많은 0을 만드는 것을 프로세스를 중지하는 것입니다.

마지막 줄을 모두 같은 문자로 만들어서 20 바이트를 절약했습니다. 즉, duping 프로세스에서 끝으로 바로 갈 수 있음을 의미합니다 @.

듀핑 프로세스에 대한 설명 :

['문'으로 알려진 캐릭터입니다. 포인터가 a [또는 a 의 평평한면에 닿으면 ]반사되고 그렇지 않으면 통과합니다. 포인터가 Door와 상호 작용할 때마다 반대 유형으로 전환됩니다. 이 지식을 사용하여 >:[블록 에서 명령이 몇 번 실행될 것인지에 대한 간단한 공식을 구성 할 수 있습니다 .

초기 지침을 추가하십시오. 각각 [에 대해 왼쪽에 지시 량의 2 배를 더하십시오. 예를 들어 >::::[:[[[, 초기 금액으로 5로 시작합니다. 첫 번째 문에는 4 개의 속력 지침이 있으므로 13을 얻기 위해 4 * 2 = 8 ~ 5를 더합니다. 다른 3 개의 문에는 왼쪽에 5 개의 속박이 있으므로 3 * (5 * 2) = 30을 13으로 추가하여 43을 얻습니다. dupe 명령이 실행되고 >스택에 44 초가 있습니다. (스택에서 스코프로 대량의 항목을 푸시하거나 스택에서 항목을 지우는 데 사용되는 것과 같은 다른 프로세스에 동일한 프로세스를 적용 할 수 있습니다 .

너무 많은 0을 피하는 것을 피하기 위해 여기에서 사용한 트릭은 1?입니다. 문자가 0이면 ?1을 건너 뛰지 않습니다. 이는 남은 속임수에 대해 1을 복제 함을 의미합니다. 이렇게하면 나중에 스택을 훨씬 쉽게 지울 수 있습니다.


25

다음은 SO에서 가장 짧은 두 가지 루비입니다 .

_="_=%p;puts _%%_";puts _%_

puts <<2*2,2
puts <<2*2,2
2

두 번째 작동 방식을 묻지 마십시오.


8
두 번째는 heredoc을 사용 <<2하고 다음 줄에서 문자열을 시작하고 문자열을 *2반복합니다
Ming-Tang

왜 2가 필요합니까?
CalculatorFeline

1
@CalculatorFeline heredoc 문자열의 종결 자입니다 (자체 행에 표시되어야 함). : 그것은 실제로이 생각 될 필요가 없습니다 tio.run/##KypNqvz/v6C0pFjBxsZAy0jHgAuFY8D1/z8A
마틴 청산

25

핵분열 , 6 바이트

이 답변 중에서 가장 짧은 "적절한"퀴인 것 같습니다.

'!+OR"

설명

제어 흐름은 R단일 오른쪽 (1,0)원자로 시작합니다. 그것은 안타 "인쇄 모드를 전환하고, 라인 주위에 인쇄를 감싸는 '!+OR같은 타격 전에 "다시 인쇄 모드를 종료.

"자체로 인쇄됩니다. 가장 짧은 방법은 '"O( '"원자의 질량을 문자 코드로 설정 "하고 O문자를 인쇄하고 원자를 파괴하는 것)이지만, 이렇게하면 "인쇄 모드를 방해합니다. 그래서 그 대신 우리가 원자 값 설정 '!(이하 한 "), 다음으로 증가 +하고 그 다음 에 결과를 출력 O.

대안

다음은 더 길지만 몇 가지 대안이 있지만 해당 기술을 사용하면 더 짧은 버전을 사용하도록 유도 할 수 있습니다 (또는 일반화 된 특정 quines에서 더 유용 할 수 있음).

Jump를 사용하는 8 바이트

' |R@JO"

다시, 코드는에서 시작합니다 R. @스왑 질량과 에너지를 제공합니다 (0,1). 따라서 J원자는 위로 O직선으로 점프 합니다 ". 그런 다음 이전과 마찬가지로 "문자열 모드에서 모두를 제외하고 인쇄됩니다. 그 후, 원자 |는 방향을 바꾸기 위해 부딪친 다음 '"O인쇄 를 통과합니다 ". 공간은 약간 성가 시지만, 필요한 것 같습니다. 그렇지 않으면 '원자가 |거울 대신 문자로 취급하게 되기 때문 입니다.

두 개의 원자를 사용하는 8 바이트

"'L;R@JO

여기에는 왼쪽에서 시작하여 오른쪽으로 이동하는 두 개의 원자가 L있습니다 R. 왼쪽으로 이동하는 원자는 값을 설정 한 '"다음 즉시 인쇄되어 O원자가 파괴됩니다. 올바른 원자의 경우 질량과 에너지를 다시 바꾸고 O인쇄 모드에서 나머지 코드를 인쇄하기 위해 위로 건너 뜁니다 . 그 후 그 값이 설정 'L되지만 원자가로 삭제되므로 중요하지 않습니다 ;.


소스의 코드 / 데이터 분리 부족으로 인해 기술적으로 유효하지 않습니다.
CalculatorFeline

4
@CalculatorFeline '!+인코딩 ".
Martin Ender

나는 Fission에 익숙하지 않지만 |R@JO"'작동 할 것 '입니까 , 아니면?
MildlyMilquetoast

1
@MistahFiggins 그렇게 생각하지만 더 중요한 것은 '첫 번째를 인쇄하는 것 입니다.
Martin Ender

24

크로스 브라우저 JavaScript (41 자)

상위 5 개 웹 브라우저 (IE> = 8, Mozilla Firefox, Google Chrome, Safari, Opera)에서 작동합니다. 다음 중 하나를 사용하여 개발자 콘솔에 입력하십시오.

eval(I="'eval(I='+JSON.stringify(I)+')'")

Chris Jester-Young의 싱글 바이트 퀴니와 달리 "속임수"가 아닙니다. alert()함수 를 사용하도록 쉽게 수정할 수 있기 때문에 (14 자 비용) :

alert(eval(I="'alert(eval(I='+JSON.stringify(I)+'))'"))

또는 북마크릿으로 변환 (비용 22 자) :

javascript:eval(I="'javascript:eval(I='+JSON.stringify(I)+')'")

24

C, 64 60 바이트

main(s){printf(s="main(s){printf(s=%c%s%1$c,34,s);}",34,s);}

지금까지 이것은 가장 짧은 알려진 C quine입니다. 더 짧은 것을 찾으면 현상금연장 됩니다.

이것은 POSIX 환경의 GCC , ClangTCC 에서 작동 합니다. 모두 정의되지 않은 과도한 동작을 호출합니다.

재미를 위해 여기에 내가 아는 모든 C quine을 포함 하는 repo 가 있습니다. 기존의 것보다 새롭고 창의적인 것을 추가하는 다른 것을 찾거나 쓰는 경우 자유롭게 포크 / PR하십시오.

ASCII 환경 에서만 작동 합니다. 이것은 EBCDIC 에서 작동 하지만 여전히 POSIX 가 필요합니다 . 어쨌든 POSIX / EBCDIC 환경을 찾는 행운을 빕니다 : P


작동 방식 :

  1. main(s)main거의 타입이 지정되지 않은 변수를 선언하여 남용 의 주장을 남용 합니다 s. ( s실제로 유형이 지정되지는 않았지만 나열된 컴파일러는 필요에 따라 자동으로 캐스팅하므로 * 일 수도 있습니다.)
  2. printf(s="..."s제공된 문자열로 설정 하고 첫 번째 인수를에 전달합니다 printf.
  3. s로 설정되어 main(s){printf(s=%c%s%1$c,34,s);}있습니다.
  4. %cASCII로 설정되어 34, ". 이것은 quine을 가능하게합니다. 이제 s다음과 같이 보입니다 :
    main(s){printf(s="%s%1$c,34,s);}.
  5. 이 자체 %s로 설정되어 s있으며 # 2로 인해 가능합니다. 이제 s다음과 같이 보입니다 :
    main(s){printf(s="main(s){printf(s=%c%s%1$c,34,s);}%1$c,34,s);}.
  6. %1$cASCII (34)로 설정되어 ", printf첫번째 ** 인수의. 이제 s다음과 같이 보입니다.
    main(s){printf(s="main(s){printf(s=%c%s%1$c,34,s);}",34,s);}
    ... 원래 소스 코드가됩니다.

* 형식 지정자 뒤의 @Pavel ** 첫 번째 인수 덕분에
-이 경우 s. 형식 지정자를 참조하는 것은 불가능합니다.


나는 이것이 같은 접근법으로 더 짧아 질 수는 없다고 생각합니다. printf를 통해 형식 지정자에 액세스 할 수 있으면 $52 바이트에서 작동합니다.

main(){printf("main(){printf(%c%0$s%1$c,34);}",34);}

확실히 경쟁으로 간주해서는 안되지만 1994 년 국제 난독 화 C 코드 경연 대회 ( 1994_smr.c) 에서 "가장 최악의 규칙 남용"의 승자 는 분명히 짧습니다.
Ray

@Ray 허용되지 않습니다. 그것은 어떤 정의에 의한 적절한 소멸이 아닙니다. 이 슬레이트 규칙 때문에 그 프로그램의 변경된 : P
MD XF

나는 전적으로 동의하지만, 역사적 이유만으로 누군가가 가장 작은 알려진 퀴니를 언급 할 때 언급 할 가치가있는 흥미로운 해킹입니다.
Ray

4
sint"유형화되지 않은 변수"가 아닌 유형 입니다.
feersum

2
이 컴파일러는 모두 포인터를 int로 암시 적으로 변환 할 수 있습니다. s=3문자열을에 두 번 전달해야하기 때문에 분명히 작동하지 않습니다 printf.
feersum

24

자바, 528 바이트 :

독창적 인 접근 방식의 Java 솔루션 :

import java.math.*;class a{public static void main(String[]a){BigInteger b=new BigInteger("90ygts9hiey66o0uh2kqadro71r14x0ucr5v33k1pe27jqk7mywnd5m54uypfrnt6r8aks1g5e080mua80mgw3bybkp904cxfcf4whcz9ckkecz8kr3huuui5gbr27vpsw9vc0m36tadcg7uxsl8p9hfnphqgksttq1wlolm2c3he9fdd25v0gsqfcx9vl4002dil6a00bh7kqn0301cvq3ghdu7fhwf231r43aes2a6018svioyy0lz1gpm3ma5yrspbh2j85dhwdn5sem4d9nyswvx4wmx25ulwnd3drwatvbn6a4jb000gbh8e2lshp",36);int i=0;for(byte c:b.toByteArray()){if(++i==92)System.out.print(b.toString(36));System.out.print((char)c);}}}

읽을 수있는 형태로 :

import java.math.*;
class a
{
    public static void main (String [] a)
    {
        BigInteger b=new BigInteger ("90ygts9hiey66o0uh2kqadro71r14x0ucr5v33k1pe27jqk7mywnd5m54uypfrnt6r8aks1g5e080mua80mgw3bybkp904cxfcf4whcz9ckkecz8kr3huuui5gbr27vpsw9vc0m36tadcg7uxsl8p9hfnphqgksttq1wlolm2c3he9fdd25v0gsqfcx9vl4002dil6a00bh7kqn0301cvq3ghdu7fhwf231r43aes2a6018svioyy0lz1gpm3ma5yrspbh2j85dhwdn5sem4d9nyswvx4wmx25ulwnd3drwatvbn6a4jb000gbh8e2lshp", 36); 
        int i=0; 
        for (byte c:b.toByteArray ())
        {
            if (++i==92) 
                System.out.print (b.toString (36)); 
            System.out.print ((char) c);
        }
    }
}

어떻게 작동합니까?
Loovjo

1
@Loovjo : 코드를 두 부분으로 자르고 코드를 다시 나타내는 전체 문자열을 삽입하는 다른 솔루션과 유사하지만 전체 코드는 문자열이 아니라 기본 36의 긴 숫자로 인코딩됩니다 (26 알파벳 문자 + 10 자릿수).
사용자가 알 수 없음

1
다음을 입력하면 단축 될 수 있습니다 if(++i==92).
tuskiomi

2
@tuskiomi : 두 개의 문자 단축 감사합니다,
알 수없는 사용자

1
@userunknown 사실, a* 배열이 Java에서 종료되지 않기 때문에 C입니다. 골프 할 다른 부분 : import java.math.*;class a{public static void main(String[]a){BigInteger b=new BigInteger("abc",36);int i=0;for(int c:b.toByteArray())System.out.printf("%s%c",++i==92?b.toString(36):"",c);}}, 여기서 abc새로 계산 된 매직 넘버 String이됩니다. 자바에서 8 +는 변경할 수도 class a{public static void maininterface a{static void main, 자바는 10+에서 변경 수도 import java.math.*;BigInteger b=new BigInteger(var b=new java.math.BigInteger(.
케빈 크루이 센

23

치킨 , 7

chicken

아니요, 이것은 직접 반향되지 않습니다 :)


젠장, 넌 날 이겼어 :)
Taconut

에코되지 않고 문자열입니다 chicken!
아웃 골퍼 에릭

코드 / 데이터 분리가 없으므로 유효하지 않습니다.
CalculatorFeline

10
@CalculatorFeline 규칙을 읽었습니까?
Timtech

1
@JoKing 도전 규칙은 길이가 0이고 부정 행위 (자신의 소스 파일 읽기)가 금지되기 때문에 이것이 유효하지 않다고 생각합니다. 부적절한 퀴를 금지하는 유일한 방법은 표준 허점입니다. 표준 허점은 일반적으로 이전의 답변에 적용되는 것으로 간주되지 않습니다.
pppery

23

망막 , 20 14 9 7 바이트

시작하기 전에 단일을 포함하는 파일의 간단한 솔루션에 대해 언급하고 싶습니다 0. 이 경우 Retina는 0빈 입력에서 s를 세 려고 시도하며 그 결과도 0입니다. 나는 그것이 적절한 quine을 고려하지 않을 것입니다.

여기에 적절한 것이 있습니다.

>\`
>\`

온라인으로 사용해보십시오!

또는 ;대신에 사용할 수 있습니다 >.

설명

이 프로그램은 우리가 두 번 인쇄하는 단일 교체로 구성됩니다.

첫 번째 줄 `에서 구성을 정규식과 분리하므로 정규식이 비어 있습니다. 따라서 빈 문자열 (즉, 존재하지 않는 입력)은 두 번째 줄인 그대로 사용됩니다.

결과를 두 번 인쇄하려면 두 단계로 출력합니다. 내부 \는 후행 줄 바꿈으로 결과를 인쇄하고 외부는> .없이 인쇄합니다.

Retina에 대해 잘 알고 있다면 Retina의 암시 적 출력에 어떤 일이 있었는지 궁금 할 것입니다. Retina의 암시 적 출력은 프로그램의 마지막 단계를 출력 단계로 래핑하여 작동합니다. 그러나 최종 단계가 이미 출력 단계 인 경우 Retina는이를 수행하지 않습니다. 그 이유는 일반 프로그램에서 암시 적 출력 스테이지를 플래그 와 함께 암시 적 스테이지를 제거하지 않고 특수 바이트로 \또는 ;단일 바이트 로 대체하는 것이 더 유용하기 때문 .입니다. 불행하게도,이 동작은 quine을 위해 2 바이트의 비용이 발생합니다.


20

자바 스크립트 (36 자)

(function a(){alert("("+a+")()")})()

지금까지 가장 짧은 자바 스크립트 퀴인 AFAICT입니다.


1
그건 ... 인상적입니다. 어떻게 작동하는지 설명해야합니다. 8- |
TehShrike

3
@TehShrike 힌트 : 함수를 문자열로 강제 변환하여 내용을 볼 수 있습니다. 예를 들어, 함수 a가 있으면를 호출하여 해당 내용에 액세스 할 수 있습니다 a.toString.
피터 올슨

7
그럼에도 불구하고 JavaScript 구현에서 함수 a가 위에서 작성된 것과 정확히 동일한 방식으로 문자열을 표시하는 경우 이는 간단합니다 . 그러나, 출력 이 코드는 자바 스크립트 구현에 quine 될 가능성이 높습니다.
Ilmari Karonen

1
다음은 1 바이트 더 짧은 동일한 quine !function a(){alert("!"+a+"()")}()입니다..
Ismael Miguel 1

1
(a=()=>alert(($ {a})))()
Dennis C

19

GolfScript, 8 바이트

나는 항상 가장 짧은 (진정한) GolfScript quine이 9 바이트라고 생각했습니다.

{'.~'}.~

GolfScript는 기본적으로 후행 줄 바꿈을 인쇄하므로 후행 줄 바꿈이 필요한 위치입니다.

그러나 방금 줄 바꿈 제한 주위에서 작동하는 8 바이트 퀴인을 발견했습니다.

":n`":n`

온라인으로 사용해보십시오!

따라서 GolfScript는 후행 줄 바꿈을 인쇄하지 않지만 n프로그램 끝 부분의 내용을 인쇄합니다 . n시작하는 줄 바꿈 이 포함되어 있습니다. 따라서 아이디어는 문자열로 바꾸고 문자열 ":n`"로 묶어 스택의 사본이 따옴표로 인쇄되고 사본이 저장되도록하는 것입니다.n 인쇄 인쇄되지 않은 상태로 .

Thomas Kwa가 지적한 것처럼 7 바이트 CJam 퀴니는 8 바이트 솔루션에도 적용 할 수 있습니다.

".p"
.p

다시, 우리는 후행 줄 바꿈이 필요합니다.


6
Golfscript가 이상합니다.
CalculatorFeline

19

미로 , 124 (110) 53 바이트

9 바이트에서 골프를 펼친 Sp3000 덕분에 다른 7 개에서 골프를 탈 수있었습니다.

44660535853919556129637653276602333!
1
:_98
/8 %
@9_.

온라인으로 사용해보십시오!

설명

미로 101 :

  • Labyrinth는 스택 기반 2D 언어입니다. 스택은 바닥이없고 0으로 채워 지므로 빈 스택에서 터지는 것은 오류가 아닙니다.
  • 첫 번째 유효한 문자 (여기서는 왼쪽 위)부터 실행이 시작됩니다. 명령어 포인터 (IP)가 취할 수있는 두 개 이상의 가능한 경로가있는 각 접점에서 스택의 맨 위를 확인하여 다음에 갈 곳을 결정합니다. 음수는 왼쪽이고, 0은 앞으로 가고 양수는 오른쪽입니다.
  • 소스 코드의 숫자는 해당 숫자를 푸시하지 않습니다. 대신 스택의 상단을 팝하고를 누릅니다 n*10 + <digit>. 이를 통해 많은 수의 손쉬운 구축이 가능합니다. 새 숫자를 시작하려면을 사용하여 _0 을 누릅니다 .
  • " 아니야.

먼저, 약간 더 짧은 버전이지만 조금 더 마술적인 버전을 설명하겠습니다.

395852936437949826992796242020587432!
"
:_96
/6 %
@9_.

온라인으로 사용해보십시오!

주요 아이디어는 큰 기본을 사용하여 소스의 본체를 단일 숫자로 인코딩하는 것입니다. 이 번호는 나머지 소스 코드를 인쇄하기 위해 디코딩되기 전에 쉽게 다시 인쇄 할 수 있습니다. 디코딩은 단순히를 반복적으로 적용하는 것입니다 divmod base. 여기서 print를 인쇄 하고 0까지 mod계속 작업 div합니다.

를 피함으로써 {}, 우리가 필요로하는 가장 높은 문자 코드는 _(95)이므로 밑이 96이면 충분합니다 (밑을 낮게 유지하면 처음의 숫자는 더 짧습니다). 우리가 인코딩하고 싶은 것은 이것입니다.

!
"
:_96
/6 %
@9_.

해당 문자를 코드 포인트로 바꾸고 결과를 밑이 96 인 숫자로 처리 ( !가장 작은 숫자는에 해당 하고 가장 중요한 숫자는에 해당하는 숫자를 .분해하는 순서이므로)

234785020242697299628949734639258593

이제 코드는 매우 멋진 트릭으로 시작하여 인코딩을 다시 인쇄하고 오버 헤드가 거의없이 디코딩을 위해 다른 사본을 유지할 수 있습니다. 번호를 코드에 역으로 넣습니다. 이 CJam 스크립트로 결과 계산 했으므로 실제 코드로 넘어 갑시다 . 시작은 다음과 같습니다.

395852936437949826992796242020587432!
"

IP는 왼쪽 상단에서 시작하여 동쪽으로갑니다. 해당 숫자를 넘기는 동안 단순히 스택 위에 해당 숫자를 쌓습니다. 숫자 자체는 의미가 없습니다. 왜냐하면 우리가 원하는 것과 반대이기 때문입니다. IP가! 도달하면 스택에서이 숫자가 팝업되어 인쇄됩니다. 출력에서 인코딩을 재현하는 것이 전부입니다.

그러나 이제 IP는 막 다른 골목에 부딪쳤다. 즉, 돌아 서서 다시 서쪽으로 돌아갑니다 !. 이번에는 편리하게 IP가 앞뒤로 숫자를 읽으므로 이제 스택 맨 위에있는 숫자 소스의 나머지 부분을 인코딩합니다.

IP가 이제 왼쪽 상단 모서리에 다시 도달하면 IP가 왼쪽 회전을 할 수 있기 때문에 막 다른 골목이 아니므로 이제 남쪽으로 이동합니다. 이것은 "코드의 메인 루프에서 숫자를 분리하기 위해 필요합니다. 말하자면:

...
"
:_96
/6 %
@9_.

스택의 상단이 아직 0이 아닌 한 IP는 다음과 같은 루프에서 다소 밀도가 높은 코드를 통해 실행됩니다.

"
>>>v
^< v
 ^<<

또는 선형으로 배치하십시오.

:_96%._96/

이러한 전환이 필요한 이유는 Labyrinth의 제어 흐름 시맨틱 때문입니다. 현재 셀에 3 개 이상의 이웃이 있으면 IP는 음의 스택 값으로 왼쪽으로 돌아가고 0으로 진행 한 다음 양의 스택 값에서 오른쪽으로 켭니다. 벽이있어 선택한 방향을 사용할 수없는 경우 IP는 반대 방향을 사용합니다 (스택의 상단이 절대 음수는 아니지만 코드에서 왼쪽으로 두 번 회전하는 이유).

루프 코드 자체는 실제로 매우 간단합니다 (압축하지 않았으며 Sp3000의 주요 기여가있는 위치).

:    # Duplicate the remaining encoding number N.
_96  # Push 96, the base.
%.   # Take modulo and print as a character.
_96  # Push 96 again.
/    # Divide N by 96 to move to the next digit.

일단 N0에 도달하면 제어 흐름이 변경됩니다. 이제 IP는 /(즉, 서쪽) 바로 다음으로 이동 하려고하지만 벽이 있습니다. 대신에 (동쪽) 돌아 서면 6다시 실행 하십시오. 그러면 스택의 상단이 양수이므로 IP가 오른쪽으로 바뀌고 (남) 실행합니다 9. 스택의 최상위는 이제 69이지만, 우리가 관심을 갖는 것은 그것이 긍정적이라는 것입니다. IP는 다시 우회전 (서쪽) @하여 코드를 종료하는 쪽으로 이동 합니다.

대체로 실제로는 매우 간단합니다.

이제 추가 바이트를 어떻게 제거할까요? 분명히, 그 no-op는 낭비처럼 보이지만 추가 행이 필요합니다. 루프가 숫자에 인접하면 IP는 전체 수를 순회하지 않고 이미 즉시 이동합니다. 우리는 그 no-op로 유용한 무언가를 할 수 있습니다.

원칙적으로 인코딩에 마지막 숫자를 추가하는 데 사용할 수 있습니다. 인코딩은 정말이 ... 첫 번째 줄에있는 모든 일 필요는 없습니다 !단지 어떤 보장 입니다 도가 인쇄됩니다.

잡기가 있지만 우리는 이것을 할 수 없습니다 :

95852936437949826992796242020587432!
3
:_96
/6 %
@9_.

문제는 지금 우리가를 변경 한 것입니다 "A와 3또한 우리가 갖고 싶어 실제 수를 변경한다. 그리고 그 숫자는로 끝나지 않아야 3합니다. 숫자는 코드에서 시작하여 완전히 결정되기 때문에 !우리는 그것에 대해 많은 것을 할 수 없습니다.

그러나 우리는 다른 숫자를 선택할 수 있습니까? 우리는 3소스를 올바르게 인코딩하는 숫자로 끝나는 한 그 자리에 있는지 여부는 실제로 신경 쓰지 않습니다 . 불행히도, 10 자리 숫자 중 어느 것도 가장 작은 숫자가 선택한 숫자와 일치하는 인코딩을 생성하지 않습니다. 운 좋게도, 나머지 코드에는 약간의 여유가있어 바이트 수를 늘리지 않고도 몇 가지 인코딩을 시도 할 수 있습니다. 세 가지 옵션을 찾았습니다.

  1. 우리는 변경할 수 있습니다 @/. 이 경우 모든 숫자를 사용 1357하고 일치하는 인코딩을 얻을 수 있습니다 . 그러나 이것은 프로그램이 오류와 함께 종료됨을 의미하며 허용되지만 매우 깨끗하지는 않습니다.
  2. 공백이 유일한 "벽"문자는 아닙니다. 사용되지 않은 모든 문자, 특히 모든 문자입니다. 대문자를 사용하면 코드 포인트가 아래에 있기 때문에 기준을 수용 할 필요가 없습니다 _. 26 개의 선택은 많은 가능성을 제공합니다. 예를 들어 A홀수 자릿수가 작동합니다. 이것은 조금 더 좋지만 실제 코드에서 문자를 사용하지 않기 때문에 여전히 그렇게 우아하지는 않습니다.
  3. 더 큰 기초를 사용할 수 있습니다. 기본을 크게 늘리지 않는 한 인코딩의 소수점 이하 자릿수는 동일하게 유지됩니다 (특히 99 이상의 기본에는 실제로 코드 자체에 추가 문자가 필요하지만 최대 104까지는 괜찮습니다). 운좋게도 base 98은 단일 매칭 솔루션을 제공합니다. digit를 사용할 때 1인코딩도로 끝납니다 1. 이것은 기본 96, 97, 98, 99 중에서 유일한 솔루션이므로 실제로 매우 운이 좋습니다. 이것이 우리가이 답변의 맨 위에있는 코드로 끝나는 방식입니다.

19

분실 , 293 262 249 바이트

>:2+52*:6*:(84*+75*):>:::::[[[[[[[:[(52*)>::::[[[[[[:[84*+@>%?!<((((((((((([[[[[[[[[[[[[[ "
\#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\

온라인으로 사용해보십시오!

설명

이 전체 프로젝트는 위아래로 진행되었습니다. 나는 그것이 불가능하다고 생각한 다음 작동 할 수있는 미친 아이디어를 생각해 냈습니다.

잃어버린 Quine가 왜 그렇게 어려운가요?

아시다시피 Lost는 시작 위치와 방향이 완전히 임의 인 2D 프로그래밍 언어입니다. 이것은 방사선 강화 코드를 작성하는 것만 큼 어려운 프로그램을 작성하는 것을 어렵게 만듭니다. 가능한 모든 위치와 방향을 고려해야합니다.

그것은 말을하는 표준적인 방법이 있다고합니다. 예를 들어 다음은 문자열을 인쇄하는 표준 방법입니다.

>%?"Stringv"(@
^<<<<<<<<<<<<<

하단에 수집 스트림이있어 대부분의 IP를 가져 와서 시작 위치로 가져옵니다. 그들이 시작 위치 (왼쪽 위)에 도달하면 스택의 모든 값을 제거하는 루프로 소독 한 다음 문자열을 밀고 나가는 안전을 돌립니다. (안전은 %종료하기 전에 반드시 모든 프로그램을 잃어 버려야하는 고유 한 개념으로 , 시작시 프로그램이 종료 될 가능성을 방지합니다). 이제 내 생각은이 양식을 본격적인 퀴네로 확장하는 것입니다.

가장 먼저해야 할 일은 루프를 약간 재 작업하는 것이었고 기존 루프는 문자열 형식에 따라 다릅니다.

>%?!<"Stringv"(@
^<<<<<<<<<<<<<<<
^<<<<<<<<<<<<<<<

스트림 !위로 점프하고 루프를 만들 가능성을 피하기 위해 두 번째 스트림을 추가해야합니다 .

이제 이것을 표준 Quine 형식과 혼합하고 싶습니다. 로스트는 클라인을 기반으로하기 때문에 기본적으로 마틴 엔더를 위해 클라인 퀸을 빌 렸습니다 .

:2+@>%?!< "
<<<<^<<<<<<
<<<<^<<<<<<

이것은 quine의 첫 번째 줄을 매우 편리하게 인쇄합니다. 이제 스트림을 하드 코딩하기 만하면됩니다. 글쎄, 이것은 말보다 쉽습니다. 나는 이것을 수행하는 대략 4 가지 다른 방법을 시도했다. 나는 그 중 하나를 설명하겠습니다.

여기서 아이디어는 원하는 수의 화살표를 얻기 위해 문을 사용하는 것입니다. 문은 적중 할 때마다 변경되는 특수한 유형의 거울입니다. [왼쪽과 ]오른쪽에서 오는 IP를 반영합니다 . 그들이 양쪽에서 IP에 부딪 칠 때 스위치 방향. 우리는 반복적으로 작업을 수행하기 위해 이러한 문과 정적 반사기를 줄로 만들 수 있습니다.

>:[[[

:세 번 수행 합니다. 이런 식으로 a <를 스택에 푸시하면 적은 바이트로 많은 것을 만들 수 있습니다. 우리는 이들 중 2 개를 각 라인마다 하나씩 만들고, 그 사이에 개행을 내려 놓습니다. 그러나 두 번째 라인은 추가 한 라인을 덮을 때까지만 필요합니다 !. 다른 것들은 비워 두어 몇 바이트를 절약 할 수 있습니다. 이제 스트림에 세로 화살표를 추가해야합니다. 이것은 키 최적화가 시작되는 곳입니다. 모든 ip를 프로그램의 "시작"으로 직접 리디렉션하는 대신 맨 왼쪽으로 시작하는 ip가 이미 알고 있어야하므로 맨 왼쪽으로 리디렉션 합니다.work (또는 최소한 최종 버전에서 작동 할 것입니다) 우리는 다른 ips를 리디렉션 할 수도 있습니다. 이것은 바이트 단위로 저렴하게 만들뿐만 아니라이 최적화가 quine을 가능하게 만드는 것이라고 생각합니다.

그러나 여전히 몇 가지 문제가 있습니다. 가장 중요한 것은 ips >가 푸시 된 후 시작 하지만 복사하기 전에 시작합니다. 이러한 ips는 복사기에 들어가서 0의 복사본을 만듭니다. 스택 정리 메커니즘은 0을 사용하여 스택의 맨 아래를 결정하고 맨 아래에 전체 0을 남겨두기 때문에 좋지 않습니다. 더 강력한 스택 위생 방법을 추가해야합니다. 스택이 비어 있는지 알 수있는 실제 방법이 없으므로 스택에서 가능한 한 많은 항목을 파괴하려고 시도하면됩니다. 여기에서는 앞에서 설명한 문 방법을 다시 한 번 사용합니다. 우리는 ((((((((((([[[[[[[[[[[[[[제로자를 제거하기 위해 첫 번째 줄의 끝에 추가 하여 0을 제거합니다.

이제 스트림을 왼쪽 상단 IP로 리디렉션했기 때문에 문제가 하나 더 있습니다. %아래로 이동하면 이미 안전 기능이 해제되어 조기 종료됩니다. 따라서 안전을 꺼야합니다. #스트림에 a 를 추가 하면 스트림을 통과하는 ip가 꺼지지 만 이미 삭제 된 ip는 그렇지 않습니다. 은 #또한 하드뿐만 아니라 첫 번째 줄에 코딩해야합니다.

그게 다야, 지금 당신은 이것이 어떻게 작동하는지 이해하기를 바랍니다.


: / 너무 많은 오타와 누락 된 링크
ASCII 전용

17

그래 , 1,165 879 606 561 540 522 498 + 7 = 505 바이트

-cheat별명 정의를 허용 하려면 플래그가 필요 합니다.

022222120211111102222122021121202222212021112202222110222212202112110222221202122212022222102222212021222120222221022222102222210222221202222110222211022222210222221022222210222212202222221022221102211110222221022221220222212202112120221111022212202211210222212022222102211120222122022111202222120212212021221202222221022111102221210222122022222102222120212212022221102211110222122022221102222120212212022112120221111022212202112120222212=%;0e-=<;0<-=>;:0~--=1;1>=2;0%{{>0<~{~>~<<}>>>]}>]}${<#}%{@}

온라인으로 사용해보십시오!

설명

이것에는 두 부분이 있습니다 (대부분의 quines와 마찬가지로). 자료:

022222120211111102222122021121202222212021112202222110222212202112110222221202122212022222102222212021222120222221022222102222210222221202222110222211022222210222221022222210222212202222221022221102211110222221022221220222212202112120221111022212202211210222212022222102211120222122022111202222120212212021221202222221022111102221210222122022222102222120212212022221102211110222122022221102222120212212022112120221111022212202112120222212

그리고 디코더 :

=%;0e-=<;0<-=>;:0~--=1;1>=2;0%{{>0<~{~>~<<}>>>]}>]}${<#}%{@}

데이터는 단지 디코더의 이진 인코딩 (또는 오히려 그 역)이다. 각각 0새로운 문자를 시작하고 1s와 2s는 각각 0-와- 1비트입니다.

그 주 0동안, 0을 밀어 표준 그래 명령입니다 12이 시점에서 정의되지 않습니다. 그러나 실제 데이터가 사용될 때까지 및 정의되지 않은 상태를 유지할 수 %있도록 전체 데이터 부분을 명령에 할당합니다 .12%

다음으로 몇 가지 명령을 더 정의합니다.

0e-=<;
0<-=>;
:0~--=1;
1>=2;

<스택의 상단을 감소시키고 >증가시킵니다. 1(직관적이지 않게) 스택의 상단을 두 배로 늘립니다. 2그것을 두 배로 한 다음 증가시킵니다. 이러한 정의 덕분에 0221111실제로 스택에 48 (이진수로 110000)이 남습니다.

나머지 32 바이트는 두 부분으로 실제 디코딩을 수행합니다. 먼저 데이터 문자열을 재구성해야합니다.

0%                ` Push a zero and then the data.
{                 ` For each value...
  {               `   Until that value is zero...
    >0<~{~>~<<}>  `   divmod 2. The div is the input to the next iteration,
                  `   the mod gives us the next bit.
    >>]           `   Increment twice (gives 2 or 3) and put at the bottom
                  `   of the stack.
  }
  >]              ` Increment the 0 and put it at the bottom as well.
}
$                 ` Reverse the entire stack.
{<#}              ` Decrement and print each number.

마지막으로 데이터를 다시 푸시하고 각 값을 문자로 인쇄합니다.

%{@}

나중에 참조 할 수 있도록 데이터를 인코딩 하는 CJam 스크립트 가 있습니다.


17

Fueue , 423 바이트

Fueue는 실행중인 프로그램 큐인 큐 기반 esolang입니다 .

)$$4255%%1(~):[)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]](H-):~:[)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:](106328966328112328136317639696111819119696281563139628116326221310190661962811611211962861109696289611619628116111612896281115421063633063961111116163963011632811111819159628151213262722151522061361613096119619190661966311961128966130281807072220060611612811961019070723232022060611

온라인으로 사용해보십시오!

작동 원리

이 설명 은 방해 가되었을 수도 있고 아닐 수도 있습니다 . 반면에 사람들이 따라갈 수있는 방법으로 짧게 설명 하는 방법을 모르겠습니다.

푸에 치트 시트

이 프로그램에서 사용되지 않는 몇 가지 기능을 포함하여 자세한 내용 은 esolang 위키 기사 를 참조하십시오 .

  • 초기 프로그램은 큐의 초기 상태이며 다음 요소를 포함 할 수 있습니다.

    • 정수 리터럴 (소스에서는 음이 아닌 음수 만 계산 가능)을 실행하면 문자가 인쇄됩니다.
    • 대괄호로 구분 된 중첩 블록, 비활성 (일부 기능이 작동하지 않는 한 그대로 유지됨).
    • 함수의 인수는 대기열에서 바로 다음에 오는 요소입니다.
      • +*/-%: 정수 산술 ( -단항, %논리 부정입니다). 숫자 인수가 제공되지 않으면 비활성입니다.
      • ()<: 괄호 안에 요소를 넣고 블록에서 괄호를 제거하고 블록에 최종 요소를 추가합니다. 후자가 블록 뒤에 있지 않으면 비활성입니다.
      • ~:: 스왑, 복제.
      • $: 복사 (숫자 + 요소 사용). 숫자가 아닌 앞에 비활성.
      • H: 정지 프로그램.

    []중첩 하는 동안 ()하지 마십시오. 후자는 단순히 별도의 함수입니다.

실행 추적 구문

숫자 사이를 제외하고 Fueue에서 공백은 선택 사항입니다. 다음 실행 추적에서는 특히 프로그램 구조를 제안하는 데 사용됩니다.

  • 함수가 실행될 때 함수와 그 인수는 공백이있는 주변 요소에서 시작됩니다. 인수 중 일부가 복잡하면 이들 사이에도 공백이있을 수 있습니다.
  • 많은 실행 추적은 실질적인 데이터 조작을 수행하는 부분에서 오른쪽으로 분리 된 왼쪽의 "지연 블롭"으로 나뉩니다. 다음 섹션을 참조하십시오.

괄호 {}(Fueue에서 사용되지 않음)는 수학 표현식의 정수 결과를 나타 내기 위해 트레이스에 사용됩니다. Fueue에는 음이 아닌 리터럴 만 있기 때문에 음수를 포함합니다 – -부정 함수입니다.

다양한 메타 변수 이름으로 ...값과 약어를 나타냅니다.

전술 지연

직관적으로 실행은 큐 주위를 순환하며 통과하는 내용을 부분적으로 수정합니다. 다음 사이클까지는 기능 결과를 다시 실행할 수 없습니다. 프로그램의 다른 부분은 상호 작용하지 않는 한 효과적으로 병렬로 진화합니다.

결과적으로 많은 코드가 동기화, 특히 프로그램의 일부 부분을 적시에 실행 지연시키는 데 전념합니다. 골프를 타기위한 많은 옵션이 있는데,이 부분을 읽을 수없는 얼룩으로 바꾸는 경향이 있는데,주기별로 실행주기를 추적해야만 이해할 수 있습니다.

이러한 전술이 아래에서 항상 개별적으로 언급되는 것은 아닙니다.

  • )[A]A사이클 지연 . (아마도 가장 쉽고 읽기 쉬운 방법 일 것입니다.)
  • ~ef엘리먼트를 스왑 e하고 f또한 실행을 지연한다. (아마도 읽기는 쉽지 않지만 약간의 지연이있는 경우에는 가장 짧습니다.)
  • $1e단일 요소를 지연시킵니다 e.
  • -%숫자를 지연하는 데 유용합니다 (위해 후자를 0하고 1.)
  • 여러 개의 동일한 요소를 연속으로 지연 :시키거나 하나의 요소 $로 만드는 데 사용할 수 있습니다.
  • (nn브래킷으로 감싸서 나중에 편리하게 제거 할 수 있습니다. 이것은 숫자 계산에 특히 중요합니다. 숫자는 블록에 넣지 않고 복사하기조차 너무 불안정하기 때문입니다.

전반적인 구조

나머지 설명은 각각 실행중인 프로그램 섹션에 대해 7 개의 부분으로 나뉩니다. 대부분의 사이클이 반복 된 이후의 더 큰 사이클은 전체 큐를 통한 단일 패스의 "사이클"과 구별하기 위해 "반복"이라고합니다.

초기 프로그램이 그들 사이에서 어떻게 나누어지는가는 다음과 같습니다.

A:  )$$4255%%1(~
B:  ):[)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
C:  
D:  (H-
E:  
F:  
G:  ):~:[)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:](106328966328112328136317639696111819119696281563139628116326221310190661962811611211962861109696289611619628116111612896281115421063633063961111116163963011632811111819159628151213262722151522061361613096119619190661966311961128966130281807072220060611612811961019070723232022060611

프로그램의 끝에서 큰 숫자는 각각의 ASCII 값으로부터 감산 30 반대로 나머지 문자 당 두 자리, 부호화 (예 그래서이 10인코딩 ().

높은 수준에서이 프로그램의 데이터 (bignum으로 시작)를 오른쪽에서 왼쪽으로 흐르는 것으로 생각할 수 있지만 제어는 왼쪽에서 오른쪽으로 흐르는 것으로 생각할 수 있습니다. 그러나 하위 레벨에서 Fueue는 항상 코드와 데이터의 구별을 방해합니다.

  • 섹션 G는 큰 숫자를 ASCII 숫자 (예 : 0정수로 숫자)로 디코딩하여 48가장 작은 유효 숫자를 먼저 분리합니다. 15 사이클마다 한 자리 숫자를 생성합니다.
  • 섹션 F는 섹션 E가 사용할 수있을 때까지 생성 된 숫자 ASCII 값 (각 블록 내부)을 포함합니다.
  • 섹션 E는 생성 된 자릿수를 한 번에 두 개씩 처리하여 양식 블록으로 [x[y]]쌍을 이루며 각 쌍의 인코딩 된 문자를 인쇄합니다.
  • 섹션 D는 [x[y]]모든 숫자를 포함하고 나면 모든 블록을 인쇄 한 다음 전체 프로그램을 중지 할 수있는 방식으로 블록에서 점진적으로 중첩 된 블록으로 구성됩니다 .
  • 섹션 C는 섹션 D의 구성을 처리하고 섹션 E를 재생성합니다.
  • 섹션 B는 섹션 C와 30 사이클마다 자체를 다시 생성합니다.
  • 섹션 A는 다른 섹션의 마지막 반복까지 사이클을 카운트 다운합니다. 그런 다음 섹션 B를 중단하고 섹션 D를 실행합니다.

섹션 A

섹션 A는 프로그램 종료 일정을 처리합니다. 단일 스왑 기능으로 축소하는 데 4258 사이클이 걸리며 ~, 그러면 메인 루프를 멈추고 섹션 D를 대신 실행하는 섹션 B를 조정합니다.

)$ $4255% %1 (~
)$%%%...%% %0 [~]
)$%%%...% %1 [~]
⋮
)$ %0 [~]
) $1[~]
)[~]
~
  • $함수는 다음의 4,255 카피를 작성 %하면서 (감싸는 ~괄호이다.
  • 마지막으로 각주기 %사이에 다음 수를 전환까지 사용 0하고 1.
  • 모든 %s가 다 사용 되면 $11 개의 사본 [~](효과적으로 NOP)이 작성되고 다음주기 )에서 대괄호 가 제거됩니다.

섹션 B

섹션 B는 30 사이클마다 섹션 C의 새로운 반복뿐만 아니라 자체 재생을 처리합니다.

) : [)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
) [)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]            [BkB]
)$ $24%     %0  :<  [~:)~)]    ~ [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<] [BkB]
)$ %...%%% %1   < < [~:)~)] [BkB]   [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]
)$ %...%% %0      < [~:)~)[BkB]] [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]
)$ %...% %1         [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
⋮
) $1 [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
) [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]                    (1)
~:) ~)[BkB]                 [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]
) : [BkB]                 ) [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]      (2)
) [BkB] [BkB]               $11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<
  • A :는 다음에 나오는 큰 블록을 복제하고 (하나는 약자로 줄여서 [BkB]) )첫 번째 사본에서 괄호 를 제거합니다.
  • $$24%%0 섹션 A의 카운트 다운과 유사한 카운트 다운을 설정합니다.
  • 이 카운트 다운 동안 :<으로 전환 <<하고, ~스왑 블록이, 마지막으로 새로운 섹션 C에 대한 코드를 배치.
  • <함수는 두 개의 마지막 블록을 첫 번째 블록으로 묶습니다. 이것은 정상적인 반복에서는 중복되지만 ~섹션 A부터 끝까지 작업을 수행 할 수 있습니다.
  • (1) 카운트 다운이 끝나면 )외부 브래킷 이 제거됩니다. 다음 ~:)으로 변 ):~)스왑 )섹션 C 코드의 시작.
  • (2) 섹션 B는 이제 초기 사이클로 돌아 왔으며, a )는 섹션 C의 새로운 반복 실행을 시작하기 위해 브래킷을 제거하려고합니다.

마지막 반복 ~에서 시작 섹션 A가 위의 (1) 지점에 나타납니다.

~ ) [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]                  (1)
[~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]              )

~스와프 )에서 부 B 방지 블록에 걸쳐 부 및 C로 다시 실행된다.

섹션 C

섹션 C는 새로운 숫자 문자 쌍을 섹션 D의 블록으로 병합하고 섹션 E의 새로운 반복 생성을 처리합니다.

아래는 전형적인 반복 표시 xy숫자 'ASCII 코드를 표시합니다. 첫 번째 반복에서, 들어오는 "D"및 "E"요소는 초기 [H]이며 -대신에 모든 문자 문자 쌍을 생성하기 위해 이전 섹션 E가 실행되지 않았기 때문입니다.

C                                               D             E
$11~ )  ~<[[+$4--498+*-:~-10)):])<~]  [)))~]  < [)))~[...]]   [x[y]]
~~~ ~~~ ~~~ ~~) [[+$4--498+*-:~-10)):])<~]  < [)))~] [)))~[...][x[y]]]
~~~ ~~~     )  ~ [[+$4--498+*-:~-10)):])<~] [)))~[)))~[...][x[y]]]]
~~~       ~ )   [)))~[....]]                                  [[+$4--498+*-:~-10)):])<~]
                                              ~~[)))~[....]] )[[+$4--498+*-:~-10)):])<~]
                                                [)))~[....]]  ~[+$4--498+*-:~-10)):])<~
  • 이것은이 답변에 대해 발견 한 다른 동기화 방법을 사용합니다. ~한 행에 여러 개의 스왑 기능 이있는 경우 행은 각주기마다 약 2/3로 줄어들지 만 (1 ~개는 2 개의 스왑 때문에 ) 때때로 ~s 의 나머지 부분이 있으면 뒤 따르는 내용 신중하게 조작합니다.
  • $11~그런 행을 생성합니다. 다음 ~스왑 a를 <다음 블록에서. <마지막에 또 다른 숫자는 새로운 숫자 쌍 블록 (숫자 x와 y를 ASCII 코드로)을 D 블록에 추가합니다.
  • 다음 사이클에서 ~행에 ~~나머지 ~가 있으며 다음 을 대체합니다 ). 다른 하나 <는 섹션 D를 [)))~]블록에 추가합니다 .
  • 다음으로 스왑 된 ~자체는 다음 블록을 섹션 D 블록에서 새로운 섹션 E 코드로 교체 합니다. 그런 다음 새로운 나머지는 ~스왑 )에 걸쳐, 그리고 마지막으로 마지막 ~~에서 ~의인으로 섹션 E를 통해 그들의 행 스왑 하나 )의 브라켓을 제거했습니다.

마지막 반복에서 섹션 A가 섹션 B와 섹션 C를 ~교체했습니다 ). 그러나 섹션 C는 너무 짧아서 이미 사라져서 )섹션 D의 시작 부분으로 끝납니다.

섹션 D

섹션 D는 마지막 큰 숫자 인쇄 및 프로그램 중지를 다룹니다. 대부분의 프로그램이 실행되는 동안 B–G 섹션이 빌딩에 대해 협력하는 것은 비활성 블록입니다.

    (H -
    [H]-
    ⋮
    [)))~[H-]]                  After one iteration of section C
    ⋮
    [)))~[)))~[H-][49[49]]]]    Second iteration, after E has also run
    ⋮
)   [)))~[...]]     [49[48]]    Final printing starts as ) is swapped in
    ))) ~[...][49[48]]
    )) )[49[48]] [...]
    )) 49 [48][...]             Print first 1
    ) )[48] [...]
    ) 48 [...]                  Print 0
    )[...]                      Recurse to inner block
    ...
    ⋮
    )[H-]                       Innermost block reached
    H -                         Program halts
  • 프로그램의 첫 번째 사이클 (에서 멈춤 기능 H은 괄호로 묶습니다. A -는 숫자 쌍 대신 첫 번째 반복의 더미 요소로 사용됩니다.
  • 숫자 [49[49]]의 마지막 11에 해당하는 첫 번째 실수 자리 쌍은입니다 .
  • 맨 마지막 디지트 쌍 [49[48]](에 대응하는 10부호의 시작 부분)은 실제로 블록에 포함되지 않고,이 같은 차이는 없습니다 )[A[B]])[A][B]양쪽으로 선회, 동일 A[B].

최종 반복 후, )섹션 B에서 오른쪽으로 교체 된 섹션이 도착하고 섹션 D 블록이 차단 해제됩니다. )))~각 서브 블록의 시작 부분에 모든 부품이 올바른 순서로 실행되어 있는지 확인합니다. 마지막으로 가장 안쪽 블록에는 H프로그램을 정지시키는 것이 포함됩니다.

섹션 E

섹션 E는 섹션 G에 의해 생성 된 ASCII 숫자 쌍의 결합을 처리하고, 둘 다 해당 인코딩 된 문자를 인쇄하고 결합 된 쌍이있는 블록을 섹션 C 및 D로 보냅니다.

다시 아래는 숫자의 ASCII 코드를 사용 x하고 y나타내는 전형적인 반복을 보여줍니다 .

E                                                   F
~ [+$4--498+*-:~-10)):] )              <  ~         [y] [x]
) [+$4--498+*-:~-10)):]                   < [x] [y]
+ $4-  - 498  +*- :~ -10 ) )              : [x[y]]
+---  -{-498} +*- ~~{-10} )       ) [x[y]]  [x[y]]
+--    - 498  +*   -{-10}       ~ ) x  [y]  [x[y]]
+-    -{-498} +               * 10 x  )[y]  [x[y]]
+      - 498                    + {10*x} y  [x[y]]
                         + {-498} {10*x+y}  [x[y]]
{10*x+y-498}  [x[y]]
[x[y]]
  • 수신 숫자 블록이 교환 된 다음 y 블록이 x 블록에 추가되고 전체 쌍 블록이 복사됩니다. 섹션 C와 D의 끝까지 하나의 사본이 남습니다.
  • 다른 사본은 다시 차단 해제되고, 일련의 산술 함수가 적용되어 10*x+y-498인코딩 된 문자의 ASCII 값 을 계산 합니다. 498 = 10*48+48-3048들의 ASCII 인코딩을 취소 x하고 y그동안 30의 인코딩 변화 00–9930–129모든 인쇄 가능한 ASCII를 포함한다.
  • 결과 숫자는 실행 상태로 남아 문자를 인쇄합니다.

섹션 F

섹션 F는 ASCII 숫자 코드를 포함하는 비활성 블록으로 구성됩니다. 섹션 E는 G가 프로그램을 생성하는 것과 동일한 속도로 프로그램을 소비하기 때문에 대부분의 프로그램 실행에는 최대 2 개가 있습니다. 그러나 최종 인쇄 단계에서 일부 중복 0숫자가 여기에 수집됩니다.

[y] [x] ...

섹션 G

섹션 G는 프로그램의 끝에서 큰 숫자를 나누고, 유효 숫자를 가장 먼저 빼고, ASCII 코드가있는 블록을 다른 섹션으로 왼쪽으로 보내는 것을 처리합니다.

정지 점검이 없으므로 0섹션 D가 H함수를 사용 하여 전체 프로그램을 정지시킬 때까지 숫자가 0으로 줄어든 경우 실제로 숫자를 계속 생성 합니다.

[BkG] 큰 시작 코드 블록의 사본을 축약하여 새 반복을 시작하기 위해 자체 복제에 사용됩니다.

첫 번째 사이클에서 초기화 :

) :~  : [)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:]  ( 106328966328112328136317639696111819119696281563139628116326221310190661962811611211962861109696289611619628116111612896281115421063633063961111116163963011632811111819159628151213262722151522061361613096119619190661966311961128966130281807072220060611612811961019070723232022060611
)  ~ ~ [)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:]  [BkG] [10...11]
) [)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:]     ~ [BkG] [10...11]
) [):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]       ~ : [10...11]  [BkG]

일반적인 반복 N은 분할 할 숫자를 나타냅니다.

) [):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]        ~ : [N]  [BkG]
) :~ [)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+ :5 )         : [N]  : [BkG]
)  ~ ~ [)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]  +5 5     ) [N]  [N] [BkG] [BkG]
) [)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]               ~ 10 N  [N] [BkG] [BkG]
) ~:~  ~ ( [:~)*[):~[$1(+48]):~+]-:~~)10)~~]               / N 10  [N] [BkG] [BkG]
)  ~ : [:~)*[):~[$1(+48]):~+]-:~~)10)~~]                 ( {N/10}  [N] [BkG] [BkG]
) [:~)*[):~[$1(+48]):~+]-:~~)10)~~]                    : [{N/10}]  [N] [BkG] [BkG]
:~ )*[):~[$1(+48]):~+]- :~ ~)10 )           ~ ~ [{N/10}]  [{N/10}] [N] [BkG] [BkG]
~~) *[):~[$1(+48]):~+]- ~~10 )             ) [{N/10}]  ~ [{N/10}] [N]  [BkG] [BkG]
)  ~ * [):~[$1(+48]):~+]  -10            ~ ) {N/10}  [N] [{N/10}] [BkG] [BkG]
) [):~[$1(+48]):~+]               * {-10} {N/10}  ) [N]  [{N/10}] [BkG] [BkG]
) :~ [$1(+48]) :~                 + {-10*(N/10)} N  [{N/10}] [BkG] [BkG]
)  ~ ~ [$1(+48]  )                 ~ ~ {N%10}  [{N/10}] [BkG] [BkG]
) [$1(+48]                 ~ ) {N%10}  ~ [{N/10}] [BkG]  [BkG]
$1(                     + 48 {N%10}    ) [BkG]  [{N/10}] [BkG]
                        ( {48+N%10}   BkG [{N/10}] [BkG]            New iteration starts
                        [{48+N%10}]   ....
  • 지연 블롭은 특히 털이 있습니다. 그러나 새로운 지연 트릭은 두 사이클 을 지연시키는 +:5대신 사용하는 것입니다 . 아아 , 프로그램에서 하나만 도움이되었습니다.--101010
  • [N][BkG]블록 중복의 다음 한 사본 N으로 나누어 져 있습니다 10.
  • [{N/10}]중복 다음 이상의 산술 기능의 마지막 자리의 ASCII 코드를 계산하는데 사용되는 N등을 48+((-10)*(N/10)+N). 이 ASCII 코드가있는 블록은 섹션 F에 남습니다.
  • 다른 사본은 블록 [{N/10}]사이에서 교환되어 [BkG]새로운 반복의 시작을 설정합니다.

보너스 퀘인 (540 바이트)

)$$3371%%1[~!~~!)!]):[)$$20%%0[):]~)~~[)$$12%%0[<$$7%~~0):~[+----48+*-~~10))]<]<~!:~)~~[40~[:~))~:~[)~(~~/[+--48):]~10]+30])):]]][)[H]](11(06(06(21(21(25(19(07(07(19(61(96(03(96(96(03(11(03(63(11(28(61(11(06(06(20(18(07(07(18(61(11(28(63(96(11(96(96(61(11(06(06(19(20(07(07(18(61(30(06(06(25(07(96(96(18(11(28(96(61(13(15(15(15(15(22(26(13(12(15(96(96(19(18(11(11(63(30(63(30(96(03(28(96(11(96(96(61(22(18(96(61(28(96(11(11(96(28(96(61(11(96(10(96(96(17(61(13(15(15(22(26(11(28(63(96(19(18(63(13(21(18(63(11(11(28(63(63(63(61(11(61(42(63(63

온라인으로 사용해보십시오!

어떤 방법이 가장 짧은 지 잘 모르기 때문에 먼저 문자를 (s로 구분 된 두 자리 숫자로 인코딩하려고했습니다 . 핵심 코드는 약간 짧지 만 50 % 더 큰 데이터 표현이이를 보완합니다. 내가 이길 수 없다는 것을 깨달았을 때 나는 다른 골프만큼 골프를 치지 않았다. 한 가지 장점이 있습니다. bignum을 지원하는 구현이 필요하지 않습니다.

전체 구조는 기본 구조와 다소 유사합니다. 데이터 표현이 섹션 F를 직접 채우므로 섹션 G가 누락되었습니다. 그러나 섹션 E는 두 자리 숫자의 숫자를 재구성하기 위해 유사한 divmod 계산을 수행해야합니다.


1
설명 XD
VFDan

1
)$n[)](지연 카운터의 바이트가 짧습니다.
jimmy23013

15

젤리, 3 바이트

”ṘṘ

온라인으로 사용해보십시오!

확인

$ echo $LANG
en_US
$ xxd -g 1 quine.jelly
0000000: ff cc cc                                         ...
$ ./jelly f quine.jelly | xxd -g 1
0000000: ff cc cc                                         ...

작동 원리

”ṘṘ    Main link. No input.

”Ṙ     Set the return value to the character 'Ṙ'.
  Ṙ    Print a string representation of the return value.
       This prints: ”Ṙ
       (implicit) Print the return value.
       This prints: Ṙ

어떤 버전의 인터프리터를 사용합니까? 테스트 할 때 입력이 Jelly의 코드 페이지에 있더라도 UTF-8로 출력됩니다 (인코딩 변경으로 인해 Quine가 아님).

1
출력의 인코딩은 터미널 설정에 따라 다릅니다. UTF-x로 설정되어 있으면이를 사용합니다. 다른 것으로 설정되면 Jelly의 코드 페이지를 사용합니다. 리눅스에서는 LANG=en_US그렇게합니다. tio.run/nexus/bash#@@/…
Dennis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.