Quine de doble rendija

11

Objetivo:

Codifique dos programas donde cada uno de los programas genere ambos códigos fuente entrelazados por carácter, como una cremallera, un Quine de doble rendija. La salida de un Quine de doble rendija comienza con el primer carácter del código fuente del primer programa. Si el código fuente de uno de los programas es más corto que el otro, entonces el resto de la salida debe rellenarse con el resto del código fuente más largo.

Reglas:

  1. Puede usar cualquier lenguaje de programación para ambos programas, no necesariamente el mismo lenguaje de programación para ambos.
  2. Sus programas no deben recibir ninguna entrada de un archivo, nombre de archivo, red, el otro programa o cualquier otra cosa.

Criterios obligatorios:

  • Hay una trampa, en algún lugar de la salida, la palabra QUINEen mayúsculas debe existir, sin interrupciones.
  • Debe indicar qué dos lenguajes de programación está utilizando. Si está utilizando el mismo lenguaje de programación para ambos, entonces solo necesita indicar un lenguaje de programación.
  • Ambos programas deberían poder ejecutarse o ser interpretados, respectivamente, independientemente del otro programa.

Ejemplo:

Teniendo este código fuente de ejemplo del programa uno :

"QIE"

Teniendo este código fuente de ejemplo del programa dos :

"UN"

Entonces, la salida de Quine de doble rendija válida de ambos programas debe ser:

""QUINE""

Este es el código de golf, el menor número de bytes al sumar la longitud de ambos códigos fuente, y obviamente también la longitud de la salida de cada programa, ¡gana!

Plarsen
fuente
Cada programa individual no tiene que ser también una quine, ¿correcto? ¿Y cada programa debe contener al menos un personaje?
mbomb007
@ mbomb007 Eso es correcto. Cada programa individual debe generar ambos caracteres de código fuente como una cremallera de principio a fin. Bueno, supongo que necesitará al menos 1 byte en un lenguaje de programación para generar QUINE. La salida de ambos programas debe ser idéntica.
Plarsen
No estoy seguro de entender que el resto de la salida se debe completar con el resto del código fuente más largo correctamente. ¿Cómo sería Ay XYZsería intercalado? AXYZ?
Dennis
@Dennis Just like .+or zworks
Optimizer
@Dennis Correcto. Lo que queda del código fuente más largo cuando el más corto se queda sin bytes debe agregarse a la salida de ambos programas.
Plarsen

Respuestas:

9

CJam, 49 47 bytes

{`:_"__~~e#QUINE"}_~

y

{`:_"__~~e#QUINE"}_~e#QUINE

ambos imprimen

{{``""__~~""++::__""ee##QQUUIINNEE""}}__~~e#QUINE

Pruébelo en línea: programa 1 , programa 2 , prueba de validez

Cómo trabajan ellos

{                }   e# Push a code block.
                  _~ e# Execute a copy.
 `                   e# Convert the code block into a string.
  :_                 e# Duplicate each character of the resulting string.
    "__~~e#QUINE"    e# Push this string.

El programa 1 termina aquí y tiene una representación de cadena de todo su código fuente (que cada carácter repite dos veces), así como la cadena e # QUINE en la pila.

El programa 2 analiza adicionalmente e#QUINE, que es un comentario.

En ambos casos, CJam imprime las dos cadenas automáticamente, lo que resulta en la salida mencionada anteriormente.

Dennis
fuente
4

En serio, 46 56 42 bytes

QUNX;RZtdXεj.ƒ£REIQ

Hex Dump:

51554e583b525a746458ee6a2e7f9f9c524549510a

El segundo programa es este programa exacto invertido. Contiene un carácter invisible, pero el recuento de bytes es correcto. Ambos programas generan esta cadena palindrómica:


QQUINEXR;£RƒZ⌂t.djXεεXjd.t⌂ZƒR£;RXENIUQQ

(Por alguna razón, muestra el carácter invisible cuando lo emite en mi terminal. Realmente no entiendo ese byte 7F).

Cómo funciona:

Q                     Push the source to the stack
 U                    Nop
  NX                  Push and pop lyrics to 99 bottles of beer
    ;R                Make a copy of the source reversed.
      Z               Zip them together.
       t              Completely flatten the list.
        dX            Delete the trailing newline
          εj          Join it into a string.
            .         Print it with a trailing newline.
             ⌂        (This is that 7F byte that won't show up. It halts.)

El resto del programa no se ejecuta.

Luego la otra dirección:

\n                   Nop
  Q                  Push the source code.
   IE                Nops
     R               Reverse source code to get source of first program
      £              Eval it into a function
       ƒ             Call it.

En este punto, ahora estamos ejecutando el primer programa anterior, por lo que la ejecución continúa como se describe allí.

Estoy explotando fuertemente el hecho de que varios comandos no hacen nada a las cadenas o pilas vacías aquí. También estoy explotando el comportamiento inesperado de tcuando solo hay un elemento en la pila. No espere que este programa funcione en futuras versiones de Seriously.

A medida que la versión en línea del intérprete Seriously continúa sin funcionar, tendrá que descargar el intérprete y ejecutarlo en su propia máquina para probarlo.

quintapia
fuente
@ Dennis, ¿lo probaste en tu computadora? Eso puede ser un artefacto de mi propio entorno de construcción.
quintopia
@ Dennis nvm tienes razón. Todos los métodos de salida de Seriously agregan un salto de línea. Puedo arreglarlo a costa de 8 bytes. Parece que su método será más corto (lo cual es triste porque este método es más genial en mi opinión).
quintopia
1

GolfScript, 46 bytes

{`{.}%"..~~QUINE"}.~

y

{`{.}%"..~~QUINE"}.~QUINE

ambos imprimen

{{``{{..}}%%""....~~~~QQUUIINNEE""}}..~~QUINE

Pruébelo en línea: programa 1 , programa 2 , prueba de validez

Cómo funciona

{`{.}%"..~~QUINE"}.~

{                }    # Push a code block.
                  .~  # Execute a copy.
 `                    # Convert the code block into a string.
  {.}%                # Duplicate each character of the resulting string.
      "..~~QUINE"     # Push that string.

El código fuente del programa 2 analiza adicionalmente QUINE\n, que son dos tokens indefinidos.

Dennis
fuente
1

Perl, 61 + 60 = 121 bytes

Programa 1:

$x=q<print"\$x=q<$x>;eval\$x#"=~s/./$&$&/gr,QUINE>;eval$x#QIE

Programa 2:

$x=q<print"\$x=q<$x>;eval\$x#"=~s/./$&$&/gr,QUINE>;eval$x#UN

Pensé en probar esto en un lenguaje que no sea de golf. Esto es básicamente un constructor universal de quine en Perl modificado para duplicar cada carácter antes de imprimirlo y agregarlo QUINEal final. Luego solo tenemos que pegar un comentario al final del código para compensar el texto agregado.

(Escribí esto sin mirar realmente las otras respuestas. Resulta que sería posible guardar un byte colocando el comentario completo en un programa, pero no estoy seguro de si debería copiar descaradamente algoritmos como ese).


fuente