Quine, das den Namen einer Sprache als Eingabe verwendet und dasselbe ausgibt, was in der Eingabesprache implementiert ist

15

Von Quine Central :

Schreiben Sie ein Quine, das den Namen einer Sprache als Eingabe verwendet und dasselbe ausgibt, das in der Eingabesprache implementiert ist.

Der Quellartikel hat etwas, woran Sie arbeiten können, aber wie der Autor sagt, ist dies viel schwieriger. Natürlich müssen Sie nur eine begrenzte Anzahl von Sprachen unterstützen. Sie haben jedoch die Wahl, ebenso wie die Basissprache.

Als wird Ihre Punktzahl die Anzahl der Sprachen sein, die Ihr Programm unterstützt. höher ist besser.

marcog
quelle
Eingängiger Titel ...
FlipTack
Definieren Sie "Anzahl der Sprachen".
Adám
@ Adám: Nun, die Herausforderung besteht darin, ein Programm zu schreiben, das eine Reihe von Sprachen unterstützt: Wenn Sie den Namen einer der Sprachen als Eingabe eingeben, wird ein gleichwertiges Programm in dieser Sprache ausgegeben. Die Anzahl der Sprachen, in denen das Programm arbeitet, ist die Größe des Sets. Dies ist nicht meine Herausforderung (nur eine, die ich belohnt habe), daher glaube ich nicht, dass es eine "offizielle" Quelle für Eckfälle gibt. Daher können und sollten wir alle gemeinsam die Herausforderung bearbeiten, um sie besser / klarer zu gestalten, ohne die Bedeutung zu ändern.
@ ais523 Was hindert uns daran, eine polyglotte Quine zu schreiben, die Eingaben entgegennimmt und nichts damit anfängt? Das wäre nach diesen Regeln völlig legal.
mbomb007
@ mbomb007: es ist legal, aber möglicherweise nicht der einfachste weg, die frage zu beantworten. Polyglot-Quines lassen sich oft nur schwer in zusätzliche Sprachen einpassen, wohingegen für die derzeit formulierte Frage kein Polyglot geschrieben werden muss (und über eine Reihe universeller Quine-Konstruktoren gelöst werden kann, einen in jeder von Ihnen verwendeten Sprache).

Antworten:

4

Rubin

require 'json';s=%q[{"ruby":[" %q[","require 'json';s=##;j=JSON.load s;puts j[l=gets.chomp][1].sub('##',j[l][0].delete(' ')+s+j[l][2].delete(' '))"," ]"],"python":["' ''","import json,re;s=##;j=json.loads(s);l=raw_input();print(re.sub('##',j[l][0].replace(' ','')+s+j[l][2].replace(' ',''),j[l][1],1))","' ''"]}];j=JSON.load s;puts j[l=gets.chomp][1].sub('##',j[l][0].delete(' ')+s+j[l][2].delete(' '))

Python

import json,re;s='''{"ruby":[" %q[","require 'json';s=##;j=JSON.load s;puts j[l=gets.chomp][1].sub('##',j[l][0].delete(' ')+s+j[l][2].delete(' '))"," ]"],"python":["' ''","import json,re;s=##;j=json.loads(s);l=raw_input();print(re.sub('##',j[l][0].replace(' ','')+s+j[l][2].replace(' ',''),j[l][1],1))","' ''"]}''';j=json.loads(s);l=raw_input();print(re.sub('##',j[l][0].replace(' ','')+s+j[l][2].replace(' ',''),j[l][1],1))

Beide Versionen nehmen Eingaben auf stdin ( rubyoder pythonaktuell) entgegen und generieren die Ausgabe auf stdout in einer der beiden Sprachen.

Nemo157
quelle
1

Turtlèd , Python 2 und Python 3, 3 Sprachen, die nur um Kopfgeld konkurrieren

Alle Oneliner gefolgt von Newline

Turtlèd

@##'@r,r,r-{ +.r_}r{ +.r_}!!-.(3"';m=ord(input()[-1]);_='x=%r;m=ord(input()[-1]);_=%r;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%%(x,_) if m==50 else _%%(x,_) if m==51 else x.replace(chr(121),chr(39)))';print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%(x,_) if m==50 else _%(x,_) if m==51 else x.replace(chr(121),chr(39)))"367>;++[ d( d)('.)]d<"x='"))(2"';m=ord(raw_input()[-1]);_='x=%r;m=ord(input()[-1]);_=%r;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%%(x,_) if m==50 else _%%(x,_) if m==51 else x.replace(chr(121),chr(39)))';print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%(x,_) if m==50 else _%(x,_) if m==51 else x.replace(chr(121),chr(39)))"371>;++[ d( d)('.)]d<"x='"))(d' )#'@r,r,r-{ +.r_}r{ +.r_}!!-.(3"';m=ord(input()[-1]);_='x=%r;m=ord(input()[-1]);_=%r;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%%(x,_) if m==50 else _%%(x,_) if m==51 else x.replace(chr(121),chr(39)))';print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%(x,_) if m==50 else _%(x,_) if m==51 else x.replace(chr(121),chr(39)))"367>;++[ d( d)('.)]d<"x='"))(2"';m=ord(raw_input()[-1]);_='x=%r;m=ord(input()[-1]);_=%r;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%%(x,_) if m==50 else _%%(x,_) if m==51 else x.replace(chr(121),chr(39)))';print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%(x,_) if m==50 else _%(x,_) if m==51 else x.replace(chr(121),chr(39)))"371>;++[ d( d)('.)]d<"x='"))(d' )

Probieren Sie es online!

Python 2

x='@##y@r,r,r-{ +.r_}r{ +.r_}!!-.(3"y;m=ord(input()[-1]);_=yx=%r;m=ord(input()[-1]);_=%r;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%%(x,_) if m==50 else _%%(x,_) if m==51 else x.replace(chr(121),chr(39)))y;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%(x,_) if m==50 else _%(x,_) if m==51 else x.replace(chr(121),chr(39)))"367>;++[ d( d)(y.)]d<"x=y"))(2"y;m=ord(raw_input()[-1]);_=yx=%r;m=ord(input()[-1]);_=%r;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%%(x,_) if m==50 else _%%(x,_) if m==51 else x.replace(chr(121),chr(39)))y;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%(x,_) if m==50 else _%(x,_) if m==51 else x.replace(chr(121),chr(39)))"371>;++[ d( d)(y.)]d<"x=y"))(dy )#y@r,r,r-{ +.r_}r{ +.r_}!!-.(3"y;m=ord(input()[-1]);_=yx=%r;m=ord(input()[-1]);_=%r;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%%(x,_) if m==50 else _%%(x,_) if m==51 else x.replace(chr(121),chr(39)))y;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%(x,_) if m==50 else _%(x,_) if m==51 else x.replace(chr(121),chr(39)))"367>;++[ d( d)(y.)]d<"x=y"))(2"y;m=ord(raw_input()[-1]);_=yx=%r;m=ord(input()[-1]);_=%r;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%%(x,_) if m==50 else _%%(x,_) if m==51 else x.replace(chr(121),chr(39)))y;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%(x,_) if m==50 else _%(x,_) if m==51 else x.replace(chr(121),chr(39)))"371>;++[ d( d)(y.)]d<"x=y"))(dy )';m=ord(raw_input()[-1]);_='x=%r;m=ord(input()[-1]);_=%r;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%%(x,_) if m==50 else _%%(x,_) if m==51 else x.replace(chr(121),chr(39)))';print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%(x,_) if m==50 else _%(x,_) if m==51 else x.replace(chr(121),chr(39)))

Probieren Sie es online!

Python 3

x='@##y@r,r,r-{ +.r_}r{ +.r_}!!-.(3"y;m=ord(input()[-1]);_=yx=%r;m=ord(input()[-1]);_=%r;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%%(x,_) if m==50 else _%%(x,_) if m==51 else x.replace(chr(121),chr(39)))y;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%(x,_) if m==50 else _%(x,_) if m==51 else x.replace(chr(121),chr(39)))"367>;++[ d( d)(y.)]d<"x=y"))(2"y;m=ord(raw_input()[-1]);_=yx=%r;m=ord(input()[-1]);_=%r;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%%(x,_) if m==50 else _%%(x,_) if m==51 else x.replace(chr(121),chr(39)))y;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%(x,_) if m==50 else _%(x,_) if m==51 else x.replace(chr(121),chr(39)))"371>;++[ d( d)(y.)]d<"x=y"))(dy )#y@r,r,r-{ +.r_}r{ +.r_}!!-.(3"y;m=ord(input()[-1]);_=yx=%r;m=ord(input()[-1]);_=%r;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%%(x,_) if m==50 else _%%(x,_) if m==51 else x.replace(chr(121),chr(39)))y;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%(x,_) if m==50 else _%(x,_) if m==51 else x.replace(chr(121),chr(39)))"367>;++[ d( d)(y.)]d<"x=y"))(2"y;m=ord(raw_input()[-1]);_=yx=%r;m=ord(input()[-1]);_=%r;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%%(x,_) if m==50 else _%%(x,_) if m==51 else x.replace(chr(121),chr(39)))y;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%(x,_) if m==50 else _%(x,_) if m==51 else x.replace(chr(121),chr(39)))"371>;++[ d( d)(y.)]d<"x=y"))(dy )';m=ord(input()[-1]);_='x=%r;m=ord(input()[-1]);_=%r;print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%%(x,_) if m==50 else _%%(x,_) if m==51 else x.replace(chr(121),chr(39)))';print(_.replace(chr(100)+chr(40),chr(100)+chr(40)+chr(114)+chr(97)+chr(119)+chr(95))%(x,_) if m==50 else _%(x,_) if m==51 else x.replace(chr(121),chr(39)))

Probieren Sie es online!

Erläuterung:

Für jede Sprache habe ich bereits geschriebene Quines genommen und ein wenig modifiziert.

Turtlèd zuerst:

Turtlèd enthält die Standard-Quine-Struktur. Sollte die Eingabe jedoch mit einer 2 oder einer 3 enden, wird das Ende des Python-Codes, entweder 2 oder 3, separat an die Ausgabe von quine angehängt und dann zum Anfang zurückgekehrt und addiertx=' . Ansonsten wird der Quellcode wie ein normales Quine ausgegeben

Beachten Sie auch, dass die Eingabe zweimal erforderlich ist !!., da die Quelle eine neue Zeile enthält, in die eine leere Zeile eingegeben wird.

Auf dem Weg zum Anfang der Zeichenfolge 'ändert sich jedoch die gesamte 'Hauptquelle auf dem Weg zu , um die Tatsache zu vermeiden, dass die Zeichenfolge nicht enthalten sein kann y. In diesem Fall könnte das Entkommen von Zitaten ärgerlich sein, wenn es überhaupt möglich ist

das hängt von einem Trick ab; Ich hätte nicht schreiben können (''y),(pseudocode:if cell is ', write y) , denn dann wäre ich nicht von einem 'zu unterscheiden gewesen. also benutze ich das y aus dem eingang "python"! Das war ein echter Eureka-Moment für mich.

Dann gibt es die Python quinelike Dinge.

So funktioniert das Python-Quinelike:

Es funktioniert wie ein normales Quine, enthält jedoch auch die Variable x

Wenn Python 3 eingegeben wurde, funktioniert es wie ein normales Quine und verwendet die% -Formatierung, um auch die Quelle für Turtlèd einzuschließen.

Wenn es Eingabe-Python 2 hat, ersetzt es inputin der Zeichenfolge mit raw_inputund tut ansonsten genau das Gleiche.

Wenn es sich bei der Eingabe um Turtlèd handelt, wird das ys in der Turtlèd-Quelle ersetzt und gedruckt.

Die beiden Python-Programme funktionieren auf dieselbe Weise und nehmen Eingaben auf dieselbe Weise vor

Zerstörbare Zitrone
quelle