Codegolf: Quine und Antiquine


13

Diese Herausforderung ähnelt Can you Meta Quine?

Ein Quine ist ein Programm, das sich auf STDOUT selbst produziert. Diese Herausforderung besteht darin, ein Programm A zu erzeugen, das beim Ausführen ein Programm B auf STDOUT erzeugt. Programm B erzeugt beim Ausführen Programm A auf STDOUT. Programme A und B müssen in derselben Sprache geschrieben sein (und in derselben Sprache ausgeführt werden). Die verknüpfte Frage beschränkte A! = B. Das sah zu einfach aus. Für diese Frage bestehen wir also darauf, dass A und B Antiquitäten sind, wobei die folgenden Regeln angewendet werden:

  1. Die Programme A und B dürfen nicht dieselben Zeichen verwenden, außer für Leerzeichen und Anweisungstrennzeichen sowie Interpunktionszeichen.
  2. Programme A und B müssen jeweils mindestens ein Zeichen enthalten, das weder ein Leerzeichen noch ein Anweisungstrennzeichen oder ein Interpunktionszeichen ist.
  3. Für die Zwecke der Regeln 1 und 2 schließt der Begriff "Leerzeichen" jedes Symbol oder jede Folge von Symbolen aus, bei denen es sich um eine Anweisung, einen Operator oder ein Symbol handelt, die (im Gegensatz zu einem Trennzeichen) interpretiert werden. Daher gibt es in der Whitespace-Sprache kein Whitespace.
  4. Ein Anweisungstrennzeichen ist ein syntaktisches Element, das üblicherweise in der Sprache zum Trennen von Anweisungen verwendet wird. Dies würde den Zeilenumbruch in Python oder das Semikolon in Java, Perl oder C einschließen.
  5. Ein Satzzeichen ist ein ASCII - Zeichen , die weder Leerzeichen ist noch in der Zeichenklasse POSIX Wortes (dh ein Unterstrich ist nicht Interpunktion für diesen Zweck) - also ispunct()zurückkehren würde wahr, und es ist nicht _.
  6. Programm A muss beim Ausführen ein Programm (Programm B) auf seinem STDOUT erzeugen, das beim Ausführen wiederum Programm A erzeugt.
  7. Programme A und B müssen in derselben Programmiersprache sein.
  8. Die verwendete Programmiersprache muss tatsächlich eine Programmiersprache sein. Sofern Sie nichts anderes vorbringen, schlage ich vor, dass Turing vollständig ist.
  9. Mindestens eine von A und B muss mindestens eine Anweisung innerhalb der Sprache ausführen.

Dies ist Codegolf, daher gewinnt die kürzeste Antwort, wobei die Punktzahl die Länge von Programm A in Bytes ist (dh die Länge von Programm B ist nicht relevant).


Können Sie der Liste der Ausnahmen in der ersten Klausel bitte "Interpunktion" hinzufügen? Es ist unmöglich, diese Aufgabe in vielen Sprachen zu lösen (insbesondere in den Sprachen, in denen Sie in der Hauptfunktion geschweifte Klammern benötigen).
FUZxxl

verwandt, aber wahrscheinlich ausreichend unterschiedlich.
Martin Ender

@FUZxxl Ich habe Satzzeichen zugelassen, aber Unterstriche ausgeschlossen.
abligh

1
Für die Zwecke hier sind Aund aandere „Zeichen“ in Betracht gezogen?
HostileFork sagt nicht SE

1
Es wäre besser, wenn Sie eine vollständige Liste der ASCII-Zeichen
bereitstellen

Antworten:


5

GolfScript, 13 Bytes

1{\~\".~"}.~

Die Ausgabe ist

-2{\~\".~"}.~

das erzeugt das anfängliche Programm.

Die Byteanzahl enthält die nachgestellte LF, da die Ausgabe der Ausgabe diese enthält.

Probieren Sie es online aus.

Wie es funktioniert

1       # Push 1.
{       # Start code block.
  \~\   # Apply logical NOT to the second topmost element of the stack.
  ".~"  # Push that string.
}       # End code block.
.~      # Duplicate the code block and execute the copy.

GolfScript druckt den Inhalt des Stapels nach Beendigung.


