Drei gegenseitige Quines

23

Die Aufgabe

In dieser Herausforderung besteht Ihre Aufgabe darin, drei Programme zu schreiben, die eine Art gemeinsames quine-ähnliches System bilden. Nennen wir die Programme A, Bund C. Wenn eines der Programme die Quelle eines anderen Programms als Eingabe erhält, gibt es die Quelle des dritten Programms aus. Wenn zum Beispiel als Eingabe angegeben wird, Awird ausgegeben . Wenn die Programme ihre eigene Quelle als Input gegeben sind, werden sie geben die drei Saiten , und (ohne Anführungszeichen). In allen Fällen kann eine weitere nachgestellte Zeile ausgegeben werden. Für alle anderen Eingaben können die Programme alles tun, einschließlich Absturz.BC"three""mutual""quines"

Beispiel

Angenommen, dass die Quellcodes A, Bund Csind aSdf, ghJkund zxcV. Dann sollten sich die Programme wie folgt verhalten.

Source Input  Output
--------------------
aSdf   aSdf   three
aSdf   ghJk   zxcV
aSdf   zxcV   ghJk
ghJk   aSdf   zxcV
ghJk   ghJk   mutual
ghJk   zxcV   aSdf
zxcV   aSdf   ghJk
zxcV   ghJk   aSdf
zxcV   zxcV   quines

Regeln und Wertung

Die Lösungen A, Bund Ckönnen entweder Funktionen oder vollständige Programme sein, aber sie müssen vollkommen unabhängig sein: kein gemeinsamer Code erlaubt ist. Es gelten Standardlücken und Quine-Regeln , so dass die Programme in keiner Weise auf ihre eigenen Quellcodes zugreifen können.

Ihr Ergebnis ist die kombinierte Bytezahl A, Bund Cniedrigere Punktzahl besser zu sein.

Zgarb
quelle
Was bedeutet genau "kein gemeinsam genutzter Code ist erlaubt"? Können sie nicht ähnliche Teile haben? (Dies würde die Beantwortung in Java erschweren, da die meisten Programme public static void mainirgendwo einen Teil haben.) Oder nur, dass Sie keine Funktion schreiben können, die von allen drei aufgerufen wird?
Paŭlo Ebermann
@ PaŭloEbermann Es bedeutet letzteres: Jedes der 3 Programme sollte für sich funktionieren.
Zgarb,

Antworten:

16

CJam, 165 147 114 108 99 Bytes

2 _ri^_q+@"quinesmutualthree"6/=?
1 _ri^_q+@"quinesmutualthree"6/=?
3 _ri^_q+@"quinesmutualthree"6/=?

Vielen Dank an @ MartinBüttner für einen Vorschlag, der dazu beigetragen hat, 48 Bytes zu sparen!

Versuchen Sie es online in dem CJam Dolmetscher .

Nachprüfung

$ cat A
2 _ri^_q+@"quinesmutualthree"6/=?
$ cat B
1 _ri^_q+@"quinesmutualthree"6/=?
$ cat C
3 _ri^_q+@"quinesmutualthree"6/=?
$ 

$ cjam A < A
three
$ cjam A < B
3 _ri^_q+@"quinesmutualthree"6/=?
$ cjam A < C
1 _ri^_q+@"quinesmutualthree"6/=?
$ 

$ cjam B < A
3 _ri^_q+@"quinesmutualthree"6/=?
$ cjam B < B
mutual
$ cjam B < C
2 _ri^_q+@"quinesmutualthree"6/=?
$ 

$ cjam C < A
1 _ri^_q+@"quinesmutualthree"6/=?
$ cjam C < B
2 _ri^_q+@"quinesmutualthree"6/=?
$ cjam C < C
quines

Idee

Die Menge {0, 1, 2, 3} ist eine Gruppe unter der Operation ^ (binäres exklusives ODER), wobei jedes Element seine eigene Inverse ist.

Wenn alle drei Programme bis auf das erste Zeichen (ein Element von {0, 1, 2, 3} ) identisch sind , können wir sie leicht unterscheiden und ausdrucken:

  • Wir beginnen mit der XOR-Verknüpfung der Ziffer am Anfang des Quellcodes und der Eingabe.

  • Wenn das Ergebnis 0 ist , stimmen Quelle und Eingabe überein.

    Daher drucken wir eines der drei Wörter, die durch diese gemeinsame Ziffer ausgewählt werden.

  • Wenn das Ergebnis nicht 0 ist , befindet sich das Element von {1, 2, 3} weder in der Quelle noch in der Eingabe.

    Daher drucken wir es aus, gefolgt vom Rest der Eingabe.

Wie es funktioniert

2                                  e# Push the number N on the stack.
  _                                e# Push a copy.
    r                              e# Read a token from STDIN, i.e., the input up
                                   e# to and excluding the next whitespace char.
     i                             e# Cast to integer.
      ^                            e# XOR it with the copy of N. Result: X
       _                           e# Push a copy of the result.
        q+                         e# Append the rest of the input.
          @                        e# Rotate N on top of the stack.
           "quinesmutualthree"6/   e# Push ["quines" "mutual" "three"].
                                =  e# Select the word at index N.
                                 ? e# If X is non-zero, select the modified input;
                                   e# otherwise, select the word.
Dennis
quelle
2
Wow, ich habe die Frage gelesen und dachte, "niemand wird eine Antwort dafür finden." Dann schaute ich nach unten und sah eine Antwort von Dennis (wer sonst?) +1!
Level River St