Логические ворота вручную


13

Сделайте программу, которая имитирует основные логические элементы.

Ввод: слово из заглавных букв, за которым следуют 2 однозначные двоичные числа, разделенные пробелами, например OR 1 0. Ворота OR, AND, NOR, NAND, XOR, и XNORнеобходимы.

Выходные данные: Какой выходной сигнал введенного логического элемента будет иметь два числа: 1 или 0.

Примеры:
AND 1 0 становится 0
XOR 0 1становится 1
OR 1 1становится 1
NAND 1 1становится0

Это Codegolf, поэтому выигрывает самый короткий код.


Можем ли мы принять массив в качестве входных данных?
Quintec

нет @Quintec вы не можете
qazwsx

3
Можем ли мы вывести как True / False?
xnor

5
уверен @xnor (также актуальное имя пользователя)
qazwsx

Ответы:



29

Python 2 , 38 байт

lambda s:sum(map(ord,s))*3%61%37%9%7%2

Попробуйте онлайн!

Хорошая цепочка по модулю применяется к сумме значений ASCII входной строки, создавая решение, которое просто подходит. Общее значение ASCII отличается для каждого возможного входа, за исключением того, что они имеют 0 1и 1 0дают одинаковый результат, что получается потому, что все используемые логические элементы симметричны.

*3Выделяется в противном случае-смежные значения для входов , которые отличаются только в битах, так как это делает его трудно для мод цепи дробить. Длина и размер чисел в цепочке модов создает примерно правильное количество энтропии для 18 бинарных выходов.

Более короткое решение, безусловно, возможно с использованием hash(s)или id(s), но я избегал их, потому что они зависят от системы.


Python 2 , 50 байт

lambda s:'_AX0NRD'.find((s*9)[35])>>s.count('0')&1

Попробуйте онлайн!

Несколько более принципиальное решение. Каждый логический вентиль дает различный результат для каждого счетчика нулей на входе, кодируемый как трехбитовое число от 1 до 6. Каждый возможный логический вентиль сопоставляется с соответствующим числом путем взятия (s*9)[35], которые все различны. Поскольку OR, это завершает чтение одного из битов, чтобы символ мог быть 0или 1, но оказывается, что он работает, чтобы проверить, если это так 0, и a 1в 1любом случае правильно даст результат.


Черт, я искал свои собственные значения модов, но вы меня опередили. Записали ли вы свои стратегии для этого где угодно, потому что мои методы грубой силы, как правило, занимают очень много времени
Джо Кинг,

2
@JoKing Я сделал в основном полную грубую силу *a%b%c%d%e%2, ничего действительно умного. Единственной интересной вещью было ставить *перед модами; Я не пробовал другие форматы.
xnor

Вау, это просто ошеломляет! Я даже не ожидаю, что метод, подобный хэшу, сделает это. Могу ли я сделать 45-байтовый порт JS вашего ответа ?
Шиеру Асакото

@ShieruAsakoto Определенно, пойти на это.
xnor

1
@xnor Я использовал тот же метод, что и вы, поэтому я не буду чувствовать себя нормально, публикуя его самостоятельно, но это может быть 36 байт .
Недла2004

10

JavaScript (ES6), 39 байт

s=>341139>>parseInt(btoa(s),34)%86%23&1

Попробуйте онлайн!

Как?

Мы не можем анализировать пробелы parseInt(), независимо от того, с какой базой мы работаем. Таким образом, вместо этого мы вводим представление base-64 входной строки. Это может генерировать =символы заполнения (которые не могут быть проанализированы сparseInt() ни одним из них), но эти гарантированно находятся в конце строки и могут быть безопасно проигнорированы.

348623[0..19]18

 input      | to base-64     | parsed as base-34 | mod 86 | mod 23 | output
------------+----------------+-------------------+--------+--------+--------
 "AND 0 0"  | "QU5EIDAgMA==" |  1632500708709782 |   26   |    3   |    0
 "AND 0 1"  | "QU5EIDAgMQ==" |  1632500708709798 |   42   |   19   |    0
 "AND 1 0"  | "QU5EIDEgMA==" |  1632500708866998 |   34   |   11   |    0
 "AND 1 1"  | "QU5EIDEgMQ==" |  1632500708867014 |   50   |    4   |    1
 "OR 0 0"   | "T1IgMCAw"     |     1525562056532 |   52   |    6   |    0
 "OR 0 1"   | "T1IgMCAx"     |     1525562056533 |   53   |    7   |    1
 "OR 1 0"   | "T1IgMSAw"     |     1525562075028 |   58   |   12   |    1
 "OR 1 1"   | "T1IgMSAx"     |     1525562075029 |   59   |   13   |    1
 "XOR 0 0"  | "WE9SIDAgMA==" |  1968461683492630 |   48   |    2   |    0
 "XOR 0 1"  | "WE9SIDAgMQ==" |  1968461683492646 |   64   |   18   |    1
 "XOR 1 0"  | "WE9SIDEgMA==" |  1968461683649846 |   56   |   10   |    1
 "XOR 1 1"  | "WE9SIDEgMQ==" |  1968461683649862 |   72   |    3   |    0
 "NAND 0 0" | "TkFORCAwIDA=" | 61109384461626344 |   62   |   16   |    1
 "NAND 0 1" | "TkFORCAwIDE=" | 61109384461626350 |   70   |    1   |    1
 "NAND 1 0" | "TkFORCAxIDA=" | 61109384461665650 |   64   |   18   |    1
 "NAND 1 1" | "TkFORCAxIDE=" | 61109384461665656 |   72   |    3   |    0
 "NOR 0 0"  | "Tk9SIDAgMA==" |  1797025468622614 |   76   |    7   |    1
 "NOR 0 1"  | "Tk9SIDAgMQ==" |  1797025468622630 |    6   |    6   |    0
 "NOR 1 0"  | "Tk9SIDEgMA==" |  1797025468779830 |   84   |   15   |    0
 "NOR 1 1"  | "Tk9SIDEgMQ==" |  1797025468779846 |   14   |   14   |    0
 "XNOR 0 0" | "WE5PUiAwIDA=" | 66920415258533864 |    0   |    0   |    1
 "XNOR 0 1" | "WE5PUiAwIDE=" | 66920415258533870 |    8   |    8   |    0
 "XNOR 1 0" | "WE5PUiAxIDA=" | 66920415258573170 |    2   |    2   |    0
 "XNOR 1 1" | "WE5PUiAxIDE=" | 66920415258573176 |   10   |   10   |    1

: o короче портированного ответа
Shieru Asakoto

Но ... кажется, не работает NOR?
Шиеру Асакото

@ShieruAsakoto Спасибо, что заметили. Я просто забыл NOR. Сейчас исправлено.
Арнаулд

6

CJam (13 байт)

q1bH%86825Yb=

Предполагается, что ввод без завершающей строки.

Набор онлайн-тестов

Это простой хеш, который отображает 24 возможных входа в 17 различных, но согласованных значений, а затем просматривает их в сжатой таблице.

Python 2 (36 байт)

lambda s:76165>>sum(map(ord,s))%17&1

Это просто порт ответа CJam выше. Тестовый набор с использованием среды тестирования xnor.


4

05AB1E , 13 12 10 8 байт

ÇO₁*Ƶï%É

Порт альтернативного расчета @mazzy, упомянутый в комментарии к его ответу Powershell ( *256%339%2вместо *108%143%2).

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

Ç            # Convert each character in the (implicit) input to a unicode value
 O           # Sum them together
  ₁*         # Multiply it by 256
    Ƶï%      # Then take modulo-339
        É    # And finally check if it's odd (short for %2), and output implicitly

Посмотрите эту подсказку 05AB1E (раздел Как сжать большие целые числа? ), Чтобы понять, почему Ƶïэто так 339.


3

Древесный уголь , 32 байта

§01÷⌕⪪”&⌈4Y⍘LH⦄vü|⦃³U}×▷” S∨⁺NN⁴

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение: Сжатая строка расширяется до списка поддерживаемых операций, так что индекс данной операции затем сдвигается вправо в соответствии с входными данными, и извлеченный таким образом бит становится результатом.

XOR     001
AND     010
OR      011
NOR     100
NAND    101
XNOR    110
inputs  011
        010

74-байтовая версия работает для всех 16 бинарных операций, которые я произвольно назвал следующим образом: НОЛЬ И МЕНЬШЕ ВТОРОЕ БОЛЬШОЕ ПЕРВЫЙ XOR ИЛИ NOR XNOR ПЕРВЫЙ NGREATER NSECOND NLESS NAND NZERO.

§10÷÷⌕⪪”&↖VρS´↥cj/v⊗J[Rf↓⪫?9KO↘Y⦄;↙W´C>η=⁴⌕✳AKXIB|⊖\`⊖:B�J/≧vF@$h⧴” S∨N²∨N⁴

Попробуйте онлайн! Ссылка на подробную версию кода.


+1 Скорее впечатлен полными 16 операционными программами!
theREALyumdub

3

Mathematica, 55 байт

Symbol[ToCamelCase@#][#2=="1",#3=="1"]&@@StringSplit@#&

Чистая функция. Принимает строку как ввод и возвращает Trueили Falseкак вывод. Так как Or, And, Nor, Nand, Xor, и Xnorвсе встроенные модули, мы используем , ToCamelCaseчтобы изменить оператор в Паскале случае, преобразовать его в эквивалентный символ, и применить его к двум аргументам.


3

J , 21 байт

2|7|9|37|61|3*1#.3&u:

Попробуйте онлайн!

Порт решения xnor's Python 2 .


J , 30 байт

XNOR=:=/
NAND=:*:/
NOR=:+:/
".

Попробуйте онлайн!

Некоторые немного удовольствия с Eval ".и стандартной библиотеки (которая уже включает в себя правильно AND, OR, XOR).


J , 41 байт

({7 6 9 8 14 1 b./)~1 i.~' XXNNA'E.~_2&}.

Попробуйте онлайн!

Более J-стиль подхода.

Как это устроено

Очень общий трюк J спрятан здесь. Часто желаемая функция имеет структуру «Делай F на одном входе, делай H на другом, а затем делай G на обоих результатах». Тогда это должно работать как (F x) G H y. В молчаливой форме это эквивалентно (G~F)~H:

x ((G~F)~H) y
x (G~F)~ H y
(H y) (G~F) x
(H y) G~ F x
(F x) G H y

Если Gэто асимметричный примитив, просто поменяйте местами левый и правый аргументы целевой функции, и мы можем сохранить байт.

Теперь перейдем к ответу выше:

({7 6 9 8 14 1 b./)~1 i.~' XXNNA'E.~_2&}.

1 i.~' XXNNA'E.~_2&}.  Processing right argument (X): the operation's name
                _2&}.  Drop two chars from the end
1 i.~' XXNNA'E.~       Find the first match's index as substring
                       Resulting mapping is [OR, XOR, XNOR, NOR, NAND, AND]

7 6 9 8 14 1 b./  Processing left argument (Y): all logic operations on the bits
7 6 9 8 14 1 b.   Given two bits as left and right args, compute the six logic functions
               /  Reduce by above

X{Y  Operation on both: Take the value at the index

Подумайте о том, чтобы опубликовать трюк с советами по игре в гольф, если вы этого еще не сделали. Аккуратные вещи. Также я большой поклонник решения eval.
Коул

3

Powershell, 36 34 байта

Вдохновлен xnor , но последовательность *108%143%2короче оригинала*3%61%37%9%7%2

$args|% t*y|%{$n+=108*$_};$n%143%2

Тестовый скрипт:

$f = {

 $args|% t*y|%{$n+=108*$_};$n%143%2
#$args|% t*y|%{$n+=3*$_};$n%61%37%9%7%2   # sequence by xnor

}

@(
    ,("AND 0 0", 0)
    ,("AND 0 1", 0)
    ,("AND 1 0", 0)
    ,("AND 1 1", 1)
    ,("XOR 0 0", 0)
    ,("XOR 0 1", 1)
    ,("XOR 1 0", 1)
    ,("XOR 1 1", 0)
    ,("OR 0 0", 0)
    ,("OR 0 1", 1)
    ,("OR 1 0", 1)
    ,("OR 1 1", 1)
    ,("NAND 0 0", 1)
    ,("NAND 0 1", 1)
    ,("NAND 1 0", 1)
    ,("NAND 1 1", 0)
    ,("NOR 0 0", 1)
    ,("NOR 0 1", 0)
    ,("NOR 1 0", 0)
    ,("NOR 1 1", 0)
    ,("XNOR 0 0", 1)
    ,("XNOR 0 1", 0)
    ,("XNOR 1 0", 0)
    ,("XNOR 1 1", 1)

) | % {
    $s,$e = $_
    $r = &$f $s
    "$($r-eq$e): $s=$r"
}

Выход:

True: AND 0 0=0
True: AND 0 1=0
True: AND 1 0=0
True: AND 1 1=1
True: XOR 0 0=0
True: XOR 0 1=1
True: XOR 1 0=1
True: XOR 1 1=0
True: OR 0 0=0
True: OR 0 1=1
True: OR 1 0=1
True: OR 1 1=1
True: NAND 0 0=1
True: NAND 0 1=1
True: NAND 1 0=1
True: NAND 1 1=0
True: NOR 0 0=1
True: NOR 0 1=0
True: NOR 1 0=0
True: NOR 1 1=0
True: XNOR 0 0=1
True: XNOR 0 1=0
True: XNOR 1 0=0
True: XNOR 1 1=1

1
Вы терпите *16%95%7%2неудачу для XNORслучаев, все же. Вы можете использовать @ nedla2004 «s*6%68%41%9%2 , что 2 байта короче @xnor » ы один, хотя.
Кевин Круйссен,

1
Благодарность!!!! Я добавил xnor. Я думаю, что *108%143это более привлекательным :) Кроме того, есть хорошая пара *256%339. Эта пара еще лучше для языков, которые умеют работать с битами и байтами.
Маззи

1
Ах, хорошо! Порт из вашего ответа также сохраняет 2 байта в моем ответе Java . :) И это 10- байтовая альтернатива для моего ответа 05AB1E с помощью *256%339.
Кевин Круйссен

3

Perl 6 , 20 байт

*.ords.sum*108%143%2

Попробуйте онлайн!

Подход порта Мэдди . В качестве альтернативы *256%339%2также работает.

Perl 6 , 24 байта

*.ords.sum*3%61%37%9%7%2

Попробуйте онлайн!

Порт ответа от xnor . Я попытаюсь найти более короткий, но я думаю, что это, вероятно, лучшее, что есть.


2

JavaScript (Node.js) , 106 94 байта

x=>([a,c,d]=x.split` `,g=[c&d,c^d,c|d]["OR".search(a.slice(1+(b=/N[^D]/.test(a))))+1],b?1-g:g)

Попробуйте онлайн!

Ссылка на код и все 24 случая.

+9 за забытый на карту случай XNOR.


может я что то не вижу, но куда мне вводить ввод? Вкладка ввода ничего не делает.
qazwsx

@qazwsx Это лямбда-функция, которая по умолчанию разрешена.
Шиеру Асакото

1
@qazwsx Ссылка показывает выходные данные для каждого возможного входа. Этот ответ является функцией, поэтому, если вы хотите проверить его вручную, вы можете заменить нижний колонтитул, например,console.log(f("AND", 1, 1));
Mego

@qazwsx И, пожалуйста, отмените отрицательный голос. Это не является недействительным в конце концов.
Шиеру Асакото

а ну понятно. я отменил
понижающее


1

JavaScript (Node.js) , 45 байт

Просто порт превосходного ответа Python 2 от xnor, опубликованный с согласия, пожалуйста, вместо этого дайте этот ответ.

x=>Buffer(x).reduce((a,b)=>a+b)*3%61%37%9%7%2

Попробуйте онлайн!




Может быть, хорошая идея сначала преобразовать это в ответ сообщества? Затем добавьте эти порты JS как коллекцию здесь.
Шиеру Асакото

Может быть. Точно сказать не могу. Я обычно просто добавляю несколько ответов, если есть несколько вариантов с одним и тем же количеством байтов. Ответ mazzy 's Powershell даже нашел более короткий ответ : 41 байт .
Кевин Круйссен

1

Атташе , 55 байт

{Eval!$"${Sum!Id''Downcase!SplitAt!_}${N=>__2}"}@@Split

Попробуйте онлайн!

Довольно грубое решение. Преобразует ввод в соответствующую команду Attache и оценивает ее. (Attache имеет встроенные модули для каждого из 6 логических элементов.)


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.