これはcode-golfです。
この課題では、「Knights and Knaves」パズルを解決するプログラム/関数を作成します。
バックグラウンド
あなたは島にいることに気づく...など...あなた以外の島にいる人は皆、騎士か悪魔のいずれかです。
騎士は真の発言のみを行うことができます。
Knavesは虚偽のステートメントのみを作成できます。
「ステートメント」を厳密に定義したくありませんが、ステートメントは「true」または「false」のいずれかであると言います。これは逆説的な文章を除外することに注意してください。
この挑戦の目的のために、あなたは島民のグループに出くわします。彼らはあなたに声明を出します。
あなたの仕事は誰が騎士で誰がKnaveであるかを決定することです。
入力:
次の情報が(合理的な形式で)提供されます。
出席者のリスト。大文字のアルファベット文字「AZ」で名前が付けられます。これにより課せられる人数の制限を超えることはありません。
各人が行う声明。これに関する重要な詳細については、以下を参照してください。
出力
次に、各人が何であるかを(合理的な形式で)出力します。例えば、そこにあれば選手だったA B C DとA騎士ですが、残りknavesである、あなたは出力ができました
A: 1
B: 0
C: 0
D: 0
重要な詳細:
大文字のアルファベットA〜Zは島民を指します。
文字
0(ゼロ)と1(1)は、それぞれ「Knave」と「Knight」を表します。(指定する限り、他の2つの非AZ文字を使用できます)出席している各島民は、自然な数の発言を行うか、何も言わないことを選択する場合があります。
通常の論理演算子はステートメントで使用できます(IS *、AND、OR、NOT)。これに加えて、De Morganの法則と条件式を使用できます。以下は、音声パズルでどのように表示されるか、その後にプログラムに入力される方法の例です。
(*より技術的な注意。「IS」演算子は実際には封じ込めとして使用されます(論理演算子ではありません)。「Aは騎士です」と言うとき、私は本当に「AはKnights」。使用される真の演算子は「ϵ」です。簡単にするために、代わりに「=」を使用します。)
私は以下を使用します(合理的で一貫性がある限り、何でも使用できます)。
^そしてvまたは=IS~ない=>実装X:X人は...
人Zは、次のタイプのステートメントの任意の組み合わせを作成できます。
人Zは言う...
人Aは騎士です。
Z: A = 1人物QはKnaveです。
Z: Q = 0私は騎士です。
Z: Z = 1人Aは騎士、または人Bは騎士です。
Z: ( A = 1 ) v ( B = 1)人Cは騎士であり、私はKnaveです。
Z: ( C = 1 ) ^ ( Z = 0 )人Rは騎士ではありません。
Z: ~( R = 1 )
さらに、入力にはDe Morganの法則を使用することもできます
人物Aと人物Bの両方がKnavesであることは真実ではありません
Z: ~( ( A = 0 ) ^ ( B = 0 ) )人Aまたは人Bのいずれかが騎士であることは誤りです
Z: ~( ( A = 1 ) v ( B = 1) )
最後に、条件とその否定を使用できます
私が騎士なら、人BはKnaveです
Z: ( Z = 1 ) => ( B = 0 )人物Bが騎士である場合、人物CがKnaveであるというのは事実ではありません。
Z: ~( ( B = 1 ) => ( C = 0 ) )
条件に関する注意
詳細については、ウィキペディアをご覧ください。
条件文はp => qの形式を取ります。ここで、pとqはそれ自体が文です。pは「前件」、qは「後件」です。ここにいくつかの有用な情報があります
条件の否定は次のようになります。〜(p => q)はp ^〜qと同等です
誤った前提は何でも意味します。つまり、pがfalseの場合、qが何であるかに関係なく、ステートメントp => qはtrue です。たとえば、「if 2 + 2 = 5 then I am Spiderman」は本当の声明です。
いくつかの簡単なテストケース
これらのケースは、次のように与えられます(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はKnaveです。
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の両方が騎士だというのは事実ではありません。
Q:それは本当です。
X:Wの言うことが本当なら、Qの言うことは偽です。
回答:
WとQは騎士です。XはKnaveです。
入力
Q X W
W: ~( ( Q = 1 ) ^ ( X = 1 ) )
Q: W = 1
X: ( W = 1 ) => ( Q = 0 )
出力
W = 1 Q = 1 X = 0
ある 同様の課題の解析と条件またはド・モルガンのが含まれていないに焦点を当てた3年前からは。したがって、私は、これがだまされないように焦点と実装が十分に異なると主張します。
この挑戦はだまされたため一時的に終了しました。それ以来再開されました。
この課題は、まず焦点が異なると主張します。他の課題は英語の構文解析に焦点を当てていますが、これはそうではありません。次に、ANDとORのみを使用しますが、これは条件を使用し、さらに多くのパズルを解くことができます。結局のところ、問題はそのチャレンジからの答えをこれに簡単に置き換えることができるかどうかであり、条件と条件否定を含めると、より堅牢な変更を順番に行う必要がある十分な複雑さが追加されると思いますこの課題に合わせて。
ORである可能性があるA:1 B:1かA:1 B:0、B=1Aがtrueのままである可能性があります。
(B=1)^(C=1)条件文が正常に扱われる方法に従って
(B=1)=>(C=0)ますか?~((B=1)=>(C=0))または(B=1)=>(C=1)他の何か?