2つのバイナリ変数AとBには、16の異なるブール関数があります。
A B | F0 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | F13 | F14 | F15
-----------------------------------------------------------------------------------------
0 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1
0 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1
1 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1
1 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1
オペレータ未満<
、通常は、NOTなどの論理演算子として考え、AND、またはORされていない、ブール値に適用されるこれらの機能(F4)の実際のいずれかであります:
A B | A < B
-----------
0 0 | 0
0 1 | 1
1 0 | 0
1 1 | 0
興味深いことに、シンボルのみを含む式を使用して、他の15個の関数のいずれかをシミュレートできます()<AB10
。これらの式は、多くの標準プログラミング言語の場合と同じように読み取られ、評価されます。たとえば、括弧は一致する<
必要があり、その両側に引数が必要です。
具体的には、これらの式は次の文法(Backus-Naur形式で指定)に準拠する必要があります。
element ::= A | B | 1 | 0
expression ::= element<element | (expression)<element | element<(expression) | (expression)<(expression)
これは、無駄な形式や形式の表現がA<B<1
許可されないことを意味します。
したがって、式A<B
は関数F4と一致し、or A<B<1
に変更する必要があります。(A<B)<1
A<(B<1)
他の15個の関数すべてを式に変換できることを証明するには、機能的に完全な式のセットを形成するだけで十分です。定義により、それらは任意の関数の式に合成できるからです。
このような式のセットの1つはx<1
(where x
is A
またはB
)、つまり¬x
、および(((B<A)<1)<A)<1
、ですA → B
。否定(¬
)と含意(→
)は機能的に完全であることが知られています。
チャレンジ
文字を使用して()<AB10
、16の異なるブール関数のそれぞれに相当する上記の形式で16の式を記述します。
目標は、各式をできるだけ短くすることです。スコアは、16個の式それぞれの文字数の合計です。最も低いスコアが勝ちます。Tiebreakerは最も早い回答に進みます(他の人から取得した短い表現で後で回答を編集しなかった場合)。
このコンテストのために技術的にコードを記述する必要はありませんが、式の生成に役立つプログラムを作成した場合は、それらを投稿することを強くお勧めします。
このスタックスニペットを使用して、式が期待どおりに動作するかどうかを確認できます。