Tres quines mutuos

23

La tarea

En este desafío, su tarea es escribir tres programas que formen una especie de sistema mutuo tipo quine. Llamemos a los programas A, By C. Si uno de los programas recibe la fuente de otro programa como entrada, dará salida a la fuente del tercer programa. Por ejemplo, si Ase da Bcomo entrada, sale C. Si los programas se les da su propia fuente como entrada, se presentará a la salida de las tres cuerdas "three", "mutual"y "quines"(sin comillas). En todos los casos, pueden generar una nueva línea final adicional. Para cualquier otra entrada, los programas pueden hacer cualquier cosa, incluido el bloqueo.

Ejemplo

Por ejemplo, suponga que los códigos fuente de A, By Cson aSdf, ghJky zxcV. Entonces los programas deberían comportarse de la siguiente manera.

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

Reglas y puntaje

Las soluciones A, By Cpueden ser funciones o programas completos, pero deben ser completamente independientes: no se permite código compartido. Se aplican las lagunas estándar y las reglas de quine , por lo que los programas no pueden acceder a sus propios códigos fuente de ninguna manera.

Su puntaje es el recuento combinado de bytes de A, By C, menor puntaje es mejor.

Zgarb
fuente
¿Qué significa exactamente "no se permite ningún código compartido"? ¿No pueden tener partes similares? (Esto dificultaría la respuesta en Java, ya que la mayoría de los programas tienen una public static void mainparte en alguna parte). ¿O simplemente que no puede escribir una función llamada por los tres?
Paŭlo Ebermann
@ PaŭloEbermann Significa lo último: cada uno de los 3 programas debería funcionar por sí solo.
Zgarb

Respuestas:

16

CJAM, 165 147 114 108 99 bytes

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

¡Gracias a @ MartinBüttner por una sugerencia que ayudó a ahorrar 48 bytes!

Pruébelo en línea en el intérprete de CJam .

Verificación

$ 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

Idea

El conjunto {0, 1, 2, 3} es un grupo bajo la operación ^ (OR exclusivo binario), donde cada elemento es su propio inverso.

Si los tres programas son idénticos, excepto el primer carácter (un elemento de {0, 1, 2, 3} ), podemos distinguirlos e imprimirlos fácilmente:

  • Comenzamos por XORing el dígito al comienzo del código fuente y la entrada.

  • Si el resultado está en 0 , la fuente y la entrada coinciden.

    Por lo tanto, imprimimos una de las tres palabras, seleccionadas por este dígito común.

  • Si el resultado no es 0 , es el elemento de {1, 2, 3} que no está ni en la fuente ni en la entrada.

    Por lo tanto, lo imprimimos, seguido del resto de la entrada.

Cómo funciona

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.
Dennis
fuente
2
Wow, leí la pregunta y pensé "a nadie se le ocurrirá una respuesta para eso". Luego miré hacia abajo y vi una respuesta de Dennis (¿quién más?) +1!
Level River St el