En règle générale, les polyglottes sont construites de telle manière que chaque langue peut ignorer des parties du code présentes dans d'autres langues, en les enveloppant dans des chaînes de caractères, en utilisant la syntaxe des commentaires ou d'autres astuces similaires.
Votre objectif est d'écrire un polyglotte où la sortie pour chaque langue est le code du polyglotte qui produit cette sortie. Plus précisément, la sortie doit être construite à partir du code polyglotte avec seulement des suppressions, et elle doit être une quine dans le langage donné.
Règles
- Seules les quines appropriées sont autorisées (pas de lecture du code source, pas de prise d'entrée, la sortie doit être vers STDOUT ou l'alternative la plus proche si STDOUT n'est pas une option, et les programmes doivent être constitués de plus que des littéraux qui sont implicitement imprimés).
- Étant donné que différents langages peuvent utiliser différents codages, les octets bruts sont ce qui importe ici. Par exemple, si la langue A utilise UTF-8 et la langue B utilise CP437, le code (hex)
C3 88 46 47
seraitÈFG
pour la langue A etÈFG
pour la langue B. - Toutes les sorties doivent être distinctes (encore une fois, en comparant les octets bruts). Cela évite les complications liées à la limitation des versions linguistiques mineures - si deux langues utilisent la même partie du code pour faire la même chose, vous ne pouvez pas les revendiquer toutes les deux.
- Si vous avez deux langues A et B telles qu'une
XY
sortie valide dans les deux, maisYZ
également dans B, vous pouvez choisirXY
comme sortie pour A etYZ
comme sortie pour B, afin que vous puissiez les revendiquer toutes les deux dans votre score ( mais vous ne pouvez pas réclamerXY
pour les deux langues en raison de la règle ci-dessus).
- Si vous avez deux langues A et B telles qu'une
- Toutes les sorties doivent être aussi courtes que possible. Par exemple, si votre code l'était
print('foo')#something
, pour Python 3 (en ignorant le fait que la sortie n'est pas correcte), le code que vous auriez besoin de produire seraitprint('foo')
etprint('foo')#
ne serait pas autorisé. S'il existe plusieurs chaînes de longueur égale (minimale) qui produisent une sortie correcte, vous pouvez choisir l'une d'entre elles. - Les soumissions doivent être polyglottes dans au moins 2 langues.
- Votre score sera donné par
(number of programming languages with distinct outputs)**3/(total byte size of polyglot)
. Le score le plus élevé l'emporte. Dans le cas où deux soumissions obtiennent le même score, la soumission ayant atteint ce score en premier gagnera.
Réponses:
GolfScript + CJam + Fission 2 + Jelly , 4 langues, 24 octets, score 2,667
Commençons par le vidage hexadécimal:
Pour GolfScript, CJam et Fission 2, nous interprétons cela dans un codage à un octet compatible ASCII comme ISO 8859-1 (le codage exact n'a pas vraiment d'importance, car les langages ne définissent de toute façon que des opérateurs pour les caractères ASCII):
Où
<DEL>
est le caractère de contrôle0x7f
.Dans Jelly, cela est supposé être dans la propre page de code de Jelly, où cela ressemble à la place:
GolfScript
La
e
dernière ligne est une variable inconnue et#
commente le reste de la ligne, donc cela s'imprimeavec un saut de ligne arrière. Il s'agit de la version polyglotte GolfScript / CJam du quine standard:
Essayez le polyglotte. | Essayez la quine.
CJam
Ici,
e#
commente la dernière ligne, donc presque à l'identique, cela imprimesans saut de ligne arrière.
Essayez le polyglotte | Essayez la quine.
Fission
Fission ne voit que la deuxième ligne qui est le quine standard de Fission, donc elle imprime
Je ne peux pas fournir de lien en ligne pour le polyglotte ici, car TIO envoie le fichier à Fission en UTF-8, mais Fission lit l'octet source octet, ce qui rend la dernière ligne trop longue. Cependant, j'ai testé cela localement avec un fichier encodé ISO 8859-1 (dans lequel la dernière ligne a la même longueur que la seconde), pour confirmer que cela fonctionne.
Essayez la quine.
Gelée
Le pilcrow est un alias pour les sauts de ligne dans Jelly, donc la source est équivalente à:
Tous, sauf la dernière ligne d'un programme Jelly, sont des "liens auxiliaires" (c'est-à-dire des fonctions) qui peuvent être ignorés à moins qu'ils ne soient appelés, à condition qu'ils soient syntaxiquement valides. C'est en fait la raison pour laquelle la
3
première place dans les programmes CJam et GolfScript, car sinon le"
ne peut pas être analysé dans Jelly.Sinon, puisque la fonction n'est pas appelée, le programme n'est équivalent qu'à sa deuxième ligne, qui est le quine Jelly standard.
Essayez le polyglotte. | Essayez la quine.
la source
> <> + Python, 2 langues,
5146 octets, score ~ =0,160,17Puisqu'il n'y a pas encore de réponses, je vais commencer par une simple
Essayez-le pour > <> et Python
Pour> <> la première ligne est un quine (# reflète, "met la ligne entière sur la pile, puis nous poussons 34 (charcode pour") et imprimons tout), l'exécution ne s'en déplace jamais, donc elle ignore efficacement le reste de le code.
Pour Python, la première ligne est un commentaire, tandis que la seconde est un quine (approche standard en python, utilisant la substitution de chaîne avec la même chaîne que les deux arguments).
la source
.
! J'ai adapté mon quine en utilisant cette approche, bien que je préfère garder la chaîne à l'envers (car cela économise des octets) et éviter d'utiliserg
(car cela pourrait être interprété comme "lire le code source")JavaScript + Python 2 + Japt, 3 langues, 132 octets, score ~ = 0,205
Ceci imprime
en JavaScript (uniquement dans Firefox),
en Python 2, et
à Japt. ( Testez-le en ligne! )
Javascript
Voici ce que JavaScript voit:
La première ligne est un no-op car
A
n'est utilisée en aucune façon. La deuxième ligne définitS
la chaîneS=%s;console.log(S,uneval(S))
et la troisième l'imprime après avoir remplacé le%s
par leuneval
représentation ed deS
(justeS
entre guillemets). Le résultat est une quine en JavaScript.Python
C'est essentiellement ce que Python voit:
La première ligne est à peu près un no-op; la seule partie importante est
A=1
la fin. Cela se transformeA
en un nombre de sorte que la division entièreA//2
sur la deuxième ligne ne génère pas d'erreur.La deuxième ligne est essentiellement de la même manière, sauf qu'elle définit
S
la chaîneS=%r;print S%%S
. La troisième ligne s'imprimeS
après avoir remplacé le%r
par la représentation brute deS
(justeS
encapsulée entre guillemets simples). Le résultat est une quine en Python 2.Japt
Voici le code JavaScript que l'interprète Japt voit:
Comme vous pouvez le voir, c'est essentiellement la même chose que la réponse JavaScript, à une exception près: les deux dernières lignes sont combinées. En conséquence, voici ce que l'interprète voit réellement:
La première ligne définit
A
le quine Japt et la seconde définitS
une partie du quine JS. Dans Japt cependant, seule la dernière expression est envoyée à la sortie; c'estA
, donc la sortie est`i96d)p2`i96d)p2
.la source
uneval
? Ne fonctionne pas pour moiJolf +> <>, score = 2 ** 3/15 = 0,533 ....
Travailler sur l'ajout d'une autre langue à cela.
la source
> <>, Python 2 et 3, 3 langues, 107 octets, score = 27/107 ~ = 0,252
Essayez-le en ligne: Python 2 , Python 3 , > <>
La sortie Python 3 est exactement la deuxième ligne, et la sortie Python 2 est cette quine . La sortie> <> est la première ligne.
Explication
Ce programme est basé sur le quine Python 2 classique:
Tout d'abord, pour la rendre compatible avec Python 2 et Python 3, j'ai changé l'
print
instruction en appel de fonction et ajouté un espace supplémentaire qui sera utile plus tard:Ensuite, j'avais besoin d'un moyen de distinguer Python 2 de Python 3. L'un des moyens les plus simples consiste à tirer parti du fait qu'il
/
s'agit d'une division entière en Python 2, mais d'une division flottante en Python 3. Ainsi, le code suivant est évaluéTrue
en Python. 2, maisFalse
en Python 3:Afin de rendre les sorties distinctes entre les deux langues, j'ai dû supprimer sélectivement les première et dernière parenthèses dans l'
print
appel (c'est pourquoi j'avais besoin d'espace plus tôt - sans espace, ce ne serait pas uneprint
déclaration valide en Python 2) . Ainsi, j'avais besoin de modifier le faisceau de quine comme suit:Cette expression est
a:-a|9
évaluée à0:9
en Python 2 et1:-1
Python 3. Ainsi,b
est"(_%(_,b))"
en Python 3, mais en Python 2 premiers et derniers caractères sont éliminés, laissant_%(_,b)
. Et avec cette modification, le polyglotte était valable pour ce défi.Comme suggéré par le pélican sarcelle, la quine> <>
#o<}-1:"
pourrait être ajoutée assez facilement, grâce au fait que#
commence un commentaire sur une seule ligne en Python. Il suffit de l'ajouter et une nouvelle ligne ajoute une autre langue et augmente le score de près de dix.la source
Python 2 + Retina, 2 langues, 55 octets, score = 2 ^ 3/55 ≈ 0,145
J'ai utilisé
$n
au lieu de¶
les garder tous les deux ASCII valides.Python , rétine
Python:
Rétine:
la source
> <> + Pyke + Python 2, 81 octets, score = 3 ** 3/81 ~ 0,333
J'ai essayé de faire quelque chose de différent avec toutes les langues.
> <> voit:
Il s'agit d'une légère modification de la norme> <> quine pour utiliser une chaîne entre guillemets triples au début. Cela permet aux triples guillemets de fin pour Python d'être sur une ligne différente.
Essayez-le en ligne!
Pyke voit:
Je n'avais jamais créé de quine à Pyke auparavant et je devais donc y penser. J'ai utilisé des techniques de quining traditionnelles pour créer une chaîne, puis l'évaluer avec elle-même comme entrée. Notez que pour que cela fonctionne sans impact visuel, les avertissements devront être désactivés. Erreurs avec une division par 0 erreur dans l'étape de génération.
Essayez-le ici! Ou tout simplement la partie quine.
Python voit:
Tout ça. Python utilise tout le code pour produire son quine. J'ai décidé d'incorporer la partie quine dans la docstring (bien qu'en fin de compte cela économiserait des octets à supprimer mais je pense que c'est cool). Il s'agit d'une modification de la technique de quining standard.
Essayez-le en ligne!
la source