Reto
Haga dos programas, A y B, que son programas cat en el mismo idioma. Cuando se concatena, AB (también en el mismo idioma) debe ser una quine.
Por ejemplo, supongamos que hello
y world
son ambos programas de gatos en XYZ idioma. Si helloworld
es una quine en dicho idioma, entonces su solución es válida.
Para aquellos de ustedes que no están familiarizados con gatos y quines, un programa de gato es uno que imprime exactamente lo que se le dio a través de stdin y un quine es un programa que imprime su propio código fuente.
Puntaje y Reglas
- El recuento total de bytes del programa AB concatenado es su puntaje. Como se trata de código de golf, gana el puntaje más bajo.
- Las lagunas estándar están prohibidas
- La entrada debe tomarse de stdin y la salida debe ir a stdout.
- Los programas cat no necesitan tomar argumentos; solo necesitan copiar stdin en stdout.
- La quine debería funcionar cuando el programa no recibe ninguna entrada, pero no tiene que funcionar correctamente (pero puede) para otras entradas.
- La quine no necesita terminar, siempre que imprima exactamente su código fuente una vez, nada más.
- La quine debe tener al menos un byte de largo.
- A y B pueden ser el mismo programa.
- BA no necesita ser una quine o incluso un programa válido.
AB
debe estar vacío, ya que muchos idiomas tienen un gato de 0 bytes que permite una quine de 0 bytes.Respuestas:
V , 2 + 2 == 4 bytes
Prueba la quine!
¡Prueba el gato!
A es
2i
B es también
2i
¿Como funciona?
En primer lugar, algunas explicaciones de cómo funciona V. Una cosa notable que hace posible esta respuesta es que en V, el programa vacío es un programa cat. Este no es un caso especial, es inherente a cómo opera V. En el inicio, todas las entradas se cargan en un "búfer", cada comando modifica el búfer de alguna manera, y luego, cuando el programa termina, el búfer se imprime implícitamente. Esto significa que cualquier cadena de NOP también es un programa cat.
El
i
comando significa ingresar al modo de inserción , lo que significa que cada carácter que sigue a uni
se agregará al búfer. Con un número que lo precede, ese texto se duplicará n veces.Esto significa que para el programa cat, no se agregará nada al búfer, y se imprimirá tal como se leyó. En otras palabras:
Pero para la quine, hay texto después de
i
:Descarado sin respuesta
V , 0 bytes
Pruébalo en línea!
A es el programa vacío.
B es también el programa vacío.
:PAGS
fuente
Ruby, 71 bytes
Se puede dividir en gatos de la siguiente manera:
y
Los dos gatos son idénticos, excepto por los 2 principales, que no funcionan en los tres programas. El
<<2
es una herejía, lo que significa que todo lo que comienza en la línea siguiente hasta que termina en 2 en su propia línea es una cadena, que concatenamos a sí mismo (*2
) y agregamos un 2 al final. En los gatos, la herejía está bien formada pero vacía. así que la expresión regular no coincidirá y pasaremos a la$<.read
expresión y la salida STDOUT. Sin embargo, una vez que capturamos a los gatos, la cadena no terminará hasta la tercera línea, por lo que la expresión regular coincide y hacemos un cortocircuito y sacamos la quine.fuente
Pyth,
29 bytes (5 + 24)27 bytes (5 + 22)Eso fue divertido.
Prueba el quine aquí
Prueba el primer gato aquí
Prueba el segundo gato aquí
Explicaciones
fuente
C # (compilador de Visual C #) , 551 bytes
A: 95 bytes
Pruébalo en línea!
B: 438 + 18 bytes
Pruébalo en línea!
A + B: 533 + 18 bytes
Pruébalo en línea!
A y B toman la entrada como un argumento de línea de comando. A + B ignora cualquier entrada. Se agregan 18 bytes en B y A + B para el
/p:StartupObject=B
opción enviada a MSBuild. Es estrictamente necesario en A + B, pero parecía una trampa no tenerlo también en B. De esta manera, los indicadores del compilador para A + B son los indicadores del compilador para A (ninguno) más los indicadores del compilador para B.Explicación
El programa A es sencillo. La clase A contiene una variable estática (no utilizada)
i
inicializada2
e imprime su primer argumento cuando se ejecuta. Al//
final es importante para el código A + B, pero no hace nada en A en sí.El programa B es extraño de forma aislada, pero esencialmente igual. Crea una clase A que contiene una variable estática
i
inicializada0
y luego ejecuta el método Main de la clase B, que hace lo mismo que el programa A porqueA.i
es menor que 1, y regresa antes que cualquiera de las cosas extrañas. Las nuevas líneas no son necesarias aquí, pero son importantes para A + B.Cuando se combina, el
//
Programa A comenta la declaración de Clase A del Programa B, pero debido a la nueva línea, la Clase B está bien, loA.i
que permite referirse al2
valor del Programa A en su lugar. El indicador del compilador hace que el programa ejecute B.Main () ya que A.Main () también existe. El resultado es que el Programa A + B no genera su argumento, sino que pasa al siguiente segmento de B.Main (), que es básicamente la quine estándar de C # .fuente
Haskell , 116 + 20 =
187175174136 bytesUn montón de bytes guardados desde que Ørjan Johansen me mostró
interact
Gato 1
Pruébalo en línea!
Gato 2
Pruébalo en línea!
Quine
Pruébalo en línea!
El principio básico en el trabajo aquí es que cuando añadimos el segundo gato a la primera cambiamos el nombre de la función estamos interactuando con los de
a
aidmain
. Comointeract id
es un gato, queremosidmain
una función que devuelva una quine. La solución obvia sería usarconst
, sin embargo, ya que podemos suponer que la entrada está vacía también(++)
funciona. Desde aquí encontramos el código fuente a través de medios bastante estándar, tenemos una variableg
que codifica la fuente y utilizamos un contenedor especial para imprimirlo en forma de cadena y en forma de código. Hay una ligera excepción de que necesitamos poner nuestro codificador en la parte delantera porque ya tenemos que terminar coninteract id
. Esto significa un extrag=
no está codificado y debe manejarse manualmente. Nuestro próximo gato es bastante estándar, excepto que necesitamos que sea un código válido cuando se pega al final del otro gato, por lo que necesitamos que ambos gatos sean instancias de guardias de patrones.Estrategia alternativa, 43 + 105 =
186148Gato 1
Pruébalo en línea!
Gato 2
Pruébalo en línea!
Quine
Pruébalo en línea!
fuente
getContents
+putStr
coninteract id
. Pruébalo en línea! (El quine ya no funciona con entradas no vacías, lo que permite usar una(++ ...)
sección paraidmain
.)interact
, supongo que es porque rara vez hago cosas de E / S con Haskell. He editado la publicación.Python 3, 286 bytes
¡Mi primer Python golf y mi primer quine! No muy elegante, pero funciona.
Programa A (238 bytes)
(sin línea nueva)
Programa B (48 bytes)
(sin línea nueva)
Pruébalo en línea
Expresiones de gratitud
fuente
end=open...
y usar en%r
lugar de%s
no tener que hacer la nueva línea y las citas%r
. Sin embargo, no estoy seguro de lo que quieres decir con la nueva línea.%s
formatear una nueva línea, simplemente puede hacer el literal\n
. También puede usar;
para dividir sentencias en lugar de\n
(excepto queif
debe estar en su propia línea).%
se puede escapar en la cadena haciendo%%
. El único argumento necesario para formatear la cadena es la cadena en sí, todo lo demás se puede dividirlocals()
para guardar 2 bytes.C ++ (clang) , 313 + 102 = 415 bytes
Programa A (termina en una nueva línea):
Programa B (no termina en nueva línea):
No es terriblemente astuto, y como de costumbre, C ++ no es tan bueno para quining. No me sorprendería si hay formas de eliminar bytes aquí y allá de la misma idea. El único inconveniente es cambiar el comportamiento de algo después de que se haya definido, y un inicializador de variable dinámico con efecto secundario hace el truco. (¿Se puede hacer esto incluso en C sin extensiones del compilador?)
Pruébelo en línea: A , B , AB
(La única preocupación de portabilidad que conozco es que el programa supone
<cstdio>
poner nombres tanto en el espacio de nombres global como enstd
).fuente
Befunge-98 (FBBI) , 8 + 15 = 23 bytes
A + B: (solo funciona sin entrada)
Pruébalo en línea!
UNA:
Pruébalo en línea!
SI:
Pruébalo en línea!
fuente
Python 3 , 100 + 37 = 137 bytes
Programa A
Pruébalo en línea!
Programa B:
Pruébalo en línea!
Hacer Quine AB
Pruébalo en línea!
Solo funciona cuando la entrada está vacía; de lo contrario, antepone la entrada a la salida.
fuente
Agregado , 15 + 126 = 141 bytes
UNA:
Pruébalo en línea!
SI:
Pruébalo en línea!
A + B:
Pruébalo en línea!
Explicación
Cada uno de los programas cat codifica
AllInput[]|Echo
, que es un programa cat simple. B es la fase quine principal; solo, es una función vectorizada (a través de unario@
) llamada sin entradas (llamada como|Call
). Por lo tanto, el primer condicional seIf[_,A,B]
ejecutaB
, que es simplementeAllInput[]|Echo
.Cuando se ejecuta A + B , el unario se
@
convierte en binario@
debido a laEcho
fusión con la lambda:Ahora, esto significa que la lambda se ejecuta antes que
Echo
es. Volviendo al condicional, esta función ahora tiene todo STDIN como argumento. Entonces, seIf[_,A,B]
ejecutaA
, que es el marco de trabajo estándar.fuente
Stax , 16 + 12 = 28 bytes
Gato 1:
Ejecutar y depurarlo
Gato 2:
Ejecutar y depurarlo
Quine
Ejecutar y depurarlo
fuente
Gato 1:
Lua , 41 bytes
Pruébalo en línea!
Gato 2:
Lua , 70 bytes
Pruébalo en línea!
Quine
Lua , 111 bytes
Pruébalo en línea!
io.input(arg[0])
en Cat 2 establece el archivo actual como entrada estándar, y como resultado, el gato imprime el código fuentefuente
> <> , 12 +3 = 15 bytes
Programa A
Pruébalo en línea!
Y el programa B:
Pruébalo en línea!
Hacer programa AB:
Pruébalo en línea!
fuente
JavaScript (Node.js) , 199 bytes
Pruébalo en línea!
Cat A, 57 bytes
Pruébalo en línea!
Cat B, 142 bytes
Pruébalo en línea!
fuente