Une polyquine est à la fois quine et polyglotte. 1 Vous devez écrire un quine qui est valide dans au moins deux langues différentes. C'est le code de golf, donc la réponse la plus courte (en octets) gagne.
1 J'ai inventé ça. Ou plutôt, Geobits l'a fait . Apparemment, il n'était pas le premier non plus .
Règles pour les quines
Seuls les vrais quines sont acceptés. Autrement dit, vous devez imprimer le code source entier intégralement sur STDOUT, sans :
- lire votre code source, directement ou indirectement.
- en s’appuyant sur un environnement REPL qui évalue et imprime simplement chaque expression que vous lui donnez.
- en s'appuyant sur des fonctionnalités linguistiques qui ne font qu'imprimer la source dans certains cas.
- en utilisant des messages d'erreur ou STDERR pour écrire tout ou partie de la quine. (Vous pouvez écrire des choses dans STDERR ou produire des avertissements / des erreurs non fatales tant que STDOUT est une requête valide et que les messages d'erreur n'en font pas partie.)
De plus, votre code doit contenir un littéral de chaîne.
Règles pour les polyglottes
Les deux langues utilisées doivent être nettement différentes. En particulier:
- Il ne doit pas s'agir de versions différentes du même langage (par exemple, Python 2 ou Python 3).
- Ils ne doivent pas être différents dialectes de la même langue (par exemple, Pascal vs Delphi).
- Un langage peut ne pas être un sous-ensemble de l’autre (par exemple, C vs. C ++).
Réponses:
CJam / GolfScript, 34 octets
Le nombre d'octets contient un saut de ligne de fin, car le programme ne serait pas un quine sans lui.
Bien que CJam et GolfScript soient très similaires à certains égards, il existe de nombreuses différences. Pour en faire une polyquine "honnête", j'ai décidé de m'appuyer autant que possible sur les différences . À l'exception de la syntaxe de bloc et de chaîne (que les langages partagent avec tant d'autres), aucune partie du code n'obtient exactement la même chose dans les deux langages.
L’interprète GolfScript en ligne a un bogue; ce programme fonctionne uniquement avec l'interprète officiel.
Exemple d'exécution
Comment ça marche (CJam)
Comment ça marche (GolfScript)
CJam / GolfScript, 12 octets
Solution astucieuse qui évite autant que possible les différences entre les langues.
Essayez-le en ligne:
Comment ça marche (CJam)
Comment ça marche (GolfScript)
la source
C # / Java, 746 octets
J'utilise la propriété que les caractères en Java peuvent être écrits en tant que séquences Unicode identiques. Si nous avons
A
instructions pour le compilateur C # et desB
instructions pour Java, nous pouvons utiliser le fragment de code suivant:Il sera "reconnu" de la manière suivante avec C #:
Et de la manière suivante en Java:
En raison de la
\u000A
rupture de ligne,\u002F
est/
et\u002A
est*
en Java.Ainsi, la dernière quille polyglotte est:
Cependant, la taille est trop énorme à cause de la verbosité des langues.
Compilation disponible sur ideone.com: C # , Java .
la source
Python 3 et JavaScript, 134 octets
Voici ma (dernière?) Tentative:
On peut probablement jouer un peu plus au golf, surtout si quelqu'un connaît un meilleur moyen d'obtenir des guillemets simples en JavaScript.
En résumé, le programme ressemble à ceci:
La
eval()
fonction évaluera les expressions dans les deux langues. Donc, la longue chaîne est exécutée:Cela divise la chaîne longue en espaces et évalue la sous-chaîne indexée par
2%-4
. JavaScript exécutera la troisième sous-chaîne (2 % -4 == 2
) et Python l'avant-dernière (2 % -4 == -2
), car leurs opérateurs modulo se comportent différemment pour les négatifs.Le reste de la chaîne est ignoré dans les deux langues. JavaScript s’arrête au début
//
, alors que Python le voit comme une division entière et s’arrête au début#
.Donc, JavaScript imprime le code source sur la console ici:
Et Python ici:
Les deux utilisent la dernière partie de la chaîne, qui est un modèle du programme:
la source
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"])
. Testé en JavaScript mais pas en python ... mais ça devrait marcher.a.split(1)
.q=unescape("%27")
Ruby / Perl / PHP, 52
Copié textuellement de Perl quine de Christopher Durr .
C'est abus de règles. Ruby et Perl ne sont certainement pas la même langue et Perl n'est pas non plus un sous-ensemble de Ruby (la plupart des quines Perl liées ne fonctionnent pas dans Ruby, par exemple). Mais Ruby a été conçu pour pouvoir ressembler beaucoup à Perl si vous le souhaitez, et cela se produit souvent lorsque vous jouez au golf.
la source
-R
et vous n'avez pas besoin des balises de script. php.net/manual/fr/features.commandline.options.phpBash / GolfScript, 73
Il y a un espace de fin sur chacune des 3 premières lignes.
Bash / GolfScript, 78
la source
PHP / Perl - 171
Courir avec:
Le
php
code est en cours d'exécution (pas seulement en train de s'imprimer).la source
Bash / Ruby,
10482Ancienne version:
Bash / Ruby, 128 sans comportement indéfini
la source
<<a
en Ruby fonctionne exactement comme Bash, mais renvoie une chaîne. Je n'avais pas écrit de programme Ruby auparavant. Je viens de trouver une langue aléatoire avec cette fonctionnalité.<<word
retourne une chaîne fermée par une ligne avec un simpleword
.réticulaire / befunge-98, 28 octets [non compétitif]
Essayez réticulaire! Essayez befunge 98!
Tout ce qui est entre
;
s et befunge est ignoré et!
saute dans le segment entre;
s pour réticulaire. Ainsi, réticulaire voit:Befunge voit:
la source
Ruby / Mathematica, 225 octets
Voici ma propre polyquine très palpable (qui sert d'exemple et de preuve de concept):
La première partie est basée sur cette quine Ruby et est essentiellement:
L'affectation de chaîne est exactement la même dans Mathematica. Le
puts s%s
est interprété comme un produit de 4 symboles:,puts
la chaînes
,%
(le dernier résultat REPL ouOut[0]
s'il s'agit de la première expression évaluée) et un autres
. Bien entendu, cela n'a aucun sens, mais Mathematica s'en fiche et;
supprime aucune sortie. Elle est donc traitée en mode silencieux. Ensuite,#
le reste de la ligne devient un commentaire pour Ruby pendant que Mathematica continue.En ce qui concerne le code Mathematica, la plus grande partie consiste à simuler le traitement des chaînes de format de Ruby sans utiliser de littéraux de chaîne.
FromCharacterCode@{37,112}
est%p
etFromCharacterCode@{37,112}
est%%
. Le premier est remplacé par la chaîne elle-même (oùInputForm
les citations sont ajoutées), le second par un simple%
. Le résultat estPrint
ed. La dernière difficulté est de savoir comment gérer cela#
à l’avant. C'est le symbole de Mathematica pour le premier argument d'une fonction pure (anonyme). Donc ce que nous faisons est que nous faisons tout cela une pure fonction en annexant&
et immédiatement appeler la fonction avec l' argument1
. Le préfixe1
d'un appel de fonction "multiplie" le résultat avec1
, que Mathematica avale à nouveau, quel que soit le type d’objet renvoyé par la fonction.la source
> <> et CJam, 165 octets
Pour CJam, le programme commence par un littéral de chaîne multiligne. Ceci est échappé avec
`
, puis il utilise le quine standard pour imprimer le code quine, ainsi qu'un commentaire de fin.Pour> <>, le premier
"
commence un littéral de chaîne qui traverse toute la première ligne, poussant chaque caractère vers la pile. Après cela, les espaces de fin (créés en raison de l'entrée en cours de remplissage) sont supprimés, puis la pile est inversée. Chaque caractère de la pile (c’est-à-dire la première ligne entière) est sorti, puis il descend à la deuxième ligne.La deuxième ligne fait essentiellement la même chose, sauf que c'est dans la direction opposée, vous n'avez donc pas besoin d'inverser la pile. (Je fais quand même, parce que je dois supprimer les espaces de fin.)
Enfin, il passe à la troisième ligne. La seule différence majeure est que vous devez ignorer le bloc CJam, qui est effectué à l'aide de
.
la citation unique qui capture la ligne entière (encore une fois, à l'envers), puis la sortie.la source
C / PHP,
266304300282241203 + 10 octets+10 octets car la compilation en C nécessite l'indicateur de compilation GCC
-Dfunction=
.Comment ça marche (en PHP):
<?php
format HTML.//
n'est pas un commentaire en HTML, il est donc simplement imprimé.main
est déclaré comme une fonction avec une variablea
.printf
imprime un retour chariot (pour remplacer le texte déjà imprimé//
), puis le code source, en utilisant une méthode de quining C / PHP standard.#if 0
est ignoré par PHP.main($a)
initialise une variable videa
. (Auparavant utiliséerror_reporting(0)
pour ignorer les erreurs causées par un appelmain()
)#endif
est également ignoré par PHP.Comment ça marche (en C):
//<?php
est un commentaire d'une seule ligne, il est donc ignoré.function
mot clé est ignoré en raison de l'argument du compilateur de ligne de commande-Dfunction=
.$
. (Cela a sauvé la journée.)printf
affiche un retour chariot (inutile dans ce cas), puis le code source, en utilisant une méthode de quining C / PHP standard.#if 0
ignore tout jusqu'à ce queendif
PHP puisse appelermain
.#endif
termine le bloc "ignore me".la source
Wumpus / > <> / Befunge-98 28 octets
Essayez-le dans Wumpus! , Essayez - le dans> <>! , Essayez - le dans Befunge-98!
Comment ça marche:
Code Wumpus:
> <> Code:
Code Befunge-98:
la source
05AB1E / 2sable, 14 octets, non en concurrence
Essayez-le en ligne! (05AB1E)
Essayez-le en ligne! (2sable)
2sable est dérivé de 05AB1E et est similaire, mais présente des différences majeures.
Retour à la ligne.
la source
C / TCL, 337 octets
la source
C / Vim 4.0, 1636 octets
Contient des caractères de contrôle.
Votre Vim doit avoir le set suivant:
la source
C / Lisp, 555 octets
Intentionnellement vide, première ligne.
la source
Perl / Javascript (SpiderMonkey), 106 octets
Essayez le Perl en ligne!
Essayez le JavaScript en ligne!
Explication
Les données quine sont stockées dans les
$_
deux langues, puiseval
ed, ce qui est à peu près la procédure standard en Perl. J'ai choisi SpiderMonkey sur TIO car il a uneprint
fonction, mais cela pourrait facilement être porté au navigateur pendant + 20 octets (ajoutereval("print=alert");
au début de la$_
définition).Perl voit les données stockées dans
$_
eteval
est comme d’habitude. Since+[]
est une vérité en Perl,'
est stocké dans$q
via stringwise-XOR deh
etO
. La dernière astuce consiste à appelerprint
où la première partie de JavaScript utilise+
, qui, dans Perl, traite tous les éléments comme des nombres et leur ajoute0
, puis nous utilisons l'||
opérateur pour renvoyer ce que nous voulons réellement.(q($_),"=$q$_$q;",q(eval($_)))
ce qui est équivalent"\$_=$q$_$q;eval(\$_)"
.En JavaScript, les
+[]
retours0
, nous appelons doncunescape("%27")
pour stocker'
dans$q
(malheureusement,atob
n'existe pas dans SpirderMonkey ...). Dans l'appel àprint
, puisqu'il+
s'agit de l'opérateur de concaténation en JavaScript, le premier bloc construit la sortie souhaitée et la deuxième partie après||
est ignorée.Merci à Patrick Roberts pour le
unescape
tour!Perl / JavaScript (navigateur), 108 octets
Essayez le Perl en ligne!
Explication
Nous stockons les données quine
$_
dans les deux langues, puiseval
il s’agit là d’une procédure à peu près standard en Perl.Perl voit les données stockées dans
$_
eteval
est comme d’habitude. Leeval
inside$_
est exécuté et ne parvient pas à analyser, mais comme il ne leeval
fait pas, il ne commet pas d'erreur.printf
est ensuite appelé, avec une seule chaîne entre guillemetsq()
, avec`
comme délimiteur, car l’utilisation`
de commandes aurait pour résultat l’exécution de commandes dans un shell, puis pour la première utilisation de$q
, puisque+[]
vérité est en Perl, elle'
est stockée$q
via stringwise-XOR deh
etO
.En JavaScript, le
eval
bloc dans$_
établit une fonctionq
, quireturn
est son argument commeString
et aliasconsole.log
pourprintf
, étant donné que laconsole.log
chaîne de formats commeprintf
en Perl. Quandprintf
est appelé+[]
retourne0
, alors nous appelonsatob
pour décoder'
et stocker dans$q
.la source
Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1031 octets
Vérifiez-le en ligne!
Sur la base de mes mises à jour de cette réponse , je pensais que j'essaierais d’optimiser le code qui imprime une permutation différente, mais j’ai fini par l’ajouter à Bash, ce qui ajoute de toute façon une charge supplémentaire. Bien que cela soit plus optimisé que ma première tentative (enregistré plus de 300 octets), je suis sûr que cela peut encore être joué.
Alternative Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1040 octets
Vérifiez-le en ligne!
Un peu plus près de mon approche initiale, mais la répétition des arguments pour
printf
est toujours fou. En utilisant des arguments positionnels, cela ne fonctionne que dans Chrome et il est difficile de travailler en PHP également car l’$s
en%1$s
-dedans est interpolé, mais pourrait économiser beaucoup d’octets, en combinant peut-être deux approches ...la source
C / dc, 152 octets
Profitant des commentaires, oui!
la source
Perl 5 / Ruby / PHP / JavaScript (navigateur), 153 octets
Essayez le Perl en ligne!
Essayez le Ruby en ligne!
Essayez le PHP en ligne!
la source