CJam, ( 58 56 54 48 46 x 2) * 48 % = 44.16
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
인쇄
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
각 줄의 공백이 아닌 문자는 두 개의 상호 퀴즈 사이에서 동일하게 유지됩니다.
그러나 지금 정말 달콤한 부분 :
{`"_~"+{_,94\m2/S*a_+\*{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~N/23f/Wf%N*}_`'"#)!*}_~
quine입니다! :)
여기에서 테스트하십시오.
작동 원리
CJam에서 일반적으로 퀴닝의 기본 사항을 설명하기 때문에 다른 제출물에 대한 설명을 먼저 읽는 것이 좋습니다.
이것은 조금 까다 롭습니다. 다른 경우와 같이 상호 quine의 경우 각 줄 앞뒤에 공백을 추가하고 0을 2로 바꿔서 결과 프로그램이 공백을 반대쪽 끝에 놓아 블록의 문자열 표현을 수정합니다.
공백은 상호 퀴즈에 전혀 영향을 미치지 않습니다. 첫 번째는 실제로 사용되지 않는 블록에 있으며 두 번째는 전체 코드 주위에 있습니다.
두 가지를 결합 할 때 정기적으로 퀴인을 얻으려면 모든 수정을 피하는 방법을 찾아야합니다. 공백과 코드의 구조는 둘을 결합함으로써 한 퀴니 전체를 다른 퀴니에 삽입한다는 것을 의미합니다. 따라서 전체 수정 코드를 블록에 넣으면 실제 내용에 따라 해당 블록을 실행할 수 있습니다.
이제이 블록이 있습니다 ... 상호 퀴인에는 실제로 실행하려는 코드 만 포함됩니다. 결합 된 quine의 경우, 임의의 위치에 임의의 의미로 전체 quine을 다시 포함하지만 ... 블록이기 때문에 자동으로 실행되지 않습니다. 따라서 해당 블록의 내용을 기반으로 문자열을 수정할지 여부를 결정할 수 있습니다. 그게 다야 _`'"#)!
. 블록을 복제하고 문자열로 변환하고 문자를 검색합니다 "
(상호 quine에서는 블록 외부 에만 나타남 ) -1
. 문자를 찾을 수 없으면 검색이 반환 되고 그렇지 않으면 양의 정수가 반환 됩니다. 결과가 증가합니다. 논리적으로 부정합니다. 따라서 a "
가 발견되면 0
그렇지 않으면 결과가됩니다 1
. 이제 우리는 단지*
결과가 1이고 전혀 그렇지 않은 경우 블록을 한 번 실행합니다.
마지막으로 다음과 같이 수정 코드가 작동합니다.
_,94\m2/S*a_+\*N/23f/Wf%N*
_, "Duplicate the quine string and get its length.";
94\m "Subtract from 94.";
2/ "Divide by two.";
S* "Create a string with that many spaces. This will be
an empty string for the first mutual quine, and contain
23 spaces for the second mutual quine.";
a_+ "Create an array that contains this string twice.";
\* "Join the two copies together with the quine string.";
N/ "Split into lines.";
23f/ "Split each line into halves (23 bytes each).";
Wf% "Reverse the two halves of each line.";
N* "Join with a newline.";
현상금 청구, (12 x 10) * 48 % = 57.6
이 코드는 약간의 수정으로 더 많은 줄로 쉽게 나눌 수 있습니다. 우리는 2 개의 문자를 추가하여 48 행을 얻습니다. 그러면 8로 편리하게 나눌 수 있습니다. 그래서 6 줄의 코드와 6 칸의 8 줄을 갖습니다. 이를 위해 몇 개의 숫자를 변경하고 연산자를 두 개로 재정렬해야하므로 두 줄로 나뉘 지 않습니다. 그것은 우리에게 12 x 8 크기의 작업 버전을 제공합니다 ... 그래서 우리는 아무것도하지 않는 두 줄을 추가합니다 (1 푸시, 1 팝, 1 푸시, 1 팝 ...). 12 x 10 :
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
이전과 같이
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
(측면 참고 : 중간 라인에서 왼쪽과 오른쪽을 교대로 유지할 필요는 없으며 첫 번째와 마지막 라인의 위치 만 중요합니다. 다른 모든 라인에 대해 왼쪽과 오른쪽을 임의로 선택할 수 있습니다.)
그리고 순수한 우연의 일치를 통해 전체 quine도 여전히 작동합니다.
{`"_~"{`"_~"
+{129X+{129X
$,m2/S$,m2/S
*a_+\**a_+\*
N/6f/1N/6f/1
;1;1;1;1;1;1
;1;1;1;1;1;1
;Wf%N*;Wf%N*
}_`'"#}_`'"#
)!*}_~)!*}_~
(내부 코드를 실행하지 않는 부분은 다른 퀴인과 이상하게 산재 해 있지만 여전히 잘 작동하기 때문에 우연의 일치라고 말합니다.)
즉 1;
, 바운티 요구 사항을 충족시키기 위해 원본 제출에 44 줄을 추가 할 수 있었지만 12 x 10
훨씬 깔끔해 보입니다. ;)
편집 : 하하, "순수한 우연의 일치"라고 말했을 때 나는 더 이상 주목할 수 없었습니다. 마지막 퀴니가 실제로 어떻게 작동하는지 살펴 보았습니다. 3 개의 중첩 된 블록이 있습니다 (실제로 4 개이지만 가장 안쪽 블록은 관련이 없음). 이 3 개의 블록 중 가장 안쪽 부분의 유일한 중요한 부분은 블록을 포함 "
한다는 것 '"
입니다. quine의 기본 구조는 다음과 같습니다.
{`"_~"{`"_~"+{___'"___}_`'"#)!*}_~)!*}_~
그것을 해보자.
{`"_~" }_~ "The standard CJam quine.";
{`"_~"+ }_~ "Another CJam quine. Provided it doesn't do
anything in the rest of that block, this
will leave this inner block as a string on
the stack.";
) "Slice the last character off the string.";
! "Negate... this yields 0.";
* "Repeat the string zero times.";
그래서 이것은 실제로 재미있는 마술을하지만 내부 블록이 스택에 단일 문자열을 남기기 때문에 )!*
빈 문자열로 바꿉니다. 유일한 조건은 내부 블록의 내용 +
이 스택에 다른 작업을 수행하지 않는다는 것입니다.
{___'"___} "Push a block which happens to contain
quotes.";
_`'"#)!* "This is from the original code and just
removes the block if it does contain
quotes.";