sfondo
Ci sono due persone, Bill e John. Uno di questi è un cavaliere, che dice sempre la verità, e l'altro è un furfante, che dice sempre una bugia. Non sai chi è il cavaliere e chi è il furfante. Ogni persona poi dice diverse affermazioni su chi è il furfante e chi è il cavaliere. Usando queste informazioni, devi giungere a una conclusione su chi è il cavaliere e chi è il furfante.
Il problema logico di Knights and Knaves si basa sull'algebra di Booleen. Le parole che una persona dice formano un problema di soddisfacibilità di Booleen. Le dichiarazioni del furfante devono essere sempre false e le dichiarazioni dell'altro cavaliere devono essere sempre vere.
John dice "Entrambi io sono un furfante e Bill è un furfante". Se Giovanni fosse il cavaliere, questa affermazione sarebbe falsa, quindi non può essere il cavaliere. Se fosse il furfante e Bill il cavaliere, questa affermazione sarebbe ancora falsa, anche se la prima parte è vera. Quindi, John è il furfante.
La sfida
La tua sfida è quella di scrivere il programma più breve possibile che prenderà un elenco di dichiarazioni fatte da ogni persona e capirà chi è il furfante e chi è il cavaliere. Ci sono molti dettagli da trattare, quindi questo problema è descritto in tre sezioni.
Ingresso
L'input sarà composto da due righe seguite da una nuova riga. Ogni riga darà il nome di uno dei personaggi, seguito da due punti, seguito da diverse frasi dette da quella persona. Se una persona è il cavaliere, allora tutte le sue frasi saranno vere e tutte le frasi del furfante saranno false. La prima lettera di una frase sarà sempre in maiuscolo e ogni frase terminerà con un punto. Ecco un esempio:
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
Ogni frase è composta da almeno una clausola. Ogni clausola contiene una delle diverse cose (speriamo che tu possa capire la mia notazione):
both [clause] and [clause]
either [clause] or [clause]
neither [clause] nor [clause]
[I am | (other person's name) is] a [knight | knave]
Questo è inequivocabile perché può essere compreso in un modo simile alla notazione polacca. Ecco un esempio di una frase:
Both I am a knight and neither Steve is a knave nor I am a knave.
La traduzione in algebra di Booleen è semplice. Le istruzioni "both" sono AND, le istruzioni "ither "sono XOR e le istruzioni" none "sono NOR.
(I am a knight) AND ((Steve is a knave) NOR (I am a knave))
Produzione
L'output sarà composto da due righe. Ogni riga è composta dal nome di una persona (in ordine) e quindi indica se è il cavaliere o il furfante. Ci saranno sempre un cavaliere e un furfante. Ecco l'output per l'esempio sopra:
Joe is the knave.
Steve is the knight.
Se il problema è irrisolvibile (o non si può dire chi è cosa, o non esiste una soluzione), il programma può fare qualsiasi cosa TRANNE produrre un output valido.
Più esempi
Ingresso
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.
Produzione
Sir Lancelot is the knight.
Merlin is the knave.
Ingresso
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.
Produzione
David is the knave.
Patrick is the knight.
Ingresso
Lizard: I am a knight.
Spock: I am a knave.
Un possibile output
Rock Paper Scissors
Regole, regolamenti e note
- Si applicano le regole standard per il golf
- Il tuo programma deve essere composto solo da ASCII stampabile
- Tutti gli ingressi e le uscite provengono da STDIN e STDOUT