Supongamos que tiene 2 idiomas, A
y B
. Una cadena s
es una semiquina A
y B
si cumple las siguientes condiciones:
s
Es una quine en el lenguajeA
.s
es un políglota enA
yB
.- El resultado de ejecutarse
s
como unB
programa es una cadena diferentes'
, que es una quineB
.
El objetivo de este desafío es escribir una semiquina en dos idiomas distintos. Este es el código de golf , por lo que el código más corto gana, con la respuesta más antigua utilizada como un desempate.
Reglas para Quines
Solo se aceptan quines verdaderos . Es decir, debe imprimir el código fuente completo textualmente a STDOUT, sin :
- leyendo su código fuente, directa o indirectamente.
- confiando en un entorno REPL que simplemente evalúa e imprime cada expresión que le da de comer.
- confiando en las características del lenguaje que solo imprimen la fuente en ciertos casos.
- utilizando mensajes de error o STDERR para escribir todo o parte de la línea. (Puede escribir cosas a STDERR o generar advertencias / errores no fatales siempre que STDOUT sea una quine válida y los mensajes de error no formen parte de ella).
Además, su código fuente no debe consistir únicamente en literales (ya sean literales de cadena, literales numéricos, etc.) y / o NOP. Por ejemplo, `12
es un políglota en Jelly y Pyth, pero en Jelly es un NOP y un literal numérico, por lo que no es válido.
Cualquier salida no suprimible (como avisos de derechos de autor, mensajes de inicio / apagado o un avance de línea final) puede ignorarse en la salida en aras de la validez de la quine.
Reglas para políglotas
Los dos idiomas utilizados deben ser claramente diferentes. En particular:
- No deben ser versiones diferentes del mismo lenguaje (por ejemplo, Python 2 frente a Python 3).
- No deben ser dialectos diferentes del mismo idioma (p. Ej. Pascal vs. Delphi).
- Un idioma puede no ser un subconjunto del otro (por ejemplo, C vs. C ++ 1 ).
- Un idioma puede no ser un derivado trivial del otro (por ejemplo, Matlab vs Octave 2 , brainfuck vs boolfuck vs TinyBF vs ShadyAsFuck vs todos los otros derivados triviales de brainfuck).
Reglas misceláneas
- No puede aceptar entradas de STDIN (o cualquier otra fuente). Si el idioma elegido debe tomar entrada, entonces la entrada debe estar vacía (cadena vacía, canalizada desde
/dev/null
, etc.), o la salida del programa no debe depender de la entrada. - Para este desafío, debe escribir un programa completo. No está permitido solicitar código adicional para ejecutar la solución (como asignar y llamar a una función lambda definida en la solución).
1: Sí, sé que C no es realmente un subconjunto de C ++. Sin embargo, está lo suficientemente cerca como para ser considerado uno a los efectos de los políglotas, así que lo estoy contando para este desafío.
2: Al igual que el punto 1 anterior, aunque Octave técnicamente no es 100% compatible con Matlab, fue diseñado para ser compatible y es lo suficientemente cercano como para permitir que un políglota Matlab / Octave trivialice el desafío.
Respuestas:
GolfScript + Fisión ,
1918 bytesEl avance de línea final es necesario.
Esta es una verdadera quine en GolfScript. Pruébalo en línea!
En fisión imprime
lo cual es una verdadera quine en Fission . Pruébalo en línea!
Explicación
En GolfScript, cualquier cosa de la forma
es una quine siempre que
...
deje una cadena con".~"
en la pila. El.
duplica el bloque, de manera que hay una copia que se imprime al final, y las~
ejecuta, así que podemos usar su contenido para imprimir la.~
misma. En este caso, el bloque empuja la cuerday luego lo trunca a los dos primeros caracteres con
2<
.El programa Fission realmente funciona exactamente igual que el quine , ya que el programa ignora por completo la primera y la tercera línea.
fuente
Ruby + (JavaScript o Python 3), 76 bytes
Este es otro desafío que se puede resolver utilizando mi nuevo lenguaje favorito, el subconjunto casi común de Ruby, JavaScript y Python 3; y dado que todavía no tenemos respuestas en idiomas exotéricos, y a muchas personas les gusta ver soluciones que no sean de golf, pensé que contribuiría con una. Aún mejor, la misma respuesta resuelve el desafío de varias maneras al mismo tiempo.
Aquí está
s
:Esta es una quine en Ruby. No es una quine en JavaScript o Python 3; Si lo ejecuta en cualquiera de esos idiomas, su salida
s'
tiene una nueva línea final y, por lo tanto, es diferente:¡Sin embargo,
s'
es una quine políglota en JavaScript y Python 3! (Como de costumbre para mí, estoy usando la implementación Rhino de JavaScript, tanto por conveniencia (ya que se ejecuta desde la línea de comandos en lugar de necesitar un navegador) como porque tiene una biblioteca estándar extraña en la queprint
escribe en la salida estándar). Ambos lenguajes se producens'
como resultado de ejecutar cualquiera de los programas.Como beneficio adicional, este programa también resuelve el problema a la inversa. Si decide ejecutar
s'
en Ruby, volverá a imprimir el programa originals
. Como tal,s'
es una respuesta válida (pero un poco más larga, a 77 bytes) a la pregunta.En este punto, casi estoy empezando a pensar que "las diferencias en si la salida termina o no con una nueva línea que sea suficiente para contar dos programas como diferentes" debería considerarse una laguna estándar, dado que este parece ser un segundo conjunto de idiomas (más allá del conocido GolfScript / CJam) en el que es posible realizar el truco.
fuente
Vitsy (modo seguro) e Y, 9 bytes, sin competencia.
En Vitsy, esto es una quine. En Y, esto imprime
Ugrd3*Z'
;Ugrd3*Z'
Sin embargo, cuando se ejecuta, se imprime , que es una quine en Y. Y es posterior a la pregunta.Lo que ve Vitsy:
Lo que ve Y:
fuente
CJam + GolfScript, 9 bytes
Esta es una quine en CJam. En GolfScript, se genera con una nueva línea final, que es una quine en GolfScript.
No estoy seguro de si CJam debe considerarse una derivada trivial de GolfScript. Pero creo que son bastante diferentes y al menos no triviales.
fuente