Bitte lesen Sie die Problembeschreibung noch einmal -Programs A and B may not use any of the same characters, save for whitespace and statement separators, and punctuation characters.
isaacg 18.08.14

1
Alles andere als 1und 2ist Interpunktion.
Dennis

OK, die Regeln wurden geändert, seit ich sie das letzte Mal gelesen habe.
Isaacg

Ja, das funktioniert. Ich hatte die Regeln formuliert, um zu verhindern, dass Leerzeichen als Anweisungen verwendet werden, aber ich hatte vergessen, dass dieselbe Lücke für die Zeichensetzung vorhanden sein würde. Also Gesetzeslücke ausgenutzt.
abligh

14

Pascal (731 Zeichen)

Programm A:

program s;{$h+}uses sysutils;const p='program s;{$h+}uses sysutils;const p=';a='a';aa=''';';aaa='a=''';aaaa='''';aaaaa='begin write(lowercase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),''lower''+''c'',''tm''+''p'',[]),''up''+''c'',''lower''+''c'',[]),''tm''+''p'',''up''+''c'',[])+aa+aaaaa))end.';begin write(upcase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),'lower'+'c','tm'+'p',[]),'up'+'c','lower'+'c',[]),'tm'+'p','up'+'c',[])+aa+aaaaa))end.

Ausgabeprogramm B:

PROGRAM S;{$H+}USES SYSUTILS;CONST P='PROGRAM S;{$H+}USES SYSUTILS;CONST P=';A='A';AA=''';';AAA='A=''';AAAA='''';AAAAA='BEGIN WRITE(UPCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),''LOWER''+''C'',''TM''+''P'',[]),''UP''+''C'',''LOWER''+''C'',[]),''TM''+''P'',''UP''+''C'',[])+AA+AAAAA))END.';BEGIN WRITE(LOWERCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),'LOWER'+'C','TM'+'P',[]),'UP'+'C','LOWER'+'C',[]),'TM'+'P','UP'+'C',[])+AA+AAAAA))END.

Ausgabeprogramm A.


3
Ich genieße den (falschen) Gebrauch der Fallübersetzung.
abligh

11

ROT13 ( konkurriert nach Regelaktualisierung nicht mehr )

Ich bin mir nicht sicher, ob dies als Sprache zählt, aber ich habe die Herausforderung mit Sicherheit nicht gemeistert. In der Regel werden auch Antworten für bestimmte Dienstprogramme sedakzeptiert. Es ist jedoch ein Urteilsspruch, also wenn es nicht zählt, werde ich es entfernen (gibt es irgendwo eine Metadiskussion darüber, was als Sprache zählt? Bearbeiten: Es gibt jetzt )

A

Zyklen zwischen Aund N:

~>> echo "A" | rot13
N
~>> echo "A" | rot13 | rot13
A

Ich denke, das funktioniert nicht, da rot13 einfach Eingaben übernimmt STDINund kein Programm ausführt. Wenn Sie behaupten, dass es sich um ein Nulllängenprogramm handelt, wird Regel 2 nicht erfüllt. Das Programm (mit sed) ist das, was übergeben wird sed -e. Wenn dies akzeptabel wäre, catwäre es ein Quin und tacwäre es ein Quin und ein Antiquum. Allerdings produziert nichts , um die Quelle zu cat, tacoder was das betrifft rot13.
abligh

@abligh Wenn rot13 die Sprache ist, warum sollte ich den Quellcode für rot13 drucken müssen? Wenn ich Golfscript, Python oder etwas anderes verwende, gebe ich wahrscheinlich nur den Quellcode über stdin oder file an das Programm weiter, so dass es keinen wirklichen Unterschied gibt. In diesem Fall rot13 ist der Dolmetscher.
Ingo Bürk

rot13Als Programmiersprache scheint sie keiner vernünftigen Definition von „Programmiersprache“ zu genügen, und sie interpretiert nichts. Ich werde die Frage ändern, um dies klarer zu machen.
abligh

Für mich in Ordnung. Ich lasse diese Antwort als nicht mehr konkurrierend und beginne eine Metadiskussion. Übrigens eine schöne Herausforderung. Ich kann es kaum erwarten, "echte" Lösungen zu sehen!
Ingo Bürk
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.