論理ステートメントのセットが提供されます。あなたの課題は、他のものと矛盾するものを削除することですが、最適な方法で(つまり、最小限のステートメントを削除することです)。
チャレンジ
ステートメントのリストを入力として受け取り、ソリューションがあるように最小限のステートメントを削除して残りを出力するプログラムまたは関数を作成します。
論理
ステートメントは、変数 A-Zとそれらの間の演算子で構成されます。
5つの演算子があります:-(not)、v(or)、^(and)、->(if)、および<->(iff)。
真理値表:
A | B | -A | AvB | A^B | A->B | A<->B
0 | 0 | 1 | 0 | 0 | 1 | 1
0 | 1 | 1 | 1 | 0 | 1 | 0
1 | 0 | 0 | 1 | 0 | 0 | 0
1 | 1 | 0 | 1 | 1 | 1 | 1
これらの演算子は括弧で結合できます():
A | B | -(AvB) | Av(-A) | A^(-A) | (AvB)->(-B)
0 | 0 | 1 | 1 | 0 | 1
0 | 1 | 0 | 1 | 0 | 0
1 | 0 | 0 | 1 | 0 | 1
1 | 1 | 0 | 1 | 0 | 0
論理システムは、1つ以上のステートメントで構成されます。
溶液のロジックシステムは、すべての状態である文が同時に真です。
論理システムの例:
AvB
-(A<->B)
(AvB)->(-B)
唯一の解決策はA = 1, B = 0です。
A^B
-(B<->A)
これには解決策がありません。の組み合わせはなくA、B両方のステートメントが真です。
入力
入力として一連のステートメントを受け取ります。これは、(便利な形式の)配列または改行で区切られた、またはスペースで区切られた文字列としてフォーマットされた、STDINまたは関数の引数を介して取得できます。
ステートメントは次の形式になります(ほぼABNFで)。
statement = variable / operation
operation = not-operation / binary-operation
not-operation = "-" operand
binary-operation = operand binary-operator operand
operand = variable / "(" operation ")"
variable = "A"-"Z"
binary-operator = "v" / "^" / "->" / "<->"
ステートメントの例:
A
Av(-B)
(A<->(Q^C))v((-B)vH)
出力
受け取った正確な形式で(場合によっては)縮小されたステートメントのセットを返す必要があります。繰り返しになりますが、リストは文字列の配列または改行で区切られた文字列またはスペースで区切られた文字列としてフォーマットできます。
ルール
- 常に最小限のステートメントを削除する必要があります。考えられる解決策が複数ある場合は、そのうちの1つを出力します。
- 入力には常に少なくとも1つのステートメントが含まれ、入力ではステートメントが繰り返されないと想定できます。
- 出力に常にステートメントが含まれるとは限りません。(例を参照)
- 標準の抜け穴を使用すると、答えが有効であることに矛盾するため、それらの1つを削除する必要があります。
- これはcode-golfであるため、バイト単位の最短回答が優先されます。
例
入力:
A^(-A)
出力:
(nothing)
入力:
A^B A<->(-B) A<->B
出力:
A^B A<->B
入力:
["AvB","A^B"]
出力:
["AvB","A^B"]
3
これが関連するかどうかはわかりませんが、この問題は、NP完全な最大セットパッキングに帰着します。
—
レイフウィラーツ
あなたの文法によると、例の3番目のステートメントは正しくありません(そうである
—
誇りに思ってhaskeller
(AvB)->-B必要があります(AvB)->(-B))
@proudhaskellerありがとう、それを修正しました。
—
PurkkaKoodari
また、の括弧
—
誇りに思ってhaskeller
A<->(Q^C))v((-B)vHはミッシュマッシュです。
@proudhaskeller再びありがとう。
—
PurkkaKoodari