这是代码高尔夫球。
在这个挑战中,我们将编写解决“ 骑士与刀 ”难题的程序/功能。
背景
您发现自己在一个岛上……等等。岛上除您以外的每个人都是骑士或is 夫。
骑士只能发表真实的声明。
刀只能做出虚假陈述。
我不想严格定义“语句”,但是我们要说一个语句是“ true”或“ false”的任何内容。请注意,这不包括矛盾的句子。
为了这个挑战,您将遇到一群岛民。他们会向您陈述。
您的任务是确定谁是骑士和谁是K夫。
输入:
您将(以任何合理的格式)获得以下信息:
在场人员清单。它们将以大写字母字符“ AZ”命名。由此所施加的人数限制不会被超过。
每个人的陈述。有关此的重要详细信息,请参见下文。
输出量
然后,您将输出(以任何合理的格式)每个人的身份。例如,如果有玩家A B C D并且A是骑士,而其他人是骑士,则可以输出
A: 1
B: 0
C: 0
D: 0
重要细节:
大写字母字符AZ表示岛民。
字符
0(零)和1(一)分别表示“刀”和“骑士”。(您可以指定任意两个其他非AZ字符)在场的每个岛民都可以发表任何自然数的陈述,或者可以选择不说话。
普通逻辑运算符可以在语句(IS *,AND,OR,NOT)中使用。最重要的是,可以使用De Morgan的法律和条件。下面是如何在口语难题中呈现它们的示例,然后是如何将其输入到程序中的示例。
(*在更多技术说明上。“ IS”运算符实际上用作遏制(这不是逻辑运算符)。当我说“ A是骑士”时,我的意思是“ A是该集合的成员。 Knights”。使用的真正运算符为'ϵ'。为简单起见,我们将改用'='。)
我使用以下方法(只要合理且一致,您可以使用任何方法):
^和v要么=是~不=>暗示X:X人声称...
Z人可以将以下任何类型的陈述进行任意组合:
Z人说...
人A是骑士。
Z: A = 1人Q是个n夫。
Z: Q = 0我是骑士
Z: Z = 1人A是骑士,人B是骑士。
Z: ( A = 1 ) v ( B = 1)C人是一名骑士,我是一名n夫。
Z: ( C = 1 ) ^ ( Z = 0 )R人不是骑士。
Z: ~( R = 1 )
最重要的是,输入也可以使用De Morgan定律
人A和人B都是小刀是不正确的
Z: ~( ( A = 0 ) ^ ( B = 0 ) )人A或人B是骑士是错误的
Z: ~( ( A = 1 ) v ( B = 1) )
最后,可以使用条件及其取反
如果我是骑士,那么人B是K夫
Z: ( Z = 1 ) => ( B = 0 )如果人B是一个骑士,那么人C是一个n夫,这是不正确的。
Z: ~( ( B = 1 ) => ( C = 0 ) )
条件注释
查阅Wikipedia了解更多信息。
条件语句的形式为p => q,其中p和q本身就是语句。p是“前人”,q是“后人”。这是一些有用的信息
条件的否定看起来像这样:〜(p => q)等效于p ^〜q
错误的前提意味着任何东西。即:如果p为假,则无论q是什么,任何语句p => q为真。例如:“如果2 + 2 = 5,那么我就是蜘蛛侠”是正确的说法。
一些简单的测试用例
这些情况以以下方式给出:(1)我们将如何在语音中提出问题(2)我们如何将其提出给计算机(3)计算机可能给出的正确输出。
A人和B人在路上接近您,并作以下陈述:
A:B是个小刀,或者我是个骑士。
B:A是骑士。
回答:
B是骑士,A是骑士。
输入:
A B # Cast of Characters
A: ( B = 0 ) v ( A = 1)
B: A = 1
输出:
A = 1 B = 1
A,B和F人在路上接近您并作以下陈述:
A:如果我是骑士,那么B是个K夫。
B:如果这是真的,那么F也是一个Knave。
回答:
A是骑士,B是骑士,F是骑士。
输入值
A B F
A: ( A = 1 ) => ( B = 0 )
B: ( A = 1 ) => ( F = 0 )
输出:
A = 1 B = 0 F = 1
Q,X和W在路上接近您,并做出以下陈述:
W:Q和X都是骑士,这是不对的。
问:是的。
X:如果W所说的是正确的,那么Q所说的是错误的。
回答:
W和Q是骑士。X是个n夫。
输入值
Q X W
W: ~( ( Q = 1 ) ^ ( X = 1 ) )
Q: W = 1
X: ( W = 1 ) => ( Q = 0 )
输出量
W = 1 Q = 1 X = 0
3年前有一个 类似的挑战,它着重于分析并且不包含条件或De Morgan的挑战。因此,我认为,在重点和实施上有足够的不同,可以避免这种欺骗。
这项挑战作为骗局被暂时关闭。此后已重新打开。
我声称,首先,这一挑战的重点不同。另一个挑战集中在英语解析上,而事实并非如此。其次,它仅使用AND和OR,而使用条件条件并允许解决更多难题。归根结底,问题是该挑战的答案是否可以轻而易举地替代这一挑战,我相信加入条件和条件否定会增加足够的复杂性,因此需要进行更强大的更改才能进行以应对这一挑战。
OR,它可能是A:1 B:1或A:1 B:0因为B的B=1可能是假的,而一个仍然是正确的。
(B=1)^(C=1)与通常处理条件的方式相同
(B=1)=>(C=0)?~((B=1)=>(C=0))还是(B=1)=>(C=1)其他?