Un graphique connecté est un graphique qui contient un chemin entre deux sommets.
Défi
Créez un circuit [porte NAND à 2 entrées] qui détermine si un graphe à 4 sommets est connecté.
(Les 2 entrées d'une porte peuvent être le même bit d'entrée ou une autre porte.)
Sortie True si le graphique est connecté, et False sinon.
Contribution
Les six arêtes possibles d'un graphe simple à 4 sommets:
[ 0 e 1 , 0 e 2 , 1 e 2 , 0 e 3 , 1 e 3 , 2 e 3 ]
où a e b représente s'il y a une arête entre les sommets a et b
La connectivité équivaut aux conditions suivantes:
Si moins de 3 entrées sont True, la sortie est False.
Si plus de 3 entrées sont True, la sortie True.
Si exactement 3 entrées sont vraies et qu'elles forment un triangle, sortez False.
Sinon, affichez True.
La réponse qui utilise le moins de portes gagne. Les liens seront rompus par
la profondeur de circuit la plus faible (longueur du ou des chemins les plus longs de l'entrée à la sortie).
0
et1
? Qu'en est-il de la sortie?Réponses:
30 NANDS
Au lieu de demander quand obtenons-nous un 1, j'ai posé la question quand obtenons-nous un 0. Il vaut mieux le poser de cette façon car il y a moins de 0 que de 1.
Voici la distribution en fonction du nombre d'arêtes (6ème ligne du triangle pascal)
En posant la question de cette façon, nous obtenons le diagramme et l'expression suivants
Nous supposons que la sortie sera par défaut à 1, mais passera à 0 dans l'une des conditions suivantes
1.A 0 pour trois bords adjacents (test de 3 entrées)
2.A 0 pour deux paires de bords opposés (test de 4 entrées)
Les conditions ci-dessus sont déjà commandées de la manière qui leur permettra d'être regroupées comme ci-dessous. (Soit dit en passant, cette version de l'expression est symétrique en rotation par rapport au sommet AFB.)
Le score pour chacun
&
ou|
est placé sous le symbole et justifié comme suit:Niveau 0: Nous investissons dans un onduleur pour chaque entrée: 6 NANDS
Niveau 1: Nous pouvons construire un OU à partir d'une porte NAND en mettant un onduleur à l'entrée (total 3 NANDS) mais comme nous avons déjà investi dans 6 NANDS à l'étape précédente, nous pouvons faire 7 portes OU à partir de 7 portes NAND. Nous avons également besoin de 3 portes ET. Pour ceux-ci, nous allons simplement utiliser des NAND et laisser la sortie inversée. 10 NANDS
Niveau 2: Encore une fois, nous construisons 4 portes OU à partir de portes NAND. Dans chaque cas, nous avons 1 entrée d'une porte OU, nous devons donc inverser cela. Mais l'autre entrée est déjà inversée (provenant de l'une des NAND à l'étape précédente qui correspond à un
&
symbole dans trois cas, et d'un inverseur dans le dernier), nous n'avons donc besoin que de 2 portes pour chaque fonctionnalité OR. 4 * 2 = 8Niveau 3: Nous devons maintenant ET les quatre sorties ensemble. Cela nécessite 3 portes ET, chacune construite à partir de 2 NAND, 3 * 2 = 6
Cela représente un total de 30 portes NAND, avec une profondeur maximale de 2 + 2 + 4 = 8 NAND pour les branches avec un
|
niveau 1 ou 3 + 1 + 4 = 8 NAND pour les branches avec un&
niveau 1.Le script Ruby suivant confirme visuellement que l'expression ci-dessus est valide.
la source
19 NAND
Il n'y a pas de circuit plus simple que cela.
Il y a du code pour le tester sous l'image. Quant à le comprendre, c'est difficile. Il y a quelques portes IF là-bas, et les entrées sont un peu regroupées dans un triangle avec les lignes de coin libres ajoutées pour l'analyse une par une, mais pas de manière simple. Si quelqu'un parvient à le comprendre, je serai impressionné.
Code Verilog avec test:
Kim Øyhus
la source
Mathematica, 17 portesNous énumérons simplement toutes les règles, construisons la fonction booléenne et la minimisons sous
NAND
forme.Résultat :
, où
#1...#6
sont 6 emplacements pour les arguments.Cas de test :
la source
not (p&q&r)
? Que signifie le résultat final de votre résultat?p⊼q⊼r
signifie(p⊼q)⊼r
, ce qui équivaut à!(p&&q&&r)
.(p⊼q)⊼r
n'est pas équivalent à!(p&&q&&r)
.64 NAND
Les six bords peuvent être divisés en trois paires de bords opposés. Pour qu'un graphe soit connecté, il doit y avoir soit deux arêtes opposées ainsi qu'une troisième arête, soit trois arêtes connectées au même sommet.
Les paires opposées sont UX, VY, WZ, donc:
Construire des portes ET et OU de la manière habituelle, le nombre total de portes utilisées est
3*3+7*3+34
= 64.la source