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


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.