Escribir una semiquina

10

Supongamos que tiene 2 idiomas, Ay B. Una cadena ses una semiquina Ay Bsi cumple las siguientes condiciones:

  1. sEs una quine en el lenguaje A.
  2. ses un políglota en Ay B.
  3. El resultado de ejecutarse scomo un Bprograma es una cadena diferente s', que es una quine B.

El objetivo de este desafío es escribir una semiquina en dos idiomas distintos. Este es el , 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, `12es 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.

Mego
fuente
¿Se permiten los bloques de copia de ESMin?
lirtosiast
@ThomasKwa No estoy familiarizado con ESMin, ¿podría darme un resumen rápido?
Mego
Hay un comando para iniciar un bloque de copia, que obtiene el código fuente de todo lo que pasa. Creo que otros idiomas de golf JS también podrían tener uno.
lirtosiast
@ThomasKwa Eso no se permitiría bajo la primera regla en las reglas de quine (sin leer el código fuente, directa o indirectamente).
Mego
1
@Downgoat Siempre y cuando no rompa ninguna otra regla, absolutamente. Abusar de las peculiaridades es el objetivo de este sitio :)
Mego

Respuestas:

6

GolfScript + Fisión , 19 18 bytes

{".~
'!+OR"
2<}.~

El avance de línea final es necesario.

Esta es una verdadera quine en GolfScript. Pruébalo en línea!

En fisión imprime

'!+OR"

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 cuerda

".~
'!+OR"

y 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.

Martin Ender
fuente
6

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:

s="'";d='"';n='print("s="+d+s+d+";d="+s+d+s+";n="+s+n+s+";eval(n)")';eval(n)

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:

s = "'"; d =' "'; n =' print (" s = "+ d + s + d +"; d = "+ s + d + s +"; n = "+ s + n + s +" ; eval (n) ") '; eval (n)

¡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 que printescribe en la salida estándar). Ambos lenguajes se producen s'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 original s. 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
2

Vitsy (modo seguro) e Y, 9 bytes, sin competencia.

' Ugrd3*Z

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:

 ' Ugrd3*Z
 '         Heyyyy a string! Let's do this!
  ........ Capturing a string! Oh, not done? Hm, let's go back to the start.
 '         There we go.
           (space) ...
   U       (no op)
    g      use count, disabled in safe mode
     r     reverse stack
      d3*  push a '
         Z print it all!

Lo que ve Y:

' Ugrd3*Z
'         Push a space.
  U       Wrap around and capture.
   g      Print that. (Nothing else is printed.)
Conor O'Brien
fuente
1
Tenga en cuenta que esto solo funciona en modo seguro o, más bien, tiene algunos ... efectos secundarios no deseados en modo no seguro.
Addison Crump
1

CJam + GolfScript, 9 bytes

"0$p"
0$p

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.

jimmy23013
fuente