작업
이 도전에서, 당신의 임무는 일종의 상호 quine-like 시스템을 형성하는 세 개의 프로그램을 작성하는 것입니다. 하자가 프로그램을 호출 A
, B
하고 C
. 프로그램 중 하나에 다른 프로그램의 소스가 입력으로 제공되면 세 번째 프로그램의 소스가 출력됩니다. 예를 들어, 입력 A
으로 제공된 B
경우을 출력 C
합니다. 프로그램이 입력으로 자신의 소스를 제공하는 경우, 그들은 출력 세 개의 문자열하여야한다 "three"
, "mutual"
그리고 "quines"
(따옴표없이). 모든 경우에, 그들은 하나의 추가 후행 줄 바꿈을 출력 할 수 있습니다. 다른 입력의 경우 프로그램은 충돌을 포함하여 모든 작업을 수행 할 수 있습니다.
예
예를 들어, 그 소스 코드를 가정 A
, B
하고 C
있다 aSdf
, ghJk
그리고 zxcV
. 그런 다음 프로그램은 다음과 같이 작동해야합니다.
Source Input Output
--------------------
aSdf aSdf three
aSdf ghJk zxcV
aSdf zxcV ghJk
ghJk aSdf zxcV
ghJk ghJk mutual
ghJk zxcV aSdf
zxcV aSdf ghJk
zxcV ghJk aSdf
zxcV zxcV quines
규칙과 득점
솔루션은 A
, B
및 C
기능 또는 전체 프로그램 중 하나가 될 수 있지만 완전히 독립적이어야 에는 공유 코드는 허용되지 않습니다.
표준 허점 및 퀴니 규칙이 적용되므로 프로그램은 어떤 방식 으로든 자체 소스 코드에 액세스 할 수 없습니다.
당신의 점수는의 결합 된 바이트 수입니다 A
, B
그리고 C
낮은 점수는 더 나은 것.
답변
CJam, 165 (147) 114 (108) 99 바이트
2 _ri^_q+@"quinesmutualthree"6/=?
1 _ri^_q+@"quinesmutualthree"6/=?
3 _ri^_q+@"quinesmutualthree"6/=?
48 바이트를 절약 할 수있는 제안에 대한 @ MartinBüttner에게 감사드립니다!
CJam 통역사 에서 온라인으로 사용해보십시오 .
확인
$ cat A
2 _ri^_q+@"quinesmutualthree"6/=?
$ cat B
1 _ri^_q+@"quinesmutualthree"6/=?
$ cat C
3 _ri^_q+@"quinesmutualthree"6/=?
$
$ cjam A < A
three
$ cjam A < B
3 _ri^_q+@"quinesmutualthree"6/=?
$ cjam A < C
1 _ri^_q+@"quinesmutualthree"6/=?
$
$ cjam B < A
3 _ri^_q+@"quinesmutualthree"6/=?
$ cjam B < B
mutual
$ cjam B < C
2 _ri^_q+@"quinesmutualthree"6/=?
$
$ cjam C < A
1 _ri^_q+@"quinesmutualthree"6/=?
$ cjam C < B
2 _ri^_q+@"quinesmutualthree"6/=?
$ cjam C < C
quines
생각
세트 {0, 1, 2, 3} 은 ^ (이진 배타적 OR) 연산 하의 그룹 이며, 여기서 각 요소는 자체 역수입니다.
첫 번째 문자 ( {0, 1, 2, 3} 의 요소)를 제외하고 세 프로그램이 모두 동일하면 쉽게 구분하고 인쇄 할 수 있습니다.
-
우리는 소스 코드의 시작과 입력에서 숫자를 XORing하여 시작합니다.
-
결과가 0 이면 소스와 입력이 일치합니다.
따라서이 공통 자릿수로 선택한 세 단어 중 하나를 인쇄합니다.
-
결과가 0 이 아닌 경우 소스 또는 입력에없는 {1, 2, 3} 의 요소입니다 .
따라서 우리는 그것을 입력하고 나머지 입력을 인쇄합니다.
작동 원리
2 e# Push the number N on the stack.
_ e# Push a copy.
r e# Read a token from STDIN, i.e., the input up
e# to and excluding the next whitespace char.
i e# Cast to integer.
^ e# XOR it with the copy of N. Result: X
_ e# Push a copy of the result.
q+ e# Append the rest of the input.
@ e# Rotate N on top of the stack.
"quinesmutualthree"6/ e# Push ["quines" "mutual" "three"].
= e# Select the word at index N.
? e# If X is non-zero, select the modified input;
e# otherwise, select the word.