Meta Quine Checker

10

Wenn Sie diese Herausforderung annehmen, besteht diese Herausforderung darin, drei Funktionen oder Programme A, B und C zu schreiben:

  • A ist eine Quine, die alle A, B und C ausgibt (was auch den gesamten Inhalt des Codes in Ihrer Einreichung darstellt).
  • B nimmt einen Parameter F und prüft, ob es sich um eine solche Quine handelt (Ausgabe von FBC) oder ob etwas anderes getan wird.
  • C nimmt einen Parameter G und prüft, ob G möglicherweise wie B funktioniert (prüft, ob F FGC ausgibt). Es ist unmöglich zu entscheiden, ob eine Funktion ein Quine Checker ist. Lassen Sie uns also etwas Einfacheres tun:
    • Es muss wahr sein, wenn G für B gültig ist.
    • Es muss falsey zurückgeben, wenn G für alle gültigen Quines falsey zurückgibt, oder G für alle gültigen Nicht-Quines wahrheitsgemäß zurückgibt.
    • Es kann alles zurückgeben, abstürzen oder nicht beenden usw., wenn es sich um einen der anderen Fälle handelt.

Beachten Sie, dass B möglich ist. A und F haben keine Eingabe, Sie können sie also einfach ausführen und das Ergebnis überprüfen.

Regeln

  • Es sollte eine Möglichkeit geben, anhand der Ausgabe von A zu erkennen, welche Teile A, B und C sind. Beispiel: Jede hat eine Zeile, oder sie werden im Interpreter als drei Funktionen erkannt.
  • Jede Funktion sollte nur mit der Definition von sich selbst ausgeführt werden, nicht mit Ihrem vollständigen Code.
  • Sie können eine Funktion / ein Programm oder dessen Quellcode oder ein Paar von beiden als Eingabe von B (oder G) und C verwenden.
  • Sie können truey / falsey für eine Teilmenge dieser Werte neu definieren. Sie können auch konsistent verlangen, dass F einen von Ihnen ausgewählten Typ zurückgibt, z. B. eine einzelne Zeichenfolge.
  • Sie können A, B, F und G benötigen, wenn sie mit gültigen Parametern aufgerufen werden und durchweg keine anderen Arten von Eingaben oder Nebenwirkungen haben, die Sie auswählen, z. B. den Zugriff auf globale Variablen oder das Lesen von stdin usw.
  • Sie können auch annehmen, dass F und G immer enden, wenn sie mit gültigen Parametern aufgerufen werden.
  • F sollte unter den gleichen Bedingungen wie A arbeiten. Es kann also nicht von B oder C oder der Existenz einer anderen Variablen abhängen, es sei denn, diese Variable ist in ihrer Ausgabe in ihrem eigenen Teil definiert.
  • Keine Funktionen oder Programme können ihren eigenen Quellcode lesen.
  • Dies ist Code-Golf, der kürzeste Code (der die Ausgabe von A ist) in Bytes gewinnt.
jimmy23013
quelle
B ist im Allgemeinen immer noch unmöglich, da F möglicherweise nicht beendet wird, sowie in der Praxis in vielen Sprachen, da es Kombinationen von Fähigkeiten wie die vorübergehende Umleitung von stdout und entweder von Funktion zu Zeichenfolge oder von Ausführung erfordert. Das Beste, auf das Sie hoffen können, ist wahrscheinlich eine halbwegs funktionierende Lösung in einem LISP.
Peter Taylor
Wie würden Sie G mit allen Quines und Nicht-Quines überprüfen ? Ich arbeite derzeit an einer Mathematica-Lösung.
LegionMammal978
@PeterTaylor "Sie können auch annehmen, dass F und G, wenn sie mit gültigen Parametern aufgerufen werden, immer enden." Und "Ausgabe" kann Rückkehr bedeuten, nicht unbedingt auf Standard drucken.
Jimmy23013
@ LegionMammal978 Es ist unmöglich, alle Quines und Nicht-Quines zu überprüfen . Die Aufgabe von C ist jedoch einfacher, da Sie nur eine Quine und eine Nicht-Quine überprüfen müssen.
Jimmy23013
1
@PyRulez Ich denke, das ist im Geiste dieser Herausforderung, also werde ich es zulassen. Die Funktion kann jedoch nicht auf ihren eigenen Quellcode zugreifen.
Jimmy23013

Antworten:

1

CJam, 254 Bytes

Eine Beispielantwort, nicht Golf.

{{['{\"_~}{{[1$'{@\"_~}"{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}_``1>W<"\"]s\~=}_~}"@]s}_~}{{[1$'{@"_~}{{[\"_~}\"2$+'{@\"_~}\"]s`\"{{['{\\\\\"\+\"]s}_~}\"+~1$~{L}@~!&}_~}"]s\~=}_~}{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}

Die 3 Funktionen sind:

{{['{\"_~}{{[1$'{@\"_~}"{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}_``1>W<"\"]s\~=}_~}"@]s}_~}
{{[1$'{@"_~}{{[\"_~}\"2$+'{@\"_~}\"]s`\"{{['{\\\\\"\+\"]s}_~}\"+~1$~{L}@~!&}_~}"]s\~=}_~}
{{["_~}"2$+'{@"_~}"]s`"{{['{\\"\+"]s}_~}"+~1$~{L}@~!&}_~}

A und F nehmen keine Parameter und geben eine Zeichenfolge zurück. B, G und C nehmen einen CJam-Block als Parameter und geben 1 für wahr oder 0 für falsch zurück.

jimmy23013
quelle