背景
有两个人,比尔和约翰。其中一个是骑士,总是说出真相,另一个是小刀,总是说出谎言。您不知道谁是骑士,谁是骑士。然后每个人都说几句关于谁是小刀和谁是骑士。使用此信息,您必须得出结论,谁是骑士,谁是骑士。
的骑士和无赖逻辑问题是基于Booleen代数。一个人说的话构成了Booleen可满足性问题。骑士的陈述必须始终为false,其他骑士的陈述必须始终为true。
约翰说:“我既是个刀匠,比尔也是个刀匠”。如果约翰是骑士,那么这个说法将是错误的,因此他不能成为骑士。如果他是骑士,而比尔是骑士,那么即使第一部分是正确的,这个陈述仍然是错误的。所以,约翰是个k夫。
挑战
您面临的挑战是编写尽可能最短的程序,该程序将列出每个人的声明列表,并弄清楚谁是骑士,谁是骑士。有很多细节要介绍,因此在三个部分中描述了此问题。
输入值
输入将是两行,后跟一个换行符。每行将给出一个字符的名称,后跟一个冒号,然后是该人说的几句话。如果一个人是骑士,那么他所有的句子都是正确的,而所有那位知识分子的句子都是错误的。句子的第一个字母将始终大写,并且每个句子将以句号结尾。这是一个例子:
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.
解析中
每个句子至少包含一个从句。每个子句包含以下几项之一(希望您能理解我的表示法):
both [clause] and [clause]
either [clause] or [clause]
neither [clause] nor [clause]
[I am | (other person's name) is] a [knight | knave]
这是明确的,因为可以用类似于波兰表示法的方式来理解。这是一个句子的示例:
Both I am a knight and neither Steve is a knave nor I am a knave.
转换为Booleen代数很简单。“两个”语句都是AND,“两个”语句都是XOR,“两个”语句都是NOR。
(I am a knight) AND ((Steve is a knave) NOR (I am a knave))
输出量
输出将包含两行。每行包括一个人的名字(按顺序),然后说出他是骑士还是or夫。总会有一个骑士和一个刀法。这是以上示例的输出:
Joe is the knave.
Steve is the knight.
如果问题无法解决(您无法分辨谁是谁,或者没有解决方案),那么您的程序可以做任何事情,但不能产生有效的输出。
更多例子
输入值
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.
输出量
Sir Lancelot is the knight.
Merlin is the knave.
输入值
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.
输出量
David is the knave.
Patrick is the knight.
输入值
Lizard: I am a knight.
Spock: I am a knave.
一种可能的输出
Rock Paper Scissors
规则,条例和说明
- 适用标准守则的高尔夫球规则
- 您的程序只能由可打印的ASCII组成
- 所有输入和输出将来自STDIN和STDOUT