Il existe 16 fonctions booléennes distinctes pour deux variables binaires, A et 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'opérateur less than <
, qui n'est normalement pas considéré comme un opérateur logique comme NOT, AND ou OR, est en fait l'une de ces fonctions (F4) lorsqu'il est appliqué à des valeurs booléennes:
A B | A < B
-----------
0 0 | 0
0 1 | 1
1 0 | 0
1 1 | 0
Fait intéressant, nous pouvons simuler l' une des 15 autres fonctions en utilisant des expressions qui ne contiennent que les symboles ()<AB10
. Ces expressions sont lues et évaluées comme elles le seraient dans de nombreux langages de programmation standard, par exemple, les parenthèses doivent correspondre et <
doivent avoir des arguments de chaque côté.
Plus précisément, ces expressions doivent respecter la grammaire suivante (donnée sous forme Backus-Naur ):
element ::= A | B | 1 | 0
expression ::= element<element | (expression)<element | element<(expression) | (expression)<(expression)
Cela signifie que les paréthèses et expressions inutiles de la forme A<B<1
ne sont pas autorisées.
L'expression A<B
correspond donc à la fonction F4 et A<B<1
doit être remplacée par (A<B)<1
ou A<(B<1)
.
Pour prouver que les 15 autres fonctions peuvent être transformées en expressions, il suffit de former un ensemble d'expressions fonctionnellement complet , car alors, par définition, elles peuvent être composées en expressions pour n'importe quelle fonction.
Un tel ensemble d'expressions est x<1
(où x
est A
ou B
), qui est ¬x
, et (((B<A)<1)<A)<1
qui est A → B
. La négation ( ¬
) et l'implication ( →
) sont connues pour être fonctionnellement complètes.
Défi
À l'aide des caractères ()<AB10
, écrivez 16 expressions sous la forme décrite ci-dessus qui sont équivalentes à chacune des 16 fonctions booléennes distinctes.
L'objectif est de rendre chacune des expressions aussi courte que possible. Votre score est la somme du nombre de caractères dans chacune de vos 16 expressions. Le score le plus bas l'emporte. Tiebreaker passe à la première réponse (à condition qu'ils n'aient pas modifié leur réponse plus tard avec des expressions plus courtes empruntées à quelqu'un d'autre).
Techniquement, vous n'avez pas besoin d'écrire de code réel pour ce concours, mais si vous avez écrit des programmes pour vous aider à générer les expressions, vous êtes fortement encouragés à les publier.
Vous pouvez utiliser cet extrait de pile pour vérifier si vos expressions font ce qui est attendu: