Una poliquina es quine y polyglot. 1 Debe escribir un quine que sea válido en al menos dos idiomas diferentes. Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
1 Lo inventé. O más bien, Geobits lo hizo . Aparentemente, tampoco fue el primero .
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.
- usando 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 debe contener un literal de cadena.
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 (por ejemplo, Pascal vs. Delphi).
- Un idioma puede no ser un subconjunto del otro (por ejemplo, C vs. C ++).
Respuestas:
CJam / GolfScript, 34 bytes
El recuento de bytes contiene un salto de línea final, ya que el programa no sería una quine sin él.
Si bien CJam y GolfScript son muy similares en algunos aspectos, hay muchas diferencias. Para hacer de esta una poliquina "honesta", decidí confiar en las diferencias lo más posible. Excepto por la sintaxis de bloques y cadenas (que los idiomas comparten con tantos otros), ninguna parte del código logra exactamente lo mismo en ambos idiomas.
El intérprete en línea de GolfScript tiene un error; Este programa solo funciona con el intérprete oficial.
Ejecución de ejemplo
Cómo funciona (CJam)
Cómo funciona (GolfScript)
CJam / GolfScript, 12 bytes
Solución atractiva que evita las diferencias de los idiomas tanto como sea posible.
Pruébalo en línea:
Cómo funciona (CJam)
Cómo funciona (GolfScript)
fuente
C # / Java, 746 bytes
Uso la propiedad de que los caracteres en Java se pueden escribir como secuencias idénticas de Unicode. Si tenemos
A
instrucciones para el compilador de C # eB
instrucciones para Java, podemos usar el siguiente fragmento de código:Será "reconocido" de la siguiente manera con C #:
Y de la siguiente manera por Java:
Debido a que
\u000A
es un salto de línea,\u002F
está/
y\u002A
está*
en Java.Entonces el políglota quino final es:
Sin embargo, el tamaño es demasiado grande debido a la verbosidad de los idiomas.
Compilación disponible en ideone.com: C # , Java .
fuente
Python 3 y JavaScript, 134 bytes
Aquí está mi intento (¿final?):
Probablemente se pueda jugar un poco más, especialmente si alguien conoce una mejor manera de obtener comillas simples en JavaScript.
En resumen, el programa se ve así:
La
eval()
función evaluará expresiones en ambos idiomas. Entonces la cadena larga se ejecuta:Esto divide la cadena larga por espacios y evalúa la subcadena indexada por
2%-4
. JavaScript ejecutará la tercera subcadena (2 % -4 == 2
) y Python la segunda (2 % -4 == -2
), porque sus operadores de módulo se comportan de manera diferente para los negativos.El resto de la cadena se ignora en ambos idiomas. JavaScript se detiene en el
//
, mientras que Python lo ve como una división entera y se detiene en el#
.Entonces JavaScript imprime el código fuente en la consola aquí:
Y Python aquí:
Ambos hacen uso de la parte final de la cadena, que es una plantilla del programa:
fuente
a='print(a[78:]%a)1q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(82))1a=%r;eval(a.split(1)[0|0=="0"])';eval(a.split(1)[0|0=="0"])
. Probado en JavaScript pero no en Python ... pero debería funcionar.a.split(1)
.q=unescape("%27")
Ruby / Perl / PHP, 52
Copiado textualmente de Christopher Durr Perl quine .
Esto es abuso de reglas. Ruby y Perl definitivamente no son el mismo idioma, ni Perl es un subconjunto de Ruby (la mayoría de las quines Perl vinculadas no funcionan en Ruby, por ejemplo). Pero Ruby fue diseñado para poder parecerse mucho a Perl si así lo desea, y esto sucede mucho cuando juega al golf.
fuente
-R
y no necesita las etiquetas de script. php.net/manual/en/features.commandline.options.phpBash / GolfScript, 73
Hay un espacio final en cada una de las primeras 3 líneas.
Bash / GolfScript, 78
fuente
PHP / Perl - 171
Corre con:
El
php
código se está ejecutando (no solo imprimiéndose).fuente
Bash / Ruby,
10482Versión antigua:
Bash / Ruby, 128 sin comportamiento indefinido
fuente
<<a
en Ruby funciona igual que Bash, pero devuelve una cadena. No escribí un programa Ruby antes. Acabo de encontrar un idioma aleatorio con esta función.<<word
devuelve una cadena cerrada por una línea con un soloword
.reticular / befunge-98, 28 bytes [sin competencia]
Prueba reticular! ¡Prueba befunge 98!
Cualquier cosa entre
;
s en befunge se ignora y!
salta al segmento entre;
s para reticular. Por lo tanto, reticular ve:Befunge ve:
fuente
Ruby / Mathematica, 225 bytes
Aquí está mi propia policina muy batible (que sirve como ejemplo y prueba de concepto):
La primera parte se basa en este quine de Ruby y es básicamente:
La asignación de cadena es exactamente la misma en Mathematica. El
puts s%s
se interpreta como un producto de 4 símbolos:,puts
la cadenas
,%
(el último resultado REPL oOut[0]
si es la primera expresión que evalúa) y otras
. Por supuesto, eso no tiene sentido, pero a Mathematica no le importa y;
suprime cualquier salida, por lo que esto se procesa en silencio. Luego#
hace que el resto de la línea sea un comentario para Ruby mientras Mathematica continúa.En cuanto al código de Mathematica, la mayor parte del mismo, es simular el procesamiento de cadenas de formato de Ruby sin usar ningún literal de cadena.
FromCharacterCode@{37,112}
es%p
yFromCharacterCode@{37,112}
es%%
. El primero se reemplaza con la cadena en sí, (donde seInputForm
agregan las comillas), el último con una sola%
. El resultado esPrint
ed. La captura final es cómo lidiar con eso#
en el frente. Este es el símbolo de Mathematica para el primer argumento de una función pura (anónima). Entonces, lo que hacemos es hacer de todo eso una función pura al agregar&
e invocar inmediatamente la función con argumento1
. Anteponiendo a1
llamada a una función "multiplica" el resultado con1
, que Mathematica nuevamente se traga independientemente de qué tipo de cosa devuelve la función.fuente
> <> y CJam, 165 bytes
Para CJam, el programa comienza con un literal de cadena de varias líneas. Esto se escapa con
`
, y luego utiliza la quine estándar para imprimir el código de quine, así como un comentario final.Para> <>, el primero
"
comienza un literal de cadena que recorre toda la primera fila, empujando cada carácter a la pila. Después de eso, los espacios finales (creados debido a la entrada que se está rellenando) se eliminan, y luego la pila se invierte. Todos los caracteres de la pila (es decir, la primera fila completa) se muestran y luego se mueven hacia la segunda fila.La segunda fila esencialmente hace lo mismo, excepto que está en la dirección opuesta, por lo que no necesita invertir la pila. (Lo hago de todos modos, porque tengo que eliminar los espacios finales).
Finalmente, pasa a la tercera línea. La única diferencia importante es que debe omitir el bloque CJam, lo que se hace usando
.
La comilla simple captura la línea completa (nuevamente, hacia atrás) y luego se genera.fuente
C / PHP,
266304300282241203 + 10 bytes+10 bytes porque compilar en C requiere el indicador del compilador GCC
-Dfunction=
.Cómo funciona (en PHP):
<?php
HTML.//
no es un comentario en HTML, por lo que simplemente se imprime.main
se declara como una función con una variablea
.printf
imprime un retorno de carro (para anular el ya impreso//
) y luego el código fuente, utilizando un método estándar de quining C / PHP.#if 0
es ignorado por PHP.main($a)
Inicializa una variable vacíaa
. (Anteriormente utilizadoerror_reporting(0)
para ignorar errores causados por llamadasmain()
)#endif
también es ignorado por PHP.Cómo funciona (en C):
//<?php
es un comentario de una sola línea, por lo que se ignora.function
palabra clave se ignora debido al argumento del compilador de línea de comandos-Dfunction=
.$
. (Esto salvó el día).printf
imprime un retorno de carro (inútil en este caso) y luego el código fuente, utilizando un método estándar de quining C / PHP.#if 0
ignora todo hasta elendif
, por lo que PHP puede llamarmain
.#endif
finaliza el bloque "ignorarme".fuente
Wumpus / > <> / Befunge-98 28 bytes
¡Pruébalo en Wumpus! ¡ Pruébalo en> <>! ¡ Pruébalo en Befunge-98!
Cómo funciona:
Código Wumpus:
> <> Código:
Código Befunge-98:
fuente
05AB1E / 2sable, 14 bytes, no competidor
Pruébalo en línea! (05AB1E) ¡
Pruébelo en línea! (2sable)
2sable se deriva de 05AB1E y es similar, pero tiene grandes diferencias.
Nueva línea final.
fuente
C / TCL, 337 bytes
fuente
C / Vim 4.0, 1636 bytes
Contiene caracteres de control.
Su Vim necesita tener el siguiente conjunto:
fuente
C / Lisp, 555 bytes
Primera línea intencionalmente en blanco.
fuente
Perl / Javascript (SpiderMonkey), 106 bytes
Prueba el Perl en línea!
¡Prueba el JavaScript en línea!
Explicación
Los datos de quine se almacenan en
$_
ambos idiomas y luego seeval
editan, que es un procedimiento bastante estándar en Perl. Elegí SpiderMonkey en TIO ya que tiene unaprint
función, pero esto podría ser fácilmente transferido al navegador por + 20 bytes (agregareval("print=alert");
al comienzo de$_
la definición s).Perl ve los datos almacenados
$_
yeval
los guarda como de costumbre. Como+[]
es verdad en Perl,'
se almacena a$q
través de stringwise-XOR deh
yO
. El truco final está en la llamada aprint
donde usa la primera parte de JavaScript+
, que en Perl trata todos los elementos como números y suma0
, luego usamos el||
operador para devolver lo que realmente queremos, lo(q($_),"=$q$_$q;",q(eval($_)))
que es equivalente"\$_=$q$_$q;eval(\$_)"
.En JavaScript,
+[]
devuelve0
, así que llamamosunescape("%27")
a la tienda'
en$q
(por desgracia,atob
existen doesm't en SpirderMonkey ...). En la llamada aprint
, dado que+
es el operador de concatenación en JavaScript, el primer bloque genera la salida deseada y la segunda parte después de que||
se ignora.¡Gracias al comentario de Patrick Roberts por el
unescape
truco!Perl / JavaScript (navegador), 108 bytes
Prueba el Perl en línea!
Explicación
Almacenamos los datos de quine en
$_
en ambos idiomas y luegoeval
, que es un procedimiento bastante estándar en Perl.Perl ve los datos almacenados
$_
yeval
los guarda como de costumbre. Eleval
inside$_
se ejecuta y no se analiza, pero como es asíeval
, no se produce un error.printf
luego se llama, con una sola cadena entre comillasq()
, con`
el delimitador, ya que el solo uso`
daría como resultado que los comandos se ejecuten en shell, luego, para el primer uso de$q
, ya que+[]
es cierto en Perl,'
se almacena en$q
través de stringwise-XOR deh
yO
.En JavaScript, el
eval
bloque dentro$_
establece una funciónq
, quereturn
es su argumento como unaString
y aliasconsole.log
aprintf
, ya queconsole.log
los formatos de cadena comoprintf
en Perl. Cuandoprintf
se llama+[]
retorna0
, entonces llamamosatob
para decodificar'
y almacenar$q
.fuente
Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1031 bytes
¡Verifíquelo en línea!
Basado en mis actualizaciones a esta respuesta , pensé que intentaría optimizar el código que imprime una permutación diferente, pero terminé agregando Bash, que de todos modos agregó una carga de más bytes. Si bien esto está más optimizado que mi primer intento (guardado más de 300 bytes), estoy seguro de que aún se puede jugar más.
Alternativa Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1040 bytes
¡Verifíquelo en línea!
Un poco más cerca de mi enfoque original, pero la repetición de los argumentos
printf
sigue siendo una locura. El uso de argumentos posicionales en su lugar hace que esto solo funcione en Chrome y también es difícil comenzar a trabajar en PHP porque el$s
in%1$s
está interpolado, pero podría ahorrar muchos bytes, tal vez usando una combinación de los dos enfoques ...fuente
C / dc, 152 bytes
Aprovechando los comentarios, ¡sí!
fuente
Perl 5 / Ruby / PHP / JavaScript (navegador), 153 bytes
Prueba el Perl en línea!
Prueba el Ruby en línea!
Prueba el PHP en línea!
fuente