Вам дан набор логических утверждений. Ваша задача состоит в том, чтобы удалить любые из них, которые противоречат другим, но оптимальным образом (т.е. удалить минимальное количество утверждений).
Вызов
Вы напишите программу или функцию, которая принимает в качестве входных данных список операторов, удаляет минимальное количество операторов, так что есть решение, и выводит остальные.
логика
Утверждения состоят из переменных A-Z
и операторов между ними.
Есть 5 операторов : -
(не), v
(или), ^
(и), ->
(если) и <->
(если).
Таблица правды:
A | B | -A | AvB | A^B | A->B | A<->B
0 | 0 | 1 | 0 | 0 | 1 | 1
0 | 1 | 1 | 1 | 0 | 1 | 0
1 | 0 | 0 | 1 | 0 | 0 | 0
1 | 1 | 0 | 1 | 1 | 1 | 1
Эти операторы могут быть объединены вместе с круглыми скобками ()
:
A | B | -(AvB) | Av(-A) | A^(-A) | (AvB)->(-B)
0 | 0 | 1 | 1 | 0 | 1
0 | 1 | 0 | 1 | 0 | 0
1 | 0 | 0 | 1 | 0 | 1
1 | 1 | 0 | 1 | 0 | 0
Логические системы состоят из 1 или более операторов .
Решение для логической системы является состояние , в котором все заявления одновременно являются правдой.
Примеры логических систем:
AvB
-(A<->B)
(AvB)->(-B)
Единственное решение есть A = 1, B = 0
.
A^B
-(B<->A)
У этого нет решения ; без комбинации A
и B
оба утверждения верны.
вход
Вы получите набор утверждений в качестве входных данных. Это может быть принято через STDIN или аргументы функции, отформатированные в виде массива (в удобном формате) или строки, разделенной символом новой строки или пробелом.
Заявления будут иметь следующую форму (в почти ABNF ):
statement = variable / operation
operation = not-operation / binary-operation
not-operation = "-" operand
binary-operation = operand binary-operator operand
operand = variable / "(" operation ")"
variable = "A"-"Z"
binary-operator = "v" / "^" / "->" / "<->"
Пример заявления:
A
Av(-B)
(A<->(Q^C))v((-B)vH)
Выход
Вы должны возвратить (возможно) сокращенный набор утверждений в том виде, в каком вы их получили. Опять же, список может быть отформатирован как массив строк или строки, разделенные символом новой строки или пробелом.
правила
- Вы должны всегда удалять минимальное количество утверждений. Если существует несколько возможных решений, выведите одно из них.
- Вы можете предположить, что входные данные всегда содержат хотя бы 1 оператор и что никакие операторы не повторяются во входных данных.
- Вы не можете предполагать, что выходные данные всегда содержат оператор. (см. примеры)
- Использование стандартных лазеек противоречит тому, что ваш ответ является действительным, и одна из них должна быть удалена.
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Примеры
Входные данные:
A^(-A)
Выход:
(nothing)
Входные данные:
A^B A<->(-B) A<->B
Выход:
A^B A<->B
Входные данные:
["AvB","A^B"]
Выход:
["AvB","A^B"]
(AvB)->-B
должно быть(AvB)->(-B)
)A<->(Q^C))v((-B)vH
пюре.Ответы:
Рубин,
299298283279 байтUngolfed:
источник
Python 3, 431 байт
Сейчас я не очень играю в гольф, но думаю, что получу ответ. Попробуйте здесь ,
g()
это основная функция.источник
v
этоor
.