Esistono 16 funzioni booleane distinte per due variabili binarie, A e 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
L'operatore minore di <
, che normalmente non è considerato un operatore logico come NOT, AND o OR, è in effetti una di queste funzioni (F4) quando applicata a valori booleani:
A B | A < B
-----------
0 0 | 0
0 1 | 1
1 0 | 0
1 1 | 0
È interessante notare che possiamo simulare una qualsiasi delle altre 15 funzioni usando espressioni che contengono solo i simboli ()<AB10
. Queste espressioni vengono lette e valutate come in molti linguaggi di programmazione standard, ad esempio le parentesi devono corrispondere e <
devono avere argomenti su entrambi i lati.
Nello specifico, queste espressioni devono rispettare la seguente grammatica (indicata in forma di Backus-Naur ):
element ::= A | B | 1 | 0
expression ::= element<element | (expression)<element | element<(expression) | (expression)<(expression)
Ciò significa che A<B<1
non sono consentite inutili paretesi ed espressioni del modulo .
Quindi l'espressione A<B
corrisponde alla funzione F4 e A<B<1
deve essere cambiata in (A<B)<1
o A<(B<1)
.
Per dimostrare che tutte le 15 altre funzioni possono essere trasformate in espressioni, è sufficiente formare un insieme di espressioni funzionalmente complete , perché quindi, per definizione, possono essere composte in espressioni per qualsiasi funzione.
Una di queste serie di espressioni è x<1
(dove x
è A
o B
), che è ¬x
e (((B<A)<1)<A)<1
che è A → B
. Negazione ( ¬
) e implicazione ( →
) sono noti per essere funzionalmente completi.
Sfida
Usando i caratteri ()<AB10
, scrivi 16 espressioni nella forma sopra descritta che sono equivalenti a ciascuna delle 16 distinte funzioni booleane.
L'obiettivo è rendere ciascuna delle espressioni il più breve possibile. Il tuo punteggio è la somma del numero di caratteri in ciascuna delle tue 16 espressioni. Vince il punteggio più basso. Tiebreaker arriva alla prima risposta (a condizione che non abbiano modificato la loro risposta in seguito con espressioni più brevi prese da qualcun altro).
Tecnicamente non è necessario scrivere alcun codice reale per questo concorso, ma se hai scritto programmi per aiutarti a generare le espressioni, sei fortemente incoraggiato a pubblicarle.
Puoi utilizzare questo frammento di stack per verificare se le tue espressioni fanno ciò che è previsto: