Если вы вспоминаете свои школьные годы, вы, возможно, помните, что изучали Таблицы правды . Они казались скучными, но они являются основой для логики и (некоторые могут поспорить) всех вычислений ...
проблема
Ваша миссия, если вы решите принять ее, это написать программу, функцию или виджет кода, который может выводить таблицу истинности при заданном входном сигнале.
вход
Входными данными будет строка (например, структура данных), содержащая логический оператор, в который будет преобразована таблица истинности. Например:
p ∧ q
Это значит p and q
(логическая конъюнкция) и выдаст:
p q p ∧ q
T T T
T F F
F T F
F F F
Обратите внимание на интервал: элемент столбца находится в центре заголовка
Персонажи
Оценка через символы, а не байты . Символы логического сравнения особенные и не всегда выглядят так, как они выглядят. Используйте эти символы:
Логическое соединение (И): ∧
U + 2227
Логическая дизъюнкция (ИЛИ): ∨
U + 2228
Логическое отрицание (НЕ) ~
или ¬
U + 7e и U + ac соответственно
Бонусы
Все эти бонусы не являются обязательными, но будут сбивать очки с вашего счета. Выберите любой.
Логическое Отрицание
Логическое отрицание - это унарный оператор в таблицах истинности. Это эквивалент !
большинства языков на основе Си. Это делает false
=> true
и наоборот. Он обозначается как ¬
или ~
(вы должны поддерживать оба). Поддержка этого сбивает 10% вашего счета. Однако вы должны добавить дополнительный столбец, чтобы показать его результаты: Например:
~p ∧ q
будет выводить:
p ~p q ~p ∧ q
T F T F
T F F F
F T T T
F T F F
Красивая печать
Нормальная запись в таблице скучно. Давайте сделаем это красиво! Довольно формат печати выглядит следующим p ∧ q
образом:
+---+---+-------+
| p | q | p ∧ q |
+---+---+-------+
| T | T | T |
+---+---+-------+
| T | F | F |
+---+---+-------+
| F | T | F |
+---+---+-------+
| F | F | F |
+---+---+-------+
Специальные детали для красивой печати:
- В каждой ячейке есть 1 пробел
- Значения ячеек по-прежнему центрированы
Если вы просто распечатываете свои таблицы из своего кода, а затем умножаете на 0,6. Используйте эту функцию для этого бонуса:
score = 0.6 * code
Примеры
p ∧ q
:
p q p ∧ q
T T T
T F F
F T F
F F F
p ∨ q
:
p q p ∨ q
T T T
T F T
F T T
F F F
~p ∧ q
:
p ~p q ~p ∧ q
T F T F
T F F F
F T T T
F T F F
~p ∨ q
:
p ~p q ~p ∧ q
T F T T
T F F F
F T T T
F T F T
правила
- Применяются стандартные лазейки
- Нет внешних ресурсов
- Если вы собираетесь нарушать правила, будьте умны;)
Кратчайший код (в символах) выигрывает. Удачи!
источник
p
иq
. Если у них не всегда есть эти имена, вы можете захотеть показать несколько разных вариантов в тестовых примерах. Это всегда одна буква?score = 0.6 * (code - 15)
=.6 * code - 9
p
q
иr
в таблице истин;)Ответы:
JavaScript (ES6), 141
Простая функция, без бонусов, 141 символов. (140 футов8, ширина 1 юникод)
Сложная функция обработки ~ или, 254 символа (253 UTF, 1 Unicode в ширину), оценка 229
Может сэкономить 6 байт, используя
alert
вместоconsole.log
, ноalert
особенно не подходит для отображения таблиц.Протестируйте приведенный ниже фрагмент в браузере, совместимом с EcmaScript 6 (протестировано с Firefox. Не будет работать в Chrome, поскольку Chrome не поддерживает
...
. Кроме того, в бонусной версии используется расширениеsplit
, специфичное для Firefox).источник
Шаблон MediaWiki - 2347 символов
MediaWiki имеет встроенную шаблонную функцию,
{{#expr}}
которая может обрабатывать логические выражения. Это должно быть идеальным испытанием для шаблонов MediaWiki! Такие функции, как переменные, циклы и читаемый синтаксис, хоть немного помогли бы. Кроме того, тот факт, что для функции expr нет оператора NOT, делает ее немного более сложной.Тестовое задание:
Результат:
Я предполагаю, что MediaWiki> = 1.18, где расширения ParserFunctions поставляются в комплекте с программным обеспечением.
источник
¬
/~
отсутствует; если вы добавите его, вы получите право на10%
бонус.Python - 288 символов (+10 штрафов, потому что я не могу заставить работать юникод: c)
Нет бонусов. Это мой самый первый ответ Codegolf.
i
это вход.РЕДАКТИРОВАТЬ: Удалено несколько пробелов, и теперь он использует аргументы функции в качестве ввода.
источник
Dyalog APL ,
5848 символовТребуется
⎕IO←0
, что по умолчанию во многих системах. Принимает строку в качестве аргумента.Бонусов нет, но в плюсе любой оператор работает.
⍳4
первые четыре индекса (0 1 2 3)⌽
обратный (3 2 1 0)2 2⊤
двухбитный логический стол↓
разделить на два элемента списков (старшие, младшие биты)p q←
хранить как p и q≢
подсчитать их (2) *9⍴
циклически изменить это до длины 9 (2 2 2 2 2 2 2 2 2)324⊤⍨
кодировать 324 таким образом, то есть как 12-битный двоичный код (1 0 1 0 0 0 1 0 0)\⍨
используйте это для расширения (вставьте пробел для каждого 0) ...'FT '[
...]
строка "FT", проиндексированная⍎⍵
выполненный аргумент (действителен, поскольку p и q теперь имеют значения)⍪
превратить это в матрицу столбцовq,
добавить столбец, состоящий из q (1 1 0 0)q,
добавить столбец, состоящий из p (1 0 1 0)(
...)⍪
вставить строку выше, состоящую из⍵
Аргумент'p q ',
предваряется строкой "p q"* Пожалуйста, отметьте эту проблему, если вы видите
≢
как,≢
а не как̸≡
.источник
Юлия, 161 байт
Нет бонусов.
Ungolfed:
источник
Mathematica, 129 байт
Golfed:
Ungolfed:
Не эксперт по Mathematica, но я нашел это довольно элегантным по сравнению с необходимостью прямого сравнения символов.
У меня было решение, которое работало на отрицание, но это было дольше, чем снимет оценка.
В зависимости от того, что подходит для красивой печати, я мог бы попытаться получить этот бонус. Я чувствую, что вывод в ASCII в Mathematica будет слишком дорогим, чтобы компенсировать снижение оценки, но если две основные функции - это пунктирная граница и заданный отступ внутри ячеек, это только пара вариантов в Grid.
С красивой печатью, 171 * 0,6 = 102,6 байт
источник
Python3,
145139120119 байтБез бонуса (с бонусом в конце)
Необходимая поддержка Python3 для Unicode из коробки.
Исходя из кода Python DJgamer98, выяснить его таблицу не правильно.
Edit1: разделение на отдельные переменные и пропуск операторной строковой переменной
Edit2: (ab) использование F и T в качестве переменных и строковых символов
Edit3: экономия одного места благодаря NoOneIsHere
С бонусом 215 * 0,6 = 129
источник
q in c:
.C / C ++ 302 байта
335 символов меньше 10% для обработки отрицания. Форматирование неполное, но отправка до того, как я увижу, каково влияние завершения.
Отмечен как C / C ++, потому что мои gcc и g ++ принимают его с -fpermissive, и это выглядит для меня гораздо больше, чем C ++, чем C ++.
Я уверен, что, возможно, есть несколько настроек, которые можно применить. На самом деле, обработка неимущих добавляет более 10% бонуса.
Предполагается, что входной формат соответствует указанному, то есть 2 входных значения (p и q), с префиксом not и без него и без него, со всеми токенами, разделенными одним пробелом.
Ungolfed:
и тесты:
источник
Mathematica, 128 символов
это символ частного использования,U+F3C7
представляющий\[Transpose]
.К счастью для нас, игроков в Mathematica,
∧
и∨
уже представляющих,And
иOr
все, что нам нужно сделать, - это преобразовать входную строку в выражение Mathematica, и мы можем выполнять над ней символические логические операции.Обратите внимание, что это решение также будет обрабатывать
Not
(¬
),Implies
(
),Equivalent
(⧦
),Xor
(⊻
),Nand
(⊼
),Xor
(⊻
) иNor
(⊽
), но оно не получит бонус, потому что~p
это синтаксическая ошибка в Mathematica. Мех.объяснение
Преобразует входную строку в выражение Mathematica и сохраняет ее в
b
.Это список всех возможных подвыражений ввода. Каждый получит свой столбец.
Это список всех переменных, которые появляются во входных данных.
Чистая функция, которая принимает входное выражение
#
и возвращает список значений истинности для всех возможных комбинаций значений истинности для переменных.Добавляет само выражение в этот список.
Применяет эту функцию к каждому подвыражению ввода.
Затем замените true (
0<1
) на «T» и false (0>1
) на «F».Чередуйте строки и столбцы.
Показать результат как
Grid
.Преобразовать в
Grid
традиционную форму, чтобы использовать необычные символы.источник