Логічні ворота вручну


13

Складіть програму, яка імітує основні логічні ворота.

Введення: Слово з усіма великими літерами з двома двозначними двійковими числами, розділеними пробілами, такими як 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, тому найкоротший код виграє.


Чи можемо ми взяти масив як вхідний?
Квінтек

no @Quintec you cant
qazwsx

3
Чи можемо ми вивести як True / False?
xnor

5
sure @xnor (також відповідне ім’я користувача)
qazwsx

Відповіді:



29

Python 2 , 38 байт

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

Спробуйте в Інтернеті!

Хороший ol 'модульний ланцюг застосований до суми 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, і 1чи правильно все-таки дасть 1результат.


Чорт, я шукав свої власні значення мода, але ти перебив мене до цього. Чи записали ви свої стратегії цього куди завгодно, тому що мої методи грубої сили, як правило, займають дуже довго
Джо Кінг

2
@JoKing Я в основному загальну грубу силу *a%b%c%d%e%2, нічого насправді розумного. Єдине цікаве - поставити *перед модниками; Я не пробував інших форматів.
xnor

Вау, це просто розумно! Я навіть не очікую хеш-методу зробити це. Чи можу я зробити 45-байтний JS-порт вашої відповіді ?
Шиеру Асакото

@ShieruAsakoto Однозначно, займіться цим.
xnor

1
@xnor Я використовував такий самий метод, як і ви, тому я не відчував би себе добре розміщувати його самостійно, але це може бути 36 байт .
nedla2004

10

JavaScript (ES6), 39 байт

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

Спробуйте в Інтернеті!

Як?

Ми не можемо проаналізувати пробіли parseInt(), незалежно від того, з якою базою ми працюємо. Отже, ми замість цього вводимо базове представлення вхідного рядка. Це може генерувати =символи прокладки (які неможливо проаналізувати parseInt()ні з одним), але вони гарантовано розташовуються в кінці рядка і можуть бути безпечно проігноровані.

Ми розбираємо основу і застосовуємо модуль , а потім модуль , який дає наступні результати. Сюди входять неточності через втрату точності. Кінцевий результат - у , при цьому найвищий показник правдивості становить , що призводить до 19-бітної біт-маски пошуку.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 коротше, ніж перенесена відповідь
Шиеру Асакото

Але ... це, здається, не працює 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 , згаданий у коментарі до його відповіді на Пауершелла ( *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 бінарних операцій, які я довільно назвав так: ZERO AND MANSE SECOND GREATER FIRST XOR OR NOR XNOR NFIRST 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

Математика, 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:

Спробуйте в Інтернеті!

Порт рішення для Python 2 xnor .


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

Подумайте про те, як опублікувати фокус у підказках J для гольфу, якщо ви ще цього не зробили. Акуратні речі. Також я великий фанат рішення 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.
Kevin Cruijssen


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 І скасуйте, будь ласка, зворотний зв'язок. Зрештою, це недійсне.
Шиеру Асакото

о Я бачу. Я повернув низку
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 Powershell відповідь «s навіть знайшов більш короткий , хоча: 41 байт .
Кевін Кройсейсен


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.