세 개의 상호 퀴즈 C. 프로그램 중 하나에

작업

이 도전에서, 당신의 임무는 일종의 상호 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, BC기능 또는 전체 프로그램 중 하나가 될 수 있지만 완전히 독립적이어야 에는 공유 코드는 허용되지 않습니다.
표준 허점퀴니 규칙이 적용되므로 프로그램은 어떤 방식 으로든 자체 소스 코드에 액세스 할 수 없습니다.

당신의 점수는의 결합 된 바이트 수입니다 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.


답변