Compteurs de détection de langage polyglotte pseudo-quine

11

Les quines sont amusantes. Les polyglottes sont aussi amusantes. Polyglot Quines existe, mais nous pouvons relever la barre encore plus haut.

Écrivez un fichier qui contient un programme valide pour les langues α, β et γ. Lorsque le fichier est exécuté (éventuellement après sa compilation) en tant que programme de langue α ou β, la sortie du programme doit être de la même forme qu'une soumission valide à ce concours. Si votre fichier est exécuté comme un programme de langue γ, il doit afficher un nombre. La valeur de ce nombre est la chaîne des exécutions précédentes du programme interprétée comme un nombre binaire.

Cette explication peut être un peu difficile à comprendre, alors voici un exemple. Soit Α, Β et Γ des fonctions qui exécutent leur entrée en tant que langage α, β ou γ resp. programme et retourner la sortie de ces programmes. Soit x une soumission valide à ce concours. Ensuite, l'expression suivante, où nous traitons x par le langage β, α, β, α, α, β et γ dans cet ordre, donnera 41, puisque 41 10 = 101001 2 .

Γ (Β (Α (Α (Β (Α (Β ( x )))))))))

Vous ne pouvez pas supposer que l'avant-dernière exécution de la chaîne est une exécution en langage β. Dans le cas où votre soumission d'origine est directement exécutée en tant que programme de langue γ, elle affichera 0.

Votre programme doit se comporter correctement pour un maximum de seize compilations dans la chaîne; c'est-à-dire que le nombre le plus élevé que votre programme pourrait imprimer à la fin est 2 15 - 1. Bien sûr, votre programme est autorisé à prendre en charge des chaînes de compilation plus longues.

Il s'agit d'un concours de popularité visant à encourager les solutions créatives. La soumission avec le plus grand nombre de voix gagne.

FUZxxl
la source
Les trois langues peuvent-elles être égales (même si cela réduirait considérablement les votes positifs)?
Zgarb
6
@Zgarb J'aimerais voir une solution où certaines (ou toutes) des langues sont égales. Voyons comment vous parvenez à distinguer des langues égales.
FUZxxl
1
...Je vois. : DI a lu le défi trop hâtivement.
Zgarb
@Zgarb que diriez-vous des différentes versions de la même langue? magic += Number(System.env.lang_version[-1])
John Dvorak
1
+1 pour l'utilisation de lettres grecques au lieu de l'ennuyeux a,b,cou 1,2,3=)
flawr

Réponses:

13

Python 2, Python 3,> <> (poisson)

#;n0
import sys
x='\\\'\nn#;n0import sysx=v=int(1/2*2)sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])n'
v=int(1/2*2)
sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])

Explication de Python

Les interprètes Python 2 et Python 3 fonctionnent de la même manière, sauf que la v=int(1/2*2)variable obtient des valeurs différentes ( 0et 1) car Python 2 utilise la division flottante et Python 3 utilise la division entière.

À chaque exécution, ils ajoutent l'expression +0*2ou +1*2 à la première ligne (après #;n) et à la xchaîne (après la dernière commande d'écriture). L'interpréteur> <> utilise le premier ajout et les Pythons utilisent le second pour créer des quines correctes.

Code après B(A(B(B(x)))):

#;n+1*2+0*2+1*2+1*20
import sys
x='\\\'\nn#;n0import sysx=v=int(1/2*2)sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])+1*2+0*2+1*2+1*2n'
v=int(1/2*2)
sys.stdout.write(x[4:7]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[7:8]),sys.stdout.write(x[2:3]),sys.stdout.write(x[8:18]),sys.stdout.write(x[2:3]),sys.stdout.write(x[18:20]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[0:1]),sys.stdout.write(x[1:2]),sys.stdout.write(x[0:1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[3:4]),sys.stdout.write(x[4:7]),sys.stdout.write(x[7:8]),sys.stdout.write(x[8:18]),sys.stdout.write(x[18:20]),sys.stdout.write(x[20:32]),sys.stdout.write(x[32:851]),sys.stdout.write(chr(43)+str(v)+chr(42)+chr(50)),sys.stdout.write(x[851:-1]),sys.stdout.write(x[3:4]),sys.stdout.write(x[1:2]),sys.stdout.write(x[2:3]),sys.stdout.write(x[20:32]),sys.stdout.write(x[2:3]),sys.stdout.write(x[32:851])

> <> (Poisson) explication

Lorsque vous exécutez l'interpréteur> <>, le pointeur de code rebondit à partir des #retours à la ligne autour de la première ligne et en commençant par la fin de la première ligne et en se dirigeant vers l'ouest commence à pousser des nombres sur la pile. Si un opérateur arrive ( +ou *) il fait sortir les deux premiers éléments de la pile et repousse le résultat. Avec cette méthode, nous nous retrouvons avec la représentation base2 des exécutions précédentes ( 13dans l'exemple précédent). C'est le nombre souhaité, nous le sortons donc avec net nous terminons avec ;.

randomra
la source
C'est plutôt sympa.
FUZxxl