Écrivez une «palipolyquine»: un programme qui est une quine , un polyglotte et un palindrome .
Règles:
- Le nombre de langues polyglottes est plus préférable que la taille du code.
- La réponse la plus courte (en octets) l'emporte en cas d'égalité.
- Les règles polyglottes et quines sont disponibles ici: Ecrire une polyquine .
Mon exemple (j'ai un dépôt Freaky-Sources avec des tests):
C # / Java (1747 octets):
/**///\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\///**/
code-challenge
quine
palindrome
polyglot
Ivan Kochurkin
la source
la source
1
quelle , alors une solution possible (triviale) est (qui sortira1
dans de nombreuses langues ici, et est palindromique).Réponses:
CJam / GolfScript , 2 langues, 50 octets
Essayez-le CJam! Essayez-le dans GolfScript!
Huh, cela est resté sans réponse étonnamment longtemps.
Explication
Il est probablement plus facile d'expliquer cela en montrant comment j'ai transformé le quine de base dans chaque langue en un quine polyglotte palindromique.
Les quines de base dans les deux langues sont donc:
Dans GolfScript et CJam, respectivement. Ceux-ci sont assez similaires grâce au fait que CJam a été à l'origine inspiré par GolfScript (mais a depuis beaucoup dévié). La première différence que nous remarquons est que l'une utilise
.
pour dupliquer le haut de la pile et l'autre utilise_
. Une astuce courante pour éviter ce problème est d'utiliser0$
, car les deux langues ont l'opérateur "copy-nth-item-on-stack"$
. Nous obtenons donc{"0$~"}0$~
, bien que cela ait encore besoin d'un saut de ligne arrière dans GolfScript. Mais inquiétons-nous à la fin.Tout d'abord, nous devons en faire un palindrome. La solution évidente à cela est d'ajouter un commentaire et d'y mettre le code source à l'envers. C'est assez simple, car CJam utilise
e#
pour les commentaires, et dans GolfScripte
ne fait rien du tout, et#
est un commentaire. Donc, si nous ajoutonse#...
cela fonctionne pour les deux langues. Voici ce que nous avons:Bien sûr, cela n'imprime pas réellement la pièce à
e#
partir de maintenant. Nous pouvons reconstruire cela assez facilement à partir du code source lui-même. Les deux langues peuvent transformer le bloc initial en une chaîne avec`
et ajouter la"0$~"
partie avec+
, de sorte que nous obtenons le code source entier non miroir dans une seule chaîne. Pour ajouter une copie en miroir, tout ce que nous devons faire est de dupliquer à0$
nouveau la chaîne avec puis l'inverser avec-1%
, qui fonctionne également dans les deux langues. Alors maintenant, nous avons ceci:Il s'agit d'un quine palindromique valide dans CJam, et il fonctionne également dans GolfScript mais imprime toujours ce saut de ligne embêtant.
La façon habituelle d'éviter cela est d'attribuer une chaîne vide à
n
, car ce que fait réellement GolfScript, c'est le contenu den
fin. Nous avons donc besoin de"":n
. Qu'en est-il de CJam? Heureusement, cela ne fait rien du tout.""
est également une chaîne vide (ou une liste vide, c'est la même chose dans CJam), et:
mappe l'opérateurn
(impression avec saut de ligne) sur la liste. Mais comme la liste est vide, le mappage d'un opérateur sur elle ne fait rien du tout. Par conséquent, nous pouvons nous débarrasser du saut de ligne, sans jouer avec CJam, et nous retrouver avec la solution finale:la source
Perl 5 / Ruby / PHP / JavaScript (navigateur), 4 langues, 513 octets
Essayez le Perl en ligne!
Essayez-le en ligne!
Essayez le PHP en ligne!
Validez-le en ligne!
la source