Hintergrund
Es gibt zwei Leute, Bill und John. Einer von ihnen ist ein Ritter, der immer die Wahrheit sagt, und der andere ist ein Schurke, der immer eine Lüge erzählt. Sie wissen nicht, wer der Ritter und wer der Schurke ist. Jede Person sagt dann mehrere Aussagen darüber, wer der Schurke und wer der Ritter ist. Anhand dieser Informationen müssen Sie feststellen, wer der Ritter und wer der Schurke ist.
Das logische Problem von Knights and Knaves basiert auf der Booleen-Algebra. Die Worte, die eine Person sagt, bilden ein boolesches Erfüllbarkeitsproblem. Die Aussagen des Schurken müssen immer falsch sein und die Aussagen des anderen Ritters müssen immer wahr sein.
John sagt: "Beide, ich bin ein Schurke und Bill ist ein Schurke." Wenn John der Ritter wäre, wäre diese Aussage falsch, also kann er nicht der Ritter sein. Wenn er der Schurke und Bill der Ritter wäre, wäre diese Aussage immer noch falsch, auch wenn der erste Teil wahr ist. Also ist John der Schurke.
Die Herausforderung
Ihre Herausforderung besteht darin, das kürzestmögliche Programm zu schreiben, das eine Liste der Aussagen jeder Person enthält und herausfindet, wer der Schurke und wer der Ritter ist. Es gibt viele Details zu behandeln, daher wird dieses Problem in drei Abschnitten beschrieben.
Eingang
Die Eingabe erfolgt in zwei Zeilen, gefolgt von einer neuen Zeile. Jede Zeile enthält den Namen eines der Zeichen, gefolgt von einem Doppelpunkt, gefolgt von mehreren Sätzen dieser Person. Wenn eine Person der Ritter ist, sind alle seine Sätze wahr, und alle Sätze des Schurken sind falsch. Der erste Buchstabe eines Satzes wird immer groß geschrieben, und jeder Satz endet mit einem Punkt. Hier ist ein Beispiel:
Joe: Both I am a knight and neither Steve is a knave nor I am a knave.
Steve: Joe is a knave. Either Joe is a knight or I am a knight.
Parsing
Jeder Satz besteht aus mindestens einer Klausel. Jede Klausel enthält eines von mehreren Dingen (hoffentlich können Sie meine Notation verstehen):
both [clause] and [clause]
either [clause] or [clause]
neither [clause] nor [clause]
[I am | (other person's name) is] a [knight | knave]
Dies ist eindeutig, da es in ähnlicher Weise wie die polnische Notation verstanden werden kann. Hier ist ein Beispiel eines Satzes:
Both I am a knight and neither Steve is a knave nor I am a knave.
Die Übersetzung in die Booleen-Algebra ist unkompliziert. Die "beide" Anweisungen sind UND-Anweisungen, die "entweder" -Anweisungen sind XOR-Anweisungen und die "keine" -Anweisungen sind NOR-Anweisungen.
(I am a knight) AND ((Steve is a knave) NOR (I am a knave))
Ausgabe
Die Ausgabe besteht aus zwei Zeilen. Jede Zeile besteht aus dem Namen einer Person (in der richtigen Reihenfolge) und sagt dann aus, ob sie der Ritter oder der Schurke ist. Es wird immer einen Ritter und einen Schurken geben. Hier ist die Ausgabe für das obige Beispiel:
Joe is the knave.
Steve is the knight.
Wenn das Problem unlösbar ist (entweder können Sie nicht sagen, wer was ist, oder es gibt keine Lösung), kann Ihr Programm alles tun, AUSSER eine gültige Ausgabe erzeugen.
Mehr Beispiele
Eingang
Sir Lancelot: Either both I am a knight and Merlin is a knave or both I am a knave and Merlin is a knight.
Merlin: Either both I am a knight and Sir Lancelot is a knight or both I am a knave and Sir Lancelot is a knave.
Ausgabe
Sir Lancelot is the knight.
Merlin is the knave.
Eingang
David: Neither I am a knave nor Patrick is a knight. Either I am a knight or Patrick is a knave.
Patrick: Either I am a knight or both I am a knight and David is a knight.
Ausgabe
David is the knave.
Patrick is the knight.
Eingang
Lizard: I am a knight.
Spock: I am a knave.
Eine mögliche Ausgabe
Rock Paper Scissors
Regeln, Vorschriften und Hinweise
- Es gelten die Standard-Code-Golfregeln
- Ihr Programm darf nur aus druckbarem ASCII bestehen
- Alle Ein- und Ausgaben erfolgen von STDIN und STDOUT
quelle
Antworten:
Python, 491 Zeichen
Konvertiert jede Zeile in einen Python-Ausdruck und entwickelt ihn weiter.
Der Schurke und der Ritter werden mit 0 und 1 bewertet. Für die beiden Personen versuchen wir beide Optionen.
Zum Beispiel
Joe: Steve is a knave
wirdJoe==(Steve==knave)
. Auf diese WeiseJoe
ist das Ergebnis eines Schurken nur dann wahr, wenn er lügt.Sie bekommen hässliche Fehler, wenn es unmöglich oder unentschlossen ist. Wenn unmöglich,
r[0]
liegt ein Indexfehler vor, weilr
leer ist. Wenn eine Verkettungr[1:]
mit einer Liste von Zeichenfolgen nicht möglich ist, kann dies zu Problemen führen.quelle
Ruby, 352 Zeichen
Die Lösung wurde ziemlich lang, so dass es möglicherweise noch Platz zum Golfspielen gibt. Die Eingabe muss wohlgeformt sein (wie in allen obigen Beispielen - aber versuchen Sie nicht, eine Person mit "Beide" zu benennen ...).
quelle
Perl - 483 Bytes
Ähnlich wie bei der Python-Lösung. Es reduziert die Sätze auf Perl-Code und
eval
s sie dann. Es kann eine fast gültige Ausgabe drucken, wenn die Eingabe seltsam ist, aber es wird nichts gedruckt, wenn es nicht entscheidbar ist. Gut geformte Eingabe funktioniert wie erwartet. Die Sätze werden in Anführungszeichen in der Befehlszeile übergeben, und es sind keine speziellen Flags erforderlich.quelle