Un gráfico conectado es un gráfico que contiene una ruta entre dos vértices.
Desafío
Cree un circuito [compuerta NAND de 2 entradas] que determine si un gráfico de 4 vértices está conectado.
(Las 2 entradas de una compuerta pueden ser el mismo bit de entrada u otra compuerta).
Salida Verdadero si el gráfico está conectado y falso en caso contrario.
Entrada
Los seis bordes posibles de un gráfico simple con 4 vértices:
[ 0 e 1 , 0 e 2 , 1 e 2 , 0 e 3 , 1 e 3 , 2 e 3 ]
donde a e b representa si hay un borde entre los vértices a y b
La conectividad es equivalente a las siguientes condiciones:
Si menos de 3 entradas son verdaderas, entonces la salida es falsa.
Si más de 3 entradas son verdaderas, entonces la salida es verdadera.
Si exactamente 3 entradas son Verdaderas y forman un triángulo, entonces salen Falso.
De lo contrario, salida True.
La respuesta que usa la menor cantidad de puertas gana. Los empates se romperán por
la profundidad de circuito más baja (longitud de la ruta más larga desde la entrada a la salida).
0
y1
? ¿Qué hay de salida?Respuestas:
30 NANDS
En lugar de preguntar cuándo obtenemos un 1, hice la pregunta de cuándo obtenemos un 0. Es mejor preguntarlo de esta manera porque hay menos 0 que 1.
Aquí está la distribución según el número de aristas (sexta fila del triángulo de Pascal)
Al hacer la pregunta de esta manera, obtenemos el siguiente diagrama y expresión
Suponemos que la salida será predeterminada a 1, pero cambiará a 0 en cualquiera de las siguientes condiciones
1.A 0 para tres bordes adyacentes (prueba 3 entradas)
2.A 0 para dos pares de bordes opuestos (prueba 4 entradas)
Los términos anteriores ya están ordenados de la manera que les permitirá agruparse de la siguiente manera. (Por cierto, esta versión de la expresión es rotacionalmente simétrica respecto al vértice AFB).
La puntuación para cada
&
o|
se coloca debajo del símbolo y se justifica de la siguiente manera:Nivel 0: Invertimos en un inversor para cada entrada: 6 NANDS
Nivel 1: Podemos construir un OR a partir de una puerta NAND colocando un inversor en la entrada (un total de 3 NANDS) pero como ya invertimos en 6 NANDS en el paso anterior, podemos hacer 7 puertas OR a partir de 7 puertas NAND. También necesitamos 3 puertas Y. Para estos, solo usaremos NAND y dejaremos la salida invertida. 10 NANDS
Nivel 2: Nuevamente construimos 4 puertas OR a partir de puertas NAND. En cada caso tenemos 1 entrada desde una puerta OR, por lo que tenemos que invertir eso. Pero la otra entrada ya está invertida (proveniente de una de las NAND en el paso anterior que corresponde a un
&
símbolo en tres casos, y de un inversor en el último), por lo que solo necesitamos 2 puertas para cada funcionalidad OR. 4 * 2 = 8Nivel 3: ahora necesitamos Y las cuatro salidas juntas. Esto requiere 3 compuertas AND, cada una construida a partir de 2 NAND, 3 * 2 = 6
Eso es un total de 30 puertas NAND, con una profundidad máxima de 2 + 2 + 4 = 8 NAND para ramas con un
|
nivel 1 o 3 + 1 + 4 = 8 NAND para ramas con un&
nivel 1.El siguiente script de Ruby confirma visualmente que la expresión anterior es válida.
fuente
19 NANDs
No hay un circuito más simple que este.
Hay un código para probarlo debajo de la imagen. En cuanto a entenderlo, eso es difícil. Hay un par de puertas IF allí, y las entradas se agrupan en un triángulo con las líneas de esquina libres agregadas para el análisis una por una, pero no de una manera simple. Si alguien logra entenderlo, quedaré impresionado.
Código Verilog con pruebas:
Kim Øyhus
fuente
Mathematica, 17 puertasSimplemente enumeramos todas las reglas, construimos la función booleana y la minimizamos en
NAND
forma.Resultado :
, donde
#1...#6
hay 6 espacios para argumentos.Casos de prueba :
fuente
not (p&q&r)
? ¿Qué significa el resultado final y final?p⊼q⊼r
significa(p⊼q)⊼r
, que es equivalente a!(p&&q&&r)
.(p⊼q)⊼r
no es equivalente a!(p&&q&&r)
.64 NANDs
Los seis bordes se pueden dividir en tres pares de bordes opuestos. Para que se conecte un gráfico, debe haber dos bordes opuestos, así como un tercer borde, o tres bordes conectados al mismo vértice.
Los pares opuestos son UX, VY, WZ, entonces:
Construyendo puertas AND y OR de la manera usual, el número total de puertas utilizadas es
3*3+7*3+34
= 64.fuente