Es gibt 16 verschiedene Boolesche Funktionen für zwei Binärvariablen, A und B:
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
Der less than-Operator <
, der normalerweise nicht als logischer Operator wie NOT, AND oder OR aufgefasst wird, ist tatsächlich eine der folgenden Funktionen (F4), wenn er auf boolesche Werte angewendet wird:
A B | A < B
-----------
0 0 | 0
0 1 | 1
1 0 | 0
1 1 | 0
Interessanterweise können wir jede der 15 anderen Funktionen mit Ausdrücken simulieren , die nur die Symbole enthalten ()<AB10
. Diese Ausdrücke werden wie in vielen Standard-Programmiersprachen gelesen und ausgewertet, z. B. müssen Klammern übereinstimmen und <
Argumente auf beiden Seiten enthalten.
Insbesondere müssen diese Ausdrücke der folgenden Grammatik entsprechen (in Backus-Naur-Form angegeben ):
element ::= A | B | 1 | 0
expression ::= element<element | (expression)<element | element<(expression) | (expression)<(expression)
Dies bedeutet, dass nutzlose Parethesen und Ausdrücke des Formulars A<B<1
nicht erlaubt sind.
Der Ausdruck A<B
entspricht also der Funktion F4 und A<B<1
muss in (A<B)<1
oder geändert werden A<(B<1)
.
Um zu beweisen, dass alle 15 anderen Funktionen in Ausdrücke umgewandelt werden können, genügt es, eine Menge von Ausdrücken zu bilden, die funktional vollständig sind , da sie dann per Definition zu Ausdrücken für jede Funktion zusammengesetzt werden können.
Eine solche Menge von Ausdrücken ist x<1
(wo x
ist A
oder B
), was ist ¬x
und (((B<A)<1)<A)<1
was ist A → B
. Negation ( ¬
) und Implication ( →
) sind bekanntermaßen funktional vollständig.
Herausforderung
()<AB10
Schreiben Sie unter Verwendung der Zeichen 16 Ausdrücke in der oben beschriebenen Form, die jeder der 16 verschiedenen Booleschen Funktionen entsprechen.
Ziel ist es, jeden Ausdruck so kurz wie möglich zu halten. Ihre Punktzahl ist die Summe der Anzahl der Zeichen in jedem Ihrer 16 Ausdrücke. Die niedrigste Punktzahl gewinnt. Tiebreaker geht zur frühesten Antwort über (vorausgesetzt, sie haben ihre Antwort später nicht mit kürzeren Ausdrücken bearbeitet, die von jemand anderem stammen).
Sie müssen technisch gesehen keinen echten Code für diesen Wettbewerb schreiben. Wenn Sie jedoch Programme geschrieben haben, die Sie beim Generieren der Ausdrücke unterstützen, wird dringend empfohlen, diese zu veröffentlichen.
Mit diesem Stack-Snippet können Sie überprüfen, ob Ihre Ausdrücke den Erwartungen entsprechen: