Pseudo-Quine-Polyglot-Spracherkennungszähler

11

Quines machen Spaß. Polyglots machen auch Spaß. Es gibt vielsprachige Quines, aber wir können die Messlatte noch höher legen.

Schreiben Sie eine Datei, die ein gültiges Programm für die Sprachen α, β und γ enthält. Wenn die Datei (möglicherweise nach dem Kompilieren) als Programm der Sprache α oder β ausgeführt wird, muss die Ausgabe des Programms dieselbe Form haben wie eine gültige Einreichung für diesen Wettbewerb. Wenn Ihre Datei als Sprachprogramm γ ausgeführt wird, gibt sie eine Zahl aus. Der Wert dieser Zahl ist die Kette früherer Ausführungen des Programms, die als Binärzahl interpretiert wurden.

Diese Erklärung ist möglicherweise etwas schwer zu verstehen, daher hier ein Beispiel. Sei Α, Β und Γ Funktionen, die ihre Eingabe als Sprache α, β bzw. γ ausführen. programmieren und die Ausgabe dieser Programme zurückgeben. Sei x eine gültige Einsendung für diesen Wettbewerb. Dann ergibt der folgende Ausdruck, in dem wir x durch die Sprache β, α, β, α, α, β und γ in dieser Reihenfolge verarbeiten, 41, da 41 10 = 101001 2 .

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

Sie können nicht davon ausgehen, dass die vorletzte Ausführung in der Kette eine Ausführung in der Sprache β ist. Für den Fall, dass Ihre ursprüngliche Einreichung direkt als Sprachprogramm γ ausgeführt wird, wird 0 ausgegeben.

Ihr Programm muss sich für bis zu 16 Zusammenstellungen in der Kette korrekt verhalten. Das heißt, die höchste Zahl, die Ihr Programm am Ende ausdrucken könnte, ist 2 15 - 1. Natürlich darf Ihr Programm längere Kompilierungsketten unterstützen.

Dies ist ein Beliebtheitswettbewerb, um kreative Lösungen zu fördern. Die Einreichung mit der höchsten Stimmenzahl gewinnt.

FUZxxl
quelle
Können die drei Sprachen gleich sein (obwohl dies die Upvotes drastisch reduzieren würde)?
Zgarb
6
@Zgarb Ich würde gerne eine Lösung sehen, bei der einige (oder alle) Sprachen gleich sind. Mal sehen, wie Sie es schaffen, gleiche Sprachen zu unterscheiden.
FUZxxl
1
...Aha. : DI las die Herausforderung zu hastig.
Zgarb
@Zgarb wie wäre es mit verschiedenen Versionen derselben Sprache? magic += Number(System.env.lang_version[-1])
John Dvorak
1
+1 für die Verwendung von griechischen Buchstaben anstelle der langweiligen a,b,coder 1,2,3=)
Fehler

Antworten:

13

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

#;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])

Python-Erklärung

Die Python 2- und Python 3-Interpreter funktionieren ähnlich, außer dass die v=int(1/2*2)Variable unterschiedliche Werte ( 0und 1) erhält, da Python 2 die Float-Division und Python 3 die Integer-Division verwendet.

In jedem Lauf fügen sie den Ausdruck +0*2oder +1*2 in die erste Zeile (nach #;n) und in die xZeichenfolge (nach dem letzten Schreibbefehl) ein. Der> <> Interpreter verwendet die erste Addition und die Pythons die zweite, um korrekte Quines zu erstellen.

Code nach 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])

> <> (Fisch) Erklärung

Wenn Sie den Interpreter> <> ausführen, springt der #Codezeiger von den Umbrüchen um die erste Zeile zurück und beginnt am Ende der ersten Zeile und in Richtung Westen, indem er Zahlen auf den Stapel schiebt. Wenn ein Operator kommt ( +oder *), werden die beiden obersten Elemente aus dem Stapel entfernt und das Ergebnis zurückgeschoben. Mit dieser Methode erhalten wir die base2-Darstellung der vorherigen Läufe ( 13im vorherigen Beispiel). Dies ist die gewünschte Nummer, also geben wir sie mit aus nund beenden mit ;.

randomra
quelle
Das ist ziemlich nett.
FUZxxl