Produisez un programme A de telle sorte que son exécution dans la langue A produise le programme B et que l'exécution du programme A dans la langue B produise le programme C.
Le programme B, lorsqu'il est exécuté dans la langue B, produit le programme A, et l'exécution du programme B dans la langue A produit le programme C.
Le programme C, lorsqu'il est exécuté dans la langue A ou la langue B , imprime "Mauvaise langue!".
Program | Language | Result
--------|----------|----------
A | A | Program B
B | B | Program A
A | B | Program C
B | A | Program C
C | A | "Wrong language!"
C | B | "Wrong language!"
Votre réponse doit utiliser ce modèle:
Langue A / Langue B, {a octets} + {b octets} = {total octets} octets
Programme A:
a code
Programme B:
b code
Programme C:
c code
La source:
# Language A/Language B, <a bytes> + <b bytes> = <total bytes> bytes
Program A:
a code
Program B:
b code
Program C:
c code
- Aucun de ces programmes ne devrait recevoir de contribution.
- Différentes versions de la même langue comptent comme des langues différentes. (bien que cela soit découragé car cela conduit à des solutions ennuyeuses)
- Les langues A et B doivent être distinctes.
- Vous ne devez pas lire votre propre code source à partir d'un fichier. Les programmes peuvent ne pas être vides
- Des échappatoires standard s'appliquent.
Astuces
- C ++ et [Python / Bash / autres
#
langages commentés] sont de bons combos car vous pouvez définir des macros qu'une langue peut ignorer
Il s'agit de code-golf , donc la plus petite somme des octets compte pour les programmes A et B.
code-golf
quine
code-generation
polyglot
noɥʇʎԀʎzɐɹƆ
la source
la source
Wrong language!
être sorti sous n'importe quelle forme (c'est-à-dire toutes les majuscules, toutes les minuscules, etc.)?Réponses:
Befunge-98 (PyFunge) / > <> , 123 + 123 =
Programme A:266 250246 octetsEssayez-le dans Befunge-98! , Essayez - le dans> <>!
Programme B:Essayez-le dans> <>! , Essayez - le dans Befunge-98!
Programme C:Essayez-le dans Befunge-98! Essayez-le dans> <>!
Comment ça marche:
La deuxième ligne des deux programmes est identique et remplit la même fonction pour les deux langues. Une fois entré à gauche de la
<<<<
, il imprime toute la deuxième ligne. En entrant à droite de ceux-ci, imprimez le programme C.Lorsque la première ligne est exécutée dans la mauvaise langue, elle entre par la section de production du programme C. Sinon, il imprime la ligne supérieure à l'envers avec le
"
l'avant et entre dans la deuxième section de production de ligne.Première ligne
Programme A: Programme B:Deuxième ligne:
Programme C
la source
JavaScript (ES6) / Python 3, 264 + 258 = 522 octets
Programme A:
Programme B:
Programme C:
Probablement golfable ...
Explication JavaScript
Programme A:
Programme B:
Programme C:
Explication Python
Programme A:
Programme B:
Programme C:
la source
Python 3 + JavaScript (Rhino), 171 + 171 = 342 octets
Programme A (affiche le programme B en Python 3, le programme C en JavaScript; notez le retour à la ligne):
Programme B (affiche le programme A en JavaScript, le programme C en Python; notez le retour à la ligne):
Programme C (affiche "Wrong language!" Dans l'une ou l'autre langue; possède également une nouvelle ligne de fin, qui ne compte pas dans la partition):
Notez que j'utilise ici un dialecte inhabituel de JavaScript. Les gens utilisent normalement des implémentations de navigateur, mais celles-ci ont des problèmes avec la sortie, le faisant de manière étrange (en utilisant
alert
). J'utilise le package Ubunturhino
qui est une implémentation JavaScript "hors ligne" avec un ensemble différent de bibliothèques implémentées dans un navigateur typique (il est conçu comme un langage de script intégrable); ceci est remarquable en ce qu'il fournit uneprint
instruction dans le même style que, par exemple, Python 3.Il s'agit d'un «vrai polyglotte» dans le sens où les deux langues exécutent les mêmes calculs, dans le même ordre, leur donnant le même sens. Ils ont tous les deux le même AST (et il est assez trivial de créer une quine polyglotte Python 3 + JavaScript en réduisant ce programme). Il n'y a pas de code spécifique à une langue, ce qui m'aide à réduire la longueur. Soit dit en passant, vous devez utiliser Python 3 pour pouvoir utiliser des points-virgules pour séparer les instructions (si vous utilisez des sauts de ligne, vous devez échapper aux sauts de ligne).
Le programme commence par définir des chaînes
s
etd
qui contiennent respectivement un guillemet simple et un guillemet double. Cela permet de générer des citations sans avoir à les mentionner plus loin dans le code source, évitant ainsi les problèmes d'échappement (qui semblent souvent être un problème avec les quines; la principale raison pour laquelle je réponds à tant de problèmes de quine dans Underload est que ses chaînes s'emboîtent) .Le cœur du programme est le tableau
r
qui contient le corps principal des deux programmes utilisés par le défi; l'un des programmes (celui qui vient en premier dans le programme A et le deuxième dans le programme B) est une quasi-quine qui sort simplement le programme original en concaténant des morceaux ensemble (pris principalement der
lui-même, avec quelques littéraux de chaîne), et le d'autres programmes imprime C. Afin de faire du programme pas un vrai quine (ce qui rendrait impossible de détecter que nous fonctionnions dans la mauvaise langue), les éléments der
sont imprimés dans l'ordre inverse;r[0]
dans le programme A estr[1]
dans le programme B, et vice versa.Enfin, tout ce qui est nécessaire est de mettre à jour
eval
l'élément correct der
. Ceci est accompli en utilisant l'expression([11]+[0])[1]
qui produit une valeur différente en Python 3 et en JavaScript. Les deux langues l'analysent de manière identique, mais elles ont des idées différentes de ce que l'addition fait aux listes:Lorsque Python 3 s'ajoute
[11]
à[0]
, il obtient[11, 0]
(concaténant les listes), puis prendre le deuxième élément de list ([1]
) nous donne l'entier 0.Lorsque JavaScript s'ajoute
[11]
à[0]
, il obtient"110"
(concaténant les représentations de chaîne des listes), puis prendre le deuxième caractère de la chaîne ([1]
) nous donne la chaîne"1"
, que JavaScript est très heureux d'utiliser comme index dans une liste.Par conséquent, Python 3 exécute le premier élément de
r
dans les deux programmes (produisant la quasi-quine lors de l'exécution du programme A et l'impression du programme C lors de l'exécution du programme B); JavaScript exécute le deuxième élément et traite donc le programme A et le programme B dans le sens inverse.Par ailleurs, si vous exécutez le programme A dans Ruby, il imprimera le programme B, sauf sans retour à la ligne. Si vous exécutez le programme B dans Ruby, il imprimera le programme C, sauf sans retour à la ligne. En d'autres termes, cette solution fonctionne presque avec un ensemble de langues différent, échangeant Python 3 pour Ruby (la seule raison pour laquelle je ne supprime pas simplement la nouvelle ligne du programme B pour obtenir un score de 341 est que l'incohérence de la nouvelle ligne dans le programme C disqualifierait la soumission).
(Je travaillais sur un "vrai polyglotte" comme celui-ci pour une raison différente, que j'ai maintenant présentée comme un défi, et j'ai réalisé que les techniques pouvaient également être adaptées à celui-ci.)
la source
<pre><code>...</code></pre>
pour qu'ils apparaissent."a"[0]
,"a"["0"]
et"a"[[[[[[[["0"]]]]]]]]
tous accomplissent la même chose.C / Python, 733 octets + 733 octets = 1466 octets
Programme A:
Programme B:
Programme C:
J'ai utilisé votre conseil d'utilisation de C / C ++ avec Python. Pas très concis, mais toujours qualificatif je suppose.
la source
Python 2 / Retina, 550 + 645 =
1373125412211195 octetsJe ne sais pas trop si les parties
unichr
etreplace
peuvent être jouées davantage. J'ai essayé d'utiliser Python 3, mais beaucoup est perdu en devant ajouter des parenthèses et les gérer. J'ai essayé de réglerR=unicode.replace
et d'utiliser cela, mais la sortie est foirée.Notez que Retina a un retour à la ligne de fin dans sa sortie par défaut, et cela n'est pas inclus dans les programmes. Si quelqu'un dit que je dois le retirer, cela peut être fait trivialement. En outre, le code Python fonctionne dans repl.it, mais il n'est pas garanti qu'il fonctionne sur Ideone.com.
Notez également que les nouvelles lignes de début et de fin sont significatives dans le code ci-dessous.
Programme A (Python 2):
638587566550 octets (UTF-8)Python 2 , rétine
Programme B (rétine):
735667655645 octets (ISO 8859-1)Rétine , Python 2
Programme C:
Python 2 , rétine
Cela peut en fait être raccourci en utilisant
#!`W.*!
au lieu des deux dernières lignes, mais cela allonge A et B, car avoir`
une ligne où il n'y en avait pas signifie que je dois le gérer différemment (parce que le premier backtick d'une ligne dans Retina est un délimiteur de configuration).Explication:
Programme C:
J'ai écrit le programme C en premier lors de ma première tentative et je l'ai gardé pratiquement le même. En Python, il imprime la chaîne et ignore le commentaire. Dans la rétine, il ne remplace rien par
print"Wrong language!"
puis supprime les pièces autourWrong language!
.Pour mieux comprendre les programmes complexes, regardons les versions simplifiées:
Programme A (simplifié):
Quand j'ai recommencé à zéro, j'ai utilisé le
PYTHON
bit comme espace réservé pour le code qui devrait imprimer le programme A. Cette version plus simple a permis d'expliquer plus facilement comment le programme B et le programme C seraient imprimés.Le
print
et tout à l'intérieur est ce qui imprime le programme B, mais d'abord, voyons comment le programme C est imprimé, car c'est simple. Après l'print"..."
est#|
. Cette astuce a sauvé des charges de difficulté que j'ai rencontrées lors de ma première tentative. Cela permet à Retina de ne rien remplacer par la 2e ligne, qui sera le programme C, sauf qu'il y a un#
devant. Les 2 dernières lignes suppriment cela en premier#
. J'avais l'habitude#{2}
d'empêcher la scène de supprimer toutes les occurrences de#
. Je ne peux pas utiliser#1`#
comme je l'ai utilisé dans le programme B, car cela provoque des problèmes pour avoir ce backtick dans la première ligne du programme A.Ce qui m'amène à ma prochaine tâche, l'impression du programme B. Vous avez peut-être remarqué une autre différence par rapport au code réel. Il n'y a pas de backticks dans le code réel, puisque je les ai remplacés par des tabulations. J'ai dû remplacer un caractère, car tout backtick ferait du code précédent une chaîne de configuration dans Retina, ce qui rendrait la syntaxe invalide. J'ai choisi des onglets car ils sont visibles et le point de code est un seul chiffre (
9
). Le code imprime le programme B comme indiqué dans la version simplifiée ci-dessous.Programme B:
Les deux premières lignes ne remplaceront rien par le code Python, mais par un
#
devant et certains caractères légèrement différents. Cette partie est omise pour plus de clarté. L'étape suivante supprime cela en premier#
. Ensuite, j'utilise une étape#T`²-¹`_o`[^¹]
de translittération (T) pour annuler certaines desreplace
opérations vues dans le programme complet A. L'utilisation de cette étape est un moyen de produire un pilcrow littéral¶
dans la rétine, qui pourrait sinon être impossible.¹ Il remplace·
par¶
, et³
par²
. Les occurrences de¹
resteront les mêmes car elles sont ignorées[^¹]
.Programme A:
Des nouvelles lignes et des onglets ont été ajoutés pour plus de lisibilité.
Cela suit la structure générale du quine Python suivant:
Lorsque vous ajoutez des éléments avant ou après, vous devez également les mettre dans la chaîne.
Je voulais utiliser une chaîne entre guillemets pour faciliter l'inclusion de guillemets (en évitant l'utilisation de barres obliques inverses).
s=U(39)*3;
est la chaîne'''
. J'ai également utilisé à la%s
place de%r
, afin d'éviter certains problèmes avec les sauts de ligne ou d'autres caractères échappés avec des barres obliques inverses.Alors maintenant, les remplacements. Le premier remplacement
.replace(U(9),U(96));
est là pour remplacer les onglets par les astuces que nous voyons dans le programme B. Ce remplacement est effectué avant le formatage des chaînes, car les onglets doivent rester des onglets dans le programme A. Les autres remplacements consistent simplement à éviter d'utiliser certains caractères dans le 2e ligne du programme B:Ces trois derniers remplacements anticipent l'étape de translittération dans le programme B, afin d'empêcher que ces caractères soient supprimés ou translittérés alors qu'ils ne devraient pas l'être.
La seule autre partie du code est le code du programme B qui est essentiellement copié caractère par caractère, à l'exception des modifications dues aux remplacements.
¹ Merci à Martin pour son conseil sur la sortie d'un littéral
¶
en rétine. Cela a rendu tout tellement plus facile.la source
Befunge / Python,
381 + 485259 + 345229 + 304 = 533 octetsProgramme A: Essayez à Befunge | Essayez en Python
Programme B: Essayez en Python | Essayez à Befunge
Programme C: Essayez à Befunge | Essayez en Python
Explication
Programme C: Cela repose sur le fait que Befunge-93 ignore les instructions non prises en charge, donc pendant que l'
p
écriture inoffensive d'un zéro à 0; 0, le reste duprint
est ignoré jusqu'à l'<
instruction qui inverse la direction. Puis, de droite à gauche, le+5+5
pousse un 10 (saut de ligne) sur la pile, suivi de la chaîne de message, puis une séquence de sortie standard est exécutée pour écrire la chaîne. En Python, il s'agit simplement d'imprimer deux littéraux de chaîne qui sont concaténés ensemble, mais le premier (contenant le code Befunge) est coupé par la référence du tableau à la fin ([+5+5:]
).Programme B: La première ligne est une séquence Befunge assez basique pour imprimer le programme C. La seule chose intéressante est la façon dont elle génère des guillemets en utilisant
50g
(c'est-à-dire en lisant le caractère de la mémoire) qui est plus efficace que le calcul du code ASCII. Le#>
(un pont sur l'instruction de direction) est essentiellement un nop qui empêche le code d'être vu par Python puisqu'il#
s'agit du caractère de commentaire Python. L'interprétation Python commence à la ligne deux et imprime simplement une chaîne multiligne contenant le code source du programme A.Programme A: en Python, les trois premières lignes sont à nouveau ignorées car elles commencent par
#
, tandis que la dernière ligne imprime simplement le programme C. Le code Befunge serpente d'avant en arrière sur les trois premières lignes, créant la source du programme B sur la pile dans le sens inverse. Il commence par trois guillemets, puis une séquence qui fait une copie de la source du programme A, et enfin ce qui est essentiellement une chaîne codée en dur avec l'ouvertureprint """
et la première ligne de code Befunge. Il suffit alors de l'écrire avec une séquence de sortie standard.Quelques points de discorde:
On m'a dit qu'un quine utilisant la
g
commande n'est pas considéré comme un quine approprié en ce qui concerne cette communauté. Je ne sais pas si cette règle s'appliquerait également à ce défi, mais si c'est le cas, cette réponse pourrait ne pas être considérée comme une solution appropriée non plus.Bien que j'ai dit que Befunge-93 ignore les instructions non prises en charge, cela n'est pas techniquement défini dans la spécification, et vous devrez utiliser l'
-q
option de ligne de commande (silencieuse) dans l'interpréteur de référence pour éviter les avertissements dans le programme C. La plupart des autres interprètes le feront être bien, cependant, mais certains des plus flocons pourraient potentiellement planter. Notez également que Befunge-98 réfléchit sur les instructions non prises en charge, donc un interpréteur 98 bouclera indéfiniment.la source
-q
drapeau est-il en fait "assez", ou vouliez-vous dire "calme"? Mm-oui, ce drapeau est très utile.r
instruction eflect et le 0 qui étaitp
dans la première cellulePerl / JavaScript, 176 octets + 176 octets = 352 octets
Ne pensez pas que je peux partager 52 octets hors du mécanisme sous-jacent pour la prime, mais j'ai aimé construire cela. Je pense que ce que j'ai produit répond aux critères ...
Programme A:
Programme B:
Programme C:
Explication
Utilise ma polyquine Perl / JavaScript comme base mais définit une variable supplémentaire
$P
qui contrôle le programme à générer. Utilise la vérification qui+[]
est véridique en Perl, mais fausse en JavaScript.la source