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:
la source
(0, 0, 0, 1, 0, 1, 1, 0)
et(0, 1, 1, 0, 1, 0, 0, 0)
.Réponses:
100 caractères
la source
Il y a quelques options pour certains d'entre eux, donc cet ensemble de 100 caractères n'est pas identique à ceux précédemment publiés.
Une preuve plus simple et
<
fonctionnellement complète serait celle quiA<(B<1)
donne NOR.Le code que j'ai utilisé pour trouver ceci est une simplification lourde d'un code d'optimisation booléen que j'ai utilisé sur des défis précédents, avec deux petits changements:
la source
A<B<1
ne sont pas autorisées. " Si oui, vérifiez les horodatages: c'était une modification effectuée après cette réponse.100 caractères
la source
100 caractères
Hé, ce n'est pas exactement la même chose que les autres. J'ai passé environ 10 minutes là-dessus donc ça vaut quand même la peine de poster, même si c'est 2 ans.
la source
100 caractères
la source