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:
quelle
(0, 0, 0, 1, 0, 1, 1, 0)
und(0, 1, 1, 0, 1, 0, 0, 0)
.Antworten:
100 Zeichen
quelle
Für einige von ihnen gibt es einige Optionen, sodass dieses 100-Zeichen-Set nicht mit den zuvor veröffentlichten identisch ist.
Ein einfacherer Beweis, der
<
funktional vollständig ist, wäre, dassA<(B<1)
NOR ergibt.Der Code, den ich verwendet habe, um dies zu finden, ist eine starke Vereinfachung eines Booleschen Optimierungscodes, den ich bei früheren Herausforderungen verwendet habe, mit zwei kleinen Änderungen:
quelle
A<B<1
nicht zulässig sind. " Beziehen . Wenn ja, überprüfen Sie die Zeitstempel: das war eine nach dieser Antwort vorgenommene Bearbeitung .100 Zeichen
quelle
100 Zeichen
Hey, es ist nicht genau dasselbe wie die anderen. Ich habe ungefähr 10 Minuten damit verbracht, es lohnt sich also trotzdem etwas zu posten, auch wenn dies 2 Jahre alt ist.
quelle
100 Zeichen
quelle