Te dan un conjunto de declaraciones lógicas. Su desafío es eliminar los que contradicen a los demás, pero de la manera óptima (es decir, eliminar un número mínimo de declaraciones).
Desafío
Escribirás un programa o una función que tome como entrada una lista de declaraciones, elimine el número mínimo de declaraciones de modo que haya una solución y genere el resto.
Lógica
Las declaraciones consisten en variables A-Z
y operadores entre ellas.
Hay 5 operadores : -
(no), v
(o), ^
(y), ->
(if) y <->
(iff).
Mesa de la verdad:
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
Estos operadores se pueden combinar junto con paréntesis ()
:
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
Los sistemas lógicos consisten en 1 o más declaraciones .
Una solución para el sistema lógico es un estado en el que todas las declaraciones son simultáneamente verdaderas.
Ejemplos de sistemas lógicos:
AvB
-(A<->B)
(AvB)->(-B)
La única solución es A = 1, B = 0
.
A^B
-(B<->A)
Este no tiene solución ; sin combinación de A
y B
ambas afirmaciones son verdaderas.
Entrada
Recibirá un conjunto de declaraciones como entrada. Esto se puede tomar a través de STDIN o argumentos de función, formateados como una matriz (en un formato conveniente) o una cadena separada por líneas o espacios separados.
Las declaraciones serán de la siguiente forma (en casi 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" / "^" / "->" / "<->"
Declaraciones de ejemplo:
A
Av(-B)
(A<->(Q^C))v((-B)vH)
Salida
Debe devolver el (posiblemente) conjunto reducido de declaraciones, en la forma exacta en que las recibió. Una vez más, la lista se puede formatear como una matriz de cadenas o una cadena separada por líneas o espacios separados.
Reglas
- Siempre debe eliminar el número mínimo de declaraciones. Si hay varias soluciones posibles, envíe una de ellas.
- Puede suponer que la entrada siempre contiene al menos 1 instrucción y que ninguna instrucción se repite en la entrada.
- No puede suponer que la salida siempre contiene una declaración. (ver ejemplos)
- El uso de lagunas estándar contradice que su respuesta sea válida, y una de ellas debe eliminarse.
- Este es el código de golf , por lo que gana la respuesta más corta en bytes.
Ejemplos
Entrada:
A^(-A)
Salida:
(nothing)
Entrada:
A^B A<->(-B) A<->B
Salida:
A^B A<->B
Entrada:
["AvB","A^B"]
Salida:
["AvB","A^B"]
(AvB)->-B
debería ser(AvB)->(-B)
)A<->(Q^C))v((-B)vH
están mezclados.Respuestas:
Rubí,
299298283279 bytesSin golf:
fuente
Python 3, 431 bytes
No estoy muy golfizado en este momento, pero me imagino que pondría la pelota en marcha con una respuesta. Pruébalo aquí ,
g()
es la función principal.fuente
v
que sior
.