三个相互的奎因


23

任务

在这个挑战中,您的任务是编写三个程序,这些程序形成一种相互类似quine的系统。让我们把这些程序ABC。如果其中一个程序被提供了另一个程序的源作为输入,则它应输出第三个程序的源。例如,如果A给出B作为输入,则输出C。如果给程序提供了它们自己的源作为输入,则它们应输出三个字符串"three""mutual""quines"(不带引号)。在所有情况下,它们都可能输出一个附加的尾随换行符。对于任何其他输入,程序可能会执行任何操作,包括崩溃。

例如,假设的源代码ABCaSdfghJkzxcV。然后,程序应表现如下。

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

规则和计分

该解决方案AB并且C可以是功能或完整的程序,但他们必须是完全独立的:没有共享的代码是允许的。 由于存在标准漏洞quine规则,因此程序无法以任何方式访问其自身的源代码。

你的分数是结合字节数AB以及C较低的分数更好。


到底什么意思是“不允许共享代码”?他们不能有相似的零件吗?(这将使用Java进行回答变得困难,因为大多数程序在public static void main某个地方都有一部分。)或者仅仅是您不能编写一个被这三个函数调用的函数?
圣保罗Ebermann

@PaŭloEbermann这意味着后者:3个程序中的每一个都应独立运行。
Zgarb 2015年

Answers:


16

CJam,165个 147 114 108 99字节

2 _ri^_q+@"quinesmutualthree"6/=?
1 _ri^_q+@"quinesmutualthree"6/=?
3 _ri^_q+@"quinesmutualthree"6/=?

感谢@MartinBüttner的建议,该建议有助于节省48个字节!

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}是操作^(二进制异或)下的一个组,其中每个元素都是其自己的逆。

如果除了第一个字符(元素{0,1,2,3})之外的所有三个程序都相同,我们可以轻松区分并打印它们:

  • 我们首先对源代码和输入开头的数字进行异或运算。

  • 如果结果为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.

2
哇,我读了这个问题,心想:“没有人会为此提供答案。” 然后我低下头,看到丹尼斯(还有谁?)的答案+1!
水平河圣
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.