Подключенный граф представляет собой график , который содержит путь между любыми двумя вершинами.
Вызов
Создайте схему [2-входной NAND-gate], которая определяет, подключен ли 4-вершинный граф.
(2 входа шлюза могут быть одним и тем же входным битом или другим вентилем.)
Выведите True, если граф подключен, и False в противном случае.
вход
Шесть возможных ребер простого графа с 4 вершинами:
[ 0 e 1 , 0 e 2 , 1 e 2 , 0 e 3 , 1 e 3 , 2 e 3 ]
где a e b представляет, есть ли ребро между вершинами a и b
Связность эквивалентна следующим условиям:
Если менее 3 входов имеют значение True, выведите False.
Если более 3 входов имеют значение True, выведите True.
Если ровно 3 входа имеют значение True и они образуют треугольник, выведите False.
В противном случае выведите True.
Ответ, который использует наименьшее количество ворот, побеждает. Связи будут разорваны по
наименьшей глубине цепи (длина самого длинного пути от входа до выхода).
0
и как1
? Как насчет вывода?Ответы:
30 NANDS
Вместо того, чтобы спрашивать, когда мы получим 1, я задал вопрос, когда мы получим 0. Лучше задать это так, потому что меньше 0, чем 1.
Вот распределение по количеству ребер (6 ряд треугольника Паскаля)
Задавая вопрос таким образом, мы получаем следующую диаграмму и выражение
Мы предполагаем, что выход будет по умолчанию 1, но изменится на 0 при любом из следующих условий
1.A 0 для трех смежных ребер (тест 3 входа)
2.A 0 для двух противоположных пар ребер (тест 4 входа)
Вышеуказанные условия уже упорядочены таким образом, чтобы их можно было сгруппировать, как показано ниже. (Кстати, эта версия выражения является вращательно-симметричной относительно вершины AFB.)
Оценка для каждого
&
или|
ставится ниже символа и обосновывается следующим образом:Уровень 0: Мы инвестируем в инвертор для каждого входа: 6 NANDS
Уровень 1: Мы можем построить ИЛИ из логического элемента NAND, поставив инвертор на входе (всего 3 NANDS), но, как мы уже вложили в 6 NANDS на предыдущем шаге, мы можем сделать 7 вентилей ИЛИ из 7 вентилей NAND. Нам также нужны 3 И ворота. Для этого мы просто будем использовать NAND и оставить выход инвертированным. 10 NANDS
Уровень 2: Снова мы строим 4 ИЛИ ворота от NAND. В каждом случае у нас есть 1 вход от логического элемента ИЛИ, поэтому мы должны инвертировать его. Но другой вход уже инвертирован (поступающий от одного из NAND на предыдущем шаге, который соответствует
&
символу в трех случаях, и от инвертора на последнем), поэтому нам нужны только 2 вентиля для каждой функциональности ИЛИ. 4 * 2 = 8Уровень 3: Теперь нам нужно И четыре выхода вместе. Для этого требуется 3 элемента И, каждый из которых состоит из 2 NAND, 3 * 2 = 6
Это в общей сложности 30 вентилей NAND, с максимальной глубиной 2 + 2 + 4 = 8 NAND для ветвей с
|
уровнем 1 или 3 + 1 + 4 = 8 NAND для веток с&
уровнем 1.Следующий скрипт Ruby визуально подтверждает, что приведенное выше выражение является допустимым.
источник
19 NANDS
Нет более простой схемы, чем эта.
Ниже приведен код для тестирования. Что касается понимания, это сложно. Там есть пара шлюзов ПЧ, и входы в некотором роде сгруппированы в треугольник с линиями свободного угла, добавленными для анализа одна за другой, но не простым способом. Если кому-то удастся это понять, я буду впечатлен.
Verilog код с тестированием:
Ким Ойхус
источник
Mathematica, 17 воротМы просто перечисляем все правила, конструируем логическую функцию и минимизируем ее по
NAND
форме.Результат :
где
#1...#6
6 слотов для аргументов.Тестовые случаи :
источник
not (p&q&r)
? Что означает ваш результат?p⊼q⊼r
означает(p⊼q)⊼r
, что эквивалентно!(p&&q&&r)
.(p⊼q)⊼r
это не эквивалентно!(p&&q&&r)
.64 NANDS
Шесть ребер можно разделить на три пары противоположных ребер. Для связности графа должны быть либо два противоположных ребра, либо третье ребро, либо три ребра, соединенные с одной и той же вершиной.
Противоположные пары - UX, VY, WZ, поэтому:
Построение вентилей И и ИЛИ обычным способом, общее количество используемых шлюзов
3*3+7*3+34
= 64.источник