Schreiben Sie eine Semiquine

10

Angenommen, Sie haben zwei Sprachen Aund B. Eine Zeichenfolge sist eine Semiquine in Aund Bwenn sie die folgenden Bedingungen erfüllt:

  1. sist eine Quine in der Sprache A.
  2. sist ein Polyglot in Aund B.
  3. Die Ausgabe beim Ausführen sals BProgramm ist eine andere Zeichenfolge s', bei der es sich um eine Quine handelt B.

Das Ziel dieser Herausforderung ist es, eine Semiquine in zwei verschiedenen Sprachen zu schreiben. Dies ist , also gewinnt der kürzeste Code, wobei die früheste Antwort als Tiebreaker verwendet wird.

Regeln für Quines

Es werden nur echte Quines akzeptiert. Das heißt, Sie müssen den gesamten Quellcode wörtlich in STDOUT drucken, ohne :

  • Lesen Sie Ihren Quellcode direkt oder indirekt.
  • Verlassen Sie sich auf eine REPL-Umgebung, die einfach jeden Ausdruck auswertet und druckt, den Sie eingeben.
  • Verlassen Sie sich auf Sprachfunktionen, die in bestimmten Fällen nur die Quelle ausdrucken.
  • Verwenden von Fehlermeldungen oder STDERR, um das Quine ganz oder teilweise zu schreiben. (Sie können Dinge an STDERR schreiben oder Warnungen / nicht schwerwiegende Fehler erzeugen, solange STDOUT eine gültige Quine ist und die Fehlermeldungen nicht Teil davon sind.)

Darüber hinaus darf Ihr Quellcode nicht nur aus Literalen (ob Zeichenfolgenliterale, numerische Literale usw.) und / oder NOPs bestehen. Zum Beispiel `12ist es ein Polyglot in Jelly und Pyth, aber in Jelly ist es ein NOP und ein numerisches Literal, daher ist es nicht gültig.

Jegliche nicht unterdrückbare Ausgabe (wie Copyright-Hinweise, Start- / Herunterfahrmeldungen oder ein nachfolgender Zeilenvorschub) kann in der Ausgabe aus Gründen der Gültigkeit des Quines ignoriert werden.

Regeln für Polyglotten

Die beiden verwendeten Sprachen müssen sich deutlich unterscheiden. Speziell:

  • Es dürfen keine unterschiedlichen Versionen derselben Sprache sein (z. B. Python 2 vs. Python 3).
  • Es dürfen keine unterschiedlichen Dialekte derselben Sprache sein (z. B. Pascal vs. Delphi).
  • Eine Sprache ist möglicherweise keine Teilmenge der anderen (z. B. C vs. C ++ 1 ).
  • Eine Sprache ist möglicherweise keine triviale Ableitung der anderen (z. B. Matlab vs. Octave 2 , Brainfuck vs. Boolfuck vs. TinyBF vs. ShadyAsFuck vs. alle anderen trivialen Brainfuck-Derivate).

Verschiedene Regeln

  • Sie dürfen keine Eingaben von STDIN (oder einer anderen Quelle) akzeptieren. Wenn Ihre gewählte Sprache muss Eingabe nehmen, dann muss entweder die Eingabe leer (leere Zeichenkette, aus geleitet werden /dev/null, etc.) oder der Ausgabe des Programms muss hängt nicht von dem Eingang.
  • Für diese Herausforderung müssen Sie ein vollständiges Programm schreiben. Das Erfordernis von zusätzlichem Code zum Ausführen der Lösung ist nicht zulässig (z. B. Zuweisen und Aufrufen einer in der Lösung definierten Lambda-Funktion).

1: Ja, ich weiß, dass C nicht wirklich eine Teilmenge von C ++ ist. Es ist nah genug, um für Polyglots als eines angesehen zu werden, also zähle ich es für diese Herausforderung.

2: Wie Punkt 1 oben, obwohl Octave technisch nicht zu 100% mit Matlab kompatibel ist, wurde es so konzipiert, dass es kompatibel ist, und es ist nah genug, dass das Zulassen eines Matlab / Octave-Polyglots die Herausforderung trivialisieren würde.

Mego
quelle
Sind ESMins Kopierblöcke erlaubt?
Lirtosiast
@ThomasKwa Ich bin nicht mit ESMin vertraut. Könnten Sie mir einen kurzen Überblick geben?
Mego
Es gibt einen Befehl zum Starten eines Kopierblocks, der den Quellcode von allem abruft, was daran vorbei ist. Ich denke, andere JS-Golfsprachen könnten auch eine haben.
Lirtosiast
@ThomasKwa Das wäre nach der ersten Regel in den Quine-Regeln nicht erlaubt (kein direktes oder indirektes Lesen des Quellcodes).
Mego
1
@Downgoat Solange es keine anderen Regeln verletzt, absolut. Macken zu missbrauchen ist eine Art Ziel dieser Seite :)
Mego

Antworten:

6

GolfScript + Fission , 19 18 Bytes

{".~
'!+OR"
2<}.~

Der nachlaufende Zeilenvorschub ist erforderlich.

Dies ist eine echte Quine in GolfScript. Probieren Sie es online aus!

In Fission wird gedruckt

'!+OR"

Das ist eine wahre Quine in Fission . Probieren Sie es online aus!

Erläuterung

In GolfScript alles in der Form

{...}.~

ist eine Quine, solange ...eine Schnur mit ".~"auf dem Stapel bleibt . Das .dupliziert den Block, so dass am Ende eine Kopie gedruckt wird, und das ~führt es aus, sodass wir seinen Inhalt verwenden können, um das .~selbst zu drucken . In diesem Fall drückt der Block die Zeichenfolge

".~
'!+OR"

und schneidet es dann auf die ersten beiden Zeichen mit ab 2<.

Das Fission-Programm funktioniert genau so wie das Quine selbst , da die erste und dritte Zeile vom Programm völlig ignoriert werden.

Martin Ender
quelle
6

Ruby + (JavaScript oder Python 3), 76 Bytes

Dies ist eine weitere Herausforderung, die mit meiner neuen Lieblingssprache, der fast üblichen Teilmenge von Ruby, JavaScript und Python 3, gelöst werden kann. und da wir noch keine Antworten in exoterischen Sprachen haben und viele Leute gerne Lösungen sehen, die nicht Golf spielen, dachte ich, ich würde eine beitragen. Noch besser ist, dass dieselbe Antwort die Herausforderung auf verschiedene Weise gleichzeitig löst.

Hier ist s:

s="'";d='"';n='print("s="+d+s+d+";d="+s+d+s+";n="+s+n+s+";eval(n)")';eval(n)

Dies ist eine Quine in Ruby. Es ist kein Quine in JavaScript oder Python 3; Wenn Sie es in einer dieser Sprachen s'ausführen, hat die Ausgabe einen nachgestellten Zeilenumbruch und ist daher anders:

s = "'"; d =' "'; n =' print (" s = "+ d + s + d +"; d = "+ s + d + s +"; n = "+ s + n + s +" ; eval (n) ") '; eval (n)

Ist s'jedoch eine polyglotte Quine in JavaScript und Python 3! (Wie für mich üblich, verwende ich die Rhino-Implementierung von JavaScript, sowohl aus praktischen Gründen (da sie über die Befehlszeile ausgeführt wird, anstatt einen Browser zu benötigen) als auch weil sie eine seltsame Standardbibliothek hat, in die in die printStandardausgabe geschrieben wird.) Beide Sprachen erzeugen s'als Ergebnis der Ausführung eines der beiden Programme.

Als Bonus löst dieses Programm das Problem auch umgekehrt. Wenn Sie sich für die Ausführung s'in Ruby entscheiden, wird das ursprüngliche Programm serneut gedruckt . Als solche s'ist eine gültige (aber etwas längere, mit 77 Bytes) Antwort auf die Frage.

An diesem Punkt fange ich fast an zu denken, dass "Unterschiede, ob die Ausgabe mit einem Zeilenumbruch endet oder nicht, der ausreicht, um zwei Programme als unterschiedlich zu zählen", als Standardlücke angesehen werden sollten, da dies eine zweite Gruppe von Sprachen zu sein scheint (jenseits des bekannten GolfScript / CJam), in dem es möglich ist, den Trick durchzuziehen.


quelle
2

Vitsy (abgesicherter Modus) und Y, 9 Bytes, nicht konkurrierend.

' Ugrd3*Z

In Vitsy ist dies eine Quine. In Y wird gedruckt Ugrd3*Z'; Beim Ausführen wird dies gedruckt Ugrd3*Z', was in Y eine Quine ist. Y datiert die Frage jedoch nach.

Was Vitsy sieht:

 ' Ugrd3*Z
 '         Heyyyy a string! Let's do this!
  ........ Capturing a string! Oh, not done? Hm, let's go back to the start.
 '         There we go.
           (space) ...
   U       (no op)
    g      use count, disabled in safe mode
     r     reverse stack
      d3*  push a '
         Z print it all!

Was Y sieht:

' Ugrd3*Z
'         Push a space.
  U       Wrap around and capture.
   g      Print that. (Nothing else is printed.)
Conor O'Brien
quelle
1
Beachten Sie, dass dies nur im abgesicherten Modus funktioniert oder vielmehr einige ... unbeabsichtigte Nebenwirkungen im nicht abgesicherten Modus hat.
Addison Crump
1

CJam + GolfScript, 9 Bytes

"0$p"
0$p

Dies ist eine Quine in CJam. In GolfScript gibt es sich mit einem nachgestellten Zeilenumbruch aus, der in GolfScript eine Quine ist.

Ich bin mir nicht sicher, ob CJam als triviales Derivat von GolfScript angesehen werden sollte. Aber ich denke, sie sind ganz anders und zumindest nicht trivial.

jimmy23013
quelle