Escribe un Palindrome-Polyglot-Quine

25

Escriba una "palipolicina": un programa que es una quina , un políglota y un palíndromo .

Reglas:

  • El número de idiomas políglotas es más preferible que el tamaño del código.
  • La respuesta más corta (en bytes) gana, en caso de empate.
  • Reglas de políglotas y quinas ver aquí: Escribe una poliquina .

Mi ejemplo (tengo un repositorio Freaky-Sources con pruebas):

C # / Java (1747 bytes):

/**///\u000A\u002F\u002A
using System;//\u002A\u002F
class Program{public static void//\u000A\u002F\u002A
Main//\u002A\u002Fmain
(String[]z){String s="`**?`@#_^using System;?_#^class Program{public static void?@#_^Main?_#main^(String[]z){String s=!$!,t=s;int i;int[]a=new int[]{33,94,38,64,35,95,96,63,36};String[]b=new String[]{!&!!,!&n!,!&&!,!&@!,!&#!,!&_!,!`!,!?!,s};for(i=0;i<9;i++)t=t.?@#_^Replace?_#replace^(!!+(char)a[i],b[i]);t+='*';for(i=872;i>=0;i--)t=t+t?@#_^[i];Console.Write?_#.charAt(i);System.out.printf^(t);}}/",t=s;int i;int[]a=new int[]{33,94,38,64,35,95,96,63,36};String[]b=new String[]{"\"","\n","\\","\\u000A","\\u002F","\\u002A","/","//",s};for(i=0;i<9;i++)t=t.//\u000A\u002F\u002A
Replace//\u002A\u002Freplace
(""+(char)a[i],b[i]);t+='*';for(i=872;i>=0;i--)t=t+t//\u000A\u002F\u002A
[i];Console.Write//\u002A\u002F.charAt(i);System.out.printf
(t);}}/*/}};)t(
ftnirp.tuo.metsyS;)i(tArahc.F200u\A200u\//etirW.elosnoC;]i[
A200u\F200u\A000u\//t+t=t)--i;0=>i;278=i(rof;'*'=+t;)]i[b,]i[a)rahc(+""(
ecalperF200u\A200u\//ecalpeR
A200u\F200u\A000u\//.t=t)++i;9<i;0=i(rof;}s,"//","/","A200u\\","F200u\\","A000u\\","\\","n\",""\"{][gnirtS wen=b][gnirtS;}63,36,69,59,53,46,83,49,33{][tni wen=a][tni;i tni;s=t,"/}};)t(^ftnirp.tuo.metsyS;)i(tArahc.#_?etirW.elosnoC;]i[^_#@?t+t=t)--i;0=>i;278=i(rof;'*'=+t;)]i[b,]i[a)rahc(+!!(^ecalper#_?ecalpeR^_#@?.t=t)++i;9<i;0=i(rof;}s,!?!,!`!,!_&!,!#&!,!@&!,!&&!,!n&!,!!&!{][gnirtS wen=b][gnirtS;}63,36,69,59,53,46,83,49,33{][tni wen=a][tni;i tni;s=t,!$!=s gnirtS{)z][gnirtS(^niam#_?niaM^_#@?diov citats cilbup{margorP ssalc^#_?;metsyS gnisu^_#@`?**`"=s gnirtS{)z][gnirtS(
niamF200u\A200u\//niaM
A200u\F200u\A000u\//diov citats cilbup{margorP ssalc
F200u\A200u\//;metsyS gnisu
A200u\F200u\A000u\///**/

Compilación disponible en ideone.com: C # , Java .

Ivan Kochurkin
fuente
2
¿Hay alguna regla involucrada en la fabricación de la poli-quina? ¿Alguna limitación? Si esta pregunta es como es, entonces una posible solución (trivial) es 1(que se mostrará 1en muchos idiomas aquí, y es palindrómica).
clismique
Agregué reglas más formales.
Ivan Kochurkin
2
Ah, guay. Bueno, ¡buena suerte en tu primer desafío! Sin embargo, solo algunas cosas más: realmente no necesita el bloque de código allí, y probablemente debería migrar las reglas del otro desafío hacia aquí.
clismique
1
¿Una respuesta de 5 idiomas y 999 bytes supera a una respuesta de 4 idiomas y 100 bytes?
ETHproductions
@ETHproductions, creo que sí. Es más difícil agregar un nuevo lenguaje que reducir el número de líneas.
Ivan Kochurkin

Respuestas:

14

CJam / GolfScript , 2 idiomas, 50 bytes

{`"0$~e#"+0$-1%"":n}0$~e##e~$0}n:""%1-$0+"#e~$0"`{

Pruébalo CJam! Pruébalo en GolfScript!

Huh, esto quedó sin respuesta sorprendentemente largo.

Explicación

Probablemente sea más fácil explicar esto mostrando cómo convertí la quina básica en cada idioma en una quina políglota palindrómica.

Entonces, los quines básicos en ambos idiomas son:

{".~"}.~

{"_~"}_~

En GolfScript y CJam, respectivamente. Estos son bastante similares gracias al hecho de que CJam se inspiró originalmente en GolfScript (pero desde entonces se ha desviado bastante). La primera diferencia que notamos es que uno usa .para duplicar la parte superior de la pila y los otros usos _. Un truco común para evitar este problema es utilizarlo 0$, ya que ambos idiomas tienen el operador "copiar-enésimo elemento en la pila" $. Entonces obtenemos {"0$~"}0$~, aunque eso todavía necesita un salto de línea final en GolfScript. Pero preocupémonos por eso al final.

Primero, debemos convertirlo en un palíndromo. La solución obvia a esto es agregar un comentario y poner el código fuente allí al revés. Esto es bastante simple, porque CJam usa e#para comentarios, y en GolfScript eno hace nada, y #es un comentario. Entonces, si agregamos, e#...eso funciona para ambos idiomas. Esto es lo que tenemos:

{"0$~"}0$~e##e~$0}"~$0"{

Por supuesto, eso en realidad no imprime la parte en e#adelante. Podemos reconstruir esto fácilmente desde el código fuente mismo. Ambos idiomas pueden convertir el bloque inicial en una cadena con `y agregar la "0$~"parte con +, de modo que obtengamos el código fuente completo sin reflejos en una sola cadena. Para agregar una copia reflejada, todo lo que tenemos que hacer es duplicar la cadena 0$nuevamente y luego invertirla -1%, lo que también funciona en ambos idiomas. Entonces ahora tenemos esto:

{`"0$~e#"+0$-1%}0$~e##e~$0}%1-$0+"#e~$0"`{

Esta es una quine palindrómica válida en CJam, y también funciona en GolfScript, pero aún imprime ese molesto avance de línea.

La forma habitual de evitar esto es asignar una cadena vacía a n, porque lo que realmente hace GolfScript es imprimir el contenido nal final. Entonces, lo que necesitamos es "":n. ¿Y qué hay de CJam? Afortunadamente, esto no hace nada en absoluto. ""también es una cadena vacía (o lista vacía, son lo mismo en CJam), y :asigna el operador n(imprimir con salto de línea) sobre la lista. Pero como la lista está vacía, mapear un operador sobre ella no hace nada en absoluto. Por lo tanto, podemos deshacernos del salto de línea, sin jugar con CJam, y terminar con la solución final:

{`"0$~e#"+0$-1%"":n}0$~e##e~$0}n:""%1-$0+"#e~$0"`{
Martin Ender
fuente
5

Perl 5 / Ruby / PHP / JavaScript (navegador), 4 idiomas, 513 bytes

$_='$z=0?"$&".next: eval("printf=console.log;atob`JCc`");printf("%s_=%s%s%s;eval(%s_);//#//;)_%s(lave;%s%s%s=_%s",$d=$z[0]||h^L,$q=$z[1]||h^O,$_,$q,$d,$d,$q,"0"?$_.split("").reverse().join(""):~~reverse,$q,$d)';eval($_);//#//;)_$(lave;')d$,q$,esrever~~:)""(nioj.)(esrever.)""(tilps._$?"0",q$,d$,d$,q$,_$,O^h||]1[z$=q$,L^h||]0[z$=d$,"s%_=s%s%s%;eval(s%_);//#//;)_s%(lave;s%s%s%=_s%"(ftnirp;)"`cCJ`bota;gol.elosnoc=ftnirp"(lave :txen."&$"?0=z$'=_$

Prueba el Perl en línea!
Pruébalo en línea!
Prueba el PHP en línea!
Validarlo en línea!

$_='$z=0?"$&".next: eval("printf=console.log;atob`JCc`");printf("%s_=%s%s%s;eval(%s_);//#//;)_%s(lave;%s%s%s=_%s",$d=$z[0]||h^L,$q=$z[1]||h^O,$_,$q,$d,$d,$q,"0"?$_.split("").reverse().join(""):~~reverse,$q,$d)';eval($_);//#//;)_$(lave;')d$,q$,esrever~~:)""(nioj.)(esrever.)""(tilps._$?"0",q$,d$,d$,q$,_$,O^h||]1[z$=q$,L^h||]0[z$=d$,"s%_=s%s%s%;eval(s%_);//#//;)_s%(lave;s%s%s%=_s%"(ftnirp;)"`cCJ`bota;gol.elosnoc=ftnirp"(lave :txen."&$"?0=z$'=_$

Dom Hastings
fuente