Є 16 різних булевих функцій для двох бінарних змінних, A і B:
A B | F0 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | F13 | F14 | F15
-----------------------------------------------------------------------------------------
0 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1
0 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1
1 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1
1 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1
Менше, ніж оператор <
, який зазвичай не вважається логічним оператором, як NOT, AND, або OR, насправді є однією з цих функцій (F4) при застосуванні до булевих значень:
A B | A < B
-----------
0 0 | 0
0 1 | 1
1 0 | 0
1 1 | 0
Цікаво, що ми можемо імітувати будь-яку з 15 інших функцій, використовуючи вирази, які містять лише символи ()<AB10
. Ці вирази читаються та оцінюються так само, як це було б у багатьох стандартних мовах програмування, наприклад, дужки повинні відповідати і <
повинні мати аргументи з обох боків.
Зокрема, ці вирази повинні відповідати наступній граматиці (наведеній у формі Backus-Naur ):
element ::= A | B | 1 | 0
expression ::= element<element | (expression)<element | element<(expression) | (expression)<(expression)
Це означає, що марні паретези та вирази форми A<B<1
не допускаються.
Отже, вираз A<B
відповідає функції F4, і його A<B<1
потрібно змінити на (A<B)<1
або A<(B<1)
.
Щоб довести, що всі 15 інших функцій можна перетворити на вирази, достатньо сформувати набір виразів, які є функціонально завершеними , тому що тоді, за визначенням, вони можуть бути складені в вирази для будь-якої функції.
Одним із таких наборів виразів є x<1
(де x
є A
або B
), що є ¬x
, і (((B<A)<1)<A)<1
що є A → B
. Відомо, що заперечення ( ¬
) та імплікація ( →
) є функціонально завершеними.
Виклик
Використовуючи символи ()<AB10
, запишіть 16 виразів у форму, описану вище, що еквівалентно кожній із 16-ти різних булевих функцій.
Мета - зробити кожен із виразів якомога коротшим. Ваш бал - це кількість символів у кожному з ваших 16 виразів. Виграє найнижчий бал. Tiebreaker переходить до найбільш ранньої відповіді (за умови, що згодом вони не редагували свою відповідь коротшими виразами, взятими від когось іншого).
Технічно не потрібно писати реального коду для цього конкурсу, але якщо ви писали якісь програми, які допоможуть вам генерувати вирази, вам дуже рекомендується розміщувати їх.
Ви можете використовувати цей фрагмент стека, щоб перевірити, чи виконують ваші вирази те, що очікується: