introduction
Votre mission dans la vie est simple: prouver que les gens ont tort sur Internet!
Pour ce faire, vous analysez généralement attentivement leurs déclarations et signalez leur contradiction.
Il est temps d'automatiser cela, mais comme nous sommes paresseux, nous voulons prouver que les gens ont tort avec le moins d'effort possible (lire: code le plus court) possible.
spécification
Contribution
Votre entrée sera une formule sous forme normale conjonctive . Pour le format, vous pouvez utiliser le format ci-dessous ou définir le vôtre, selon les besoins de votre langue (vous ne pouvez cependant pas encoder plus dans le format que le CNF pur). Les cas de test (ici) sont cependant fournis dans le format ci-dessous (bien qu'il ne soit pas trop difficile de générer le vôtre).
Votre entrée sera une liste d'une liste d'une liste de variables (vous pouvez également la lire sous forme de chaînes / exiger des chaînes). L'entrée est une formule sous forme normale conjonctive (CNF) écrite comme un ensemble de clauses, chacune étant une liste de deux listes. La première liste de la clause code les littéraux positifs (variables), la seconde liste code les littéraux négatifs (négatifs) (variables). Chaque variable de la clause est OU ensemble et toutes les clauses sont ET ensemble.
Pour être plus clair: [[[A,B],[C]],[[C,A],[B]],[[B],[A]]]
peut être lu comme:
(A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))
Sortie
La sortie est booléenne, par exemple, soit une valeur vraie ou une valeur fausse.
Que faire?
C'est simple: vérifiez si la formule donnée à la main est satisfaisable, par exemple s'il existe une affectation de vrai et de faux à toutes les variables de sorte que la formule globale donne "vrai". Votre résultat sera "vrai" si la formule est satisfaisante et "faux" dans le cas contraire.
Fun-Fact: Il s'agit d'un problème NP-complet dans le cas général.
Remarque: La génération d'une table de vérité et la vérification de la véracité d'une entrée résultante sont autorisées.
Étuis d'angle
Si vous obtenez une liste de 3e niveau vide, il n'y a pas de variable (positive / négative) dans cette clause - une entrée valide.
Vous pouvez laisser d'autres cas d'angle indéfinis si vous le souhaitez.
Vous pouvez également retourner true sur une formule vide (liste de 1er niveau) et false sur une clause vide (liste de 2e niveau).
Qui gagne?
Il s'agit de code-golf, donc la réponse la plus courte en octets l'emporte!
Les règles standard s'appliquent bien sûr.
Cas de test
[[[P],[Q,R]],[[Q,R],[P]],[[Q],[P,R]]] -> true
[[[],[P]],[[S],[]],[[R],[P]],[[U],[Q]],[[X],[R]],[[Q],[S]],[[],[P,U]],[[W],[Q,U]]] -> true
[[[],[P,Q]],[[Q,P],[]],[[P],[Q]],[[Q],[P]]] -> false
[[[P],[]],[[],[P,S]],[[P,T],[]],[[Q],[R]],[[],[R,S]],[[],[P,Q,R]],[[],[P]]] -> false
optional behavior (not mandatory, may be left undefined):
[] -> true (empty formula)
[[]] -> false (empty clause)
[[[],[]]] -> false (empty clause)
(A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))
?{{P,Q},{P,!Q},{!P,Q},{!P,!Q}}
(pas dans cet ordre) qui peut être facilement montré est une contradiction. Pour les 4): C'est trivialement une contradiction car c'estP AND ... AND (NOT P)
ce qui ne peut évidemment jamais être vrai pour n'importe quelle valeur de P.Réponses:
Mathematica, 12 octets
Eh bien, il y a un intégré ...
Le format d'entrée est
And[Or[a, b, Not[c], Not[d]], Or[...], ...]
. Cela fait correctement le travail pour les sous-expressions vides, parceOr[]
estFalse
etAnd[]
estTrue
.Pour mémoire, une solution qui reçoit le format basé sur une liste du défi et effectue la conversion elle-même est de 44 octets, mais l'OP a précisé dans un commentaire que tout format est correct tant qu'il ne code pas d'informations supplémentaires:
la source
S a t i s f i a b l e Q
résoudrait le problème. Alors seulement, la compréhension de la lecture a frappé à la porte ...Haskell,
203200 octetsCe défi mérite une réponse non intégrée, alors voilà. Essayez-le sur ideone . L'algorithme essaie simplement toutes les affectations de variables et vérifie si l'une d'entre elles satisfait la formule.
L'entrée est sous la forme de
[([],["P","Q"]),(["Q","P"],[]),(["P"],["Q"]),(["Q"],["P"])]
, bien qu'au lieu de chaînes, chaque type avec égalité fonctionnera.Code non golfé:
la source
JavaScript 6, 69B
Usage:
la source