Ваша миссия, если вы решите принять ее, - создать простой оценщик правды для следующих логических операторов:
----------------------------------------------------------------------------------
Logical Name | Gate Name | Symbol | Symbol Name | Truth Table
----------------------------------------------------------------------------------
Identity | is | | (none) | 10
Negation | not | ~ | tilde | 01
Conjunction | and | & | ampersand | 1000
Disjunction | or | | | pipe | 1110
Negative Conjunction | nand | ^ | caret | 0111
Joint Denial | nor | v | "vee" | 0001
Exclusive Disjunction | xor | x | "ecks" | 0110
Equivalence | equals/xnor | = | equals | 1001
Implication | implies | > | greater than | 1011
Таблицы истинности расположены в следующем порядке:
- 1 1
- 1 0
- 0 1
- 0 0
Ввод будет в виде простой строки 0, 1 и символа. Вы можете либо принять ввод в качестве параметра, либо прочитать его от пользователя на stdin. Вот несколько примеров пар ввода / вывода:
Input: 1
Output: 1
Input: ~1
Output: 0
Input: 0|1
Output: 1
Input: 1>0
Output: 0
Унарный оператор (отрицание) всегда будет появляться перед логическим значением, тогда как бинарные операторы всегда будут появляться между двумя логическими значениями. Вы можете предположить, что все входные данные будут действительными. Строки - это обычные строки ASCII.
Если вы предпочитаете, вы можете использовать T и F вместо 1 и 0. -6 для подсчета символов, если вы поддерживаете оба.
Это Код-гольф: самый короткий код на любом языке выигрывает!
источник
^
что имя символа должно быть написано карет .Ответы:
APL (45 - 6 = 39)
Поддерживает
T
и вF
качестве ввода, но всегда будет выводить0
или1
.Объяснение:
Z←⍞
: прочитайте строку и сохраните ее вZ
L←'TF&|^vx>'⍳Z
: получить индекс'TF&|^vx>'
для каждого символа вZ
, давая,9
если символ не в'TF&|^vx>'
.'10∧∨⍲⍱≠≤*'[
...]
: найти соответствующий символ в'10∧∨⍲⍱≠≤*'
. (Таким образом, символы, которых не было в первом списке, становятся*
).↓⍉Z⍪⍉⍪
: сделайте это в матрице, поместите оригинал (Z
) поверх него и разбейте его на список строк, где первый символ - это оригинал, а второй - его перевод, если таковой имеется.(1+9≠L)⌷¨
: для каждой из этих строк получить первый символ, если не было перевода (если он былL=9
в этом месте), и второй символ, если он был.T|0
, мы бы1∨0
сейчас имели соответствующее выражение APL⍎
: evalПримечание:
~
и=
уже поступайте правильно, чтобы их не нужно было заменять чем-либо.источник
⍎'1010~∧∨⍲⍱≠=≤'['10TF~&|^vx=>'⍳⍞]
? (Счет 33-6 = 27)С -
165127Это было весело! Простая таблица поиска, полагаясь на фиксированное смещение для поиска.
По какой-то причине
gets
не объявляется неявно, поэтому, когда я удалил включение, мне пришлось изменитьgets(t+2)
его(gets(t+2),t)
(или аналогично в другом месте, стоив столько же).объяснение
Прежде всего, поскольку таблицы истинности для операторов содержат много перекрывающихся символов, мы хотим хранить таблицы подстановки таким образом, чтобы мы допускали перекрытие. Вот как я решил хранить их:
Далее мы хотим отобразить символы операторов на эти смещения. Мы делаем это, сохраняя символы оператора в одной и той же строке с фиксированным смещением от данных LUT (а именно, 16 символов спустя, то есть непосредственно после данных LUT). Процесс поиска - это «найти оператор в
s
, вычесть16
, добавитьleft*2+right
(левый / правый операнд)». Для поиска пустой «операции идентификации», из-за того, как выборка извлекается, оператор в этом случае разрешит все, чтоt[1]
инициализировано для -в нашего случая/
. Таким образом, мы используем в/
качестве ключа таблицы поиска , чтобы представить тождественную операцию. Когда мы обрабатываем унарные~
операции «left
» (для расчета поиска упоминался ранее) всегда это же/
./
случается один меньше0
ASCII-накрест, то есть , когда мы компенсировать ASCII цифры\
будут представлять-1
. Косая черта в области ключей таблицы поиска (то есть, от второго до последнего символаs
) расположена для компенсации этого.Далее, обработка ввода. Вход имеет динамическую длину, но было бы проще, если бы у нас были определенные статические имена для левого операнда, оператора и правого операнда, независимо от ввода. Если мы притворимся, что можем прочитать ввод справа налево, это в основном произойдет автоматически - правый операнд всегда является крайним правым символом, оператор (если присутствует) является вторым справа, левый операнд (если присутствует) ) является третьим справа. Чтобы иметь возможность индексировать строку, подобную этой, мы используем ее
strchr
, чтобы найти\0
терминатор (- 3
для упрощения индексации). Это показывает, почемуt[0]
иt[1]
стать левым операндом / оператором соответственно, когда ввод 1 или 2 символа.Если сложить это вместе, результат будет таким
putchar(strchr(s,u[1])[(u[0] - '0')*2 + (u[2] - '0') - 15])
, но некоторый рефакторинг и постоянное сворачивание вместо этого сделают нас корочеputchar(strchr(s,u[1])[u[0]*2+u[2]-159])
.источник
Tcl
212208-6 = 202Ungolfed:
Я думаю, что строка foreach нуждается в некотором объяснении:
split $argv {}
разбивает входную строку (это на самом деле список, но код-гольф) на символы.string map {{~ 0} 1 {~ 1} 0} ...
берет строку и заменяет~ 0
на1
и~ 1
с0
lassign ... a
берет первый элемент списка и присваивает его переменной a, возвращает остаток.foreach {op b} ... {code}
просматривает список и каждый раз принимает 2 элемента:op
иb
set a [$op $a $b]
выполняет команду в переменнойop
, сохраняет результат вa
источник
JavaScript -
107105 символовисточник
eval()
когда я это придумал. Просто дай мне немного времени, чтобы вернуться домой и проверить это.&~
и ни =|~
?&~
и|~
, но NAND только обратная И. Таким образом, инвертирование одного из битов также инвертирует результат.Befunge-98 -
104 101 98-672... потому что каждая задача нуждается в решении esolang .. перевод моей реализации C, но вместо этого обработка символов по одному.
Интересный факт: изменениеREPL больше нет.@
кa,$
и вы получите фантазии нескончаемого REPL вместо (хотя, если вы сделаете это , вы заметите , что личность на самом деле «повторить последнюю команду с LHS = 0 и ОРЗ = вход», который как раз случается по умолчанию идентичности ).Ungolfed (более ранняя версия):
Изменить: вдохновленный решением @jpjacobs, теперь я полагаюсь на положение символов в LUT для представления таблиц истинности. Например,
|
находится на позиции 1110 2 = 14, потому что это соответствует таблице истинности для|
.источник
J -
6567-6 = 61Нет больше б. Наречие. Без учета назначения функции: 67 символов для версии TF, 63 для версии без TF:
LgcTF обрабатывает как 0 и 1, так и T и F.
Поддерживает весь синтаксис J с точки зрения последовательности, круглых скобок и вычислений строго справа налево (никаких других правил приоритета).
Все символы, отсутствующие в списке операторов + Z, не могут быть использованы, другие будут действовать как в стандартном J (включая переменные).
Применение:
источник
Постскриптум 263
Идея светлячка переведена в Postscript.
Отступ:
источник
Befunge-93, 86 персонажей
Работает, хэшируя второй символ ввода (поиск функции, которая была и компактной, и избегала столкновений, была некоторой работой) для координаты y, и принимая первый и третий символы каждый по модулю 2 как два младших значащих бита координаты x, затем получение любого значения в указанной позиции. Лучшая хеш-функция или более компактный метод хранения / адресации таблиц истинности - это всего лишь два возможных способа сократить длину.
источник