Wprowadzenie
Twoja misja w życiu jest prosta: Udowodnij ludziom, że się mylą w Internecie!
W tym celu zazwyczaj dokładnie analizuje się ich wypowiedzi i wskazuje na zawarte w nich sprzeczności.
Czas to zautomatyzować, ale ponieważ jesteśmy leniwi, chcemy udowodnić, że ludzie się mylą przy jak najmniejszym wysiłku (czytaj: najkrótszy kod).
Specyfikacja
Wkład
Twój wkład będzie formułą w spójnej normalnej formie . W tym formacie możesz użyć poniższego formatu lub zdefiniować własny, zgodnie z potrzebami swojego języka (nie możesz jednak kodować więcej w formacie niż czysty CNF). Przypadki testowe (tutaj) są jednak dostarczone w poniższym formacie (chociaż wygenerowanie własnego nie będzie trudne).
Twoje dane wejściowe będą listą listy zmiennych (możesz także odczytać ją jako ciągi / wymagają ciągów). Dane wejściowe to formuła w spójnej postaci normalnej (CNF) napisana jako zestaw klauzul, z których każda jest listą dwóch list. Pierwsza lista w klauzuli koduje literały dodatnie (zmienne), druga lista koduje literały ujemne (negowane) (zmienne). Każda zmienna w klauzuli jest OR'ed razem, a wszystkie klauzule AND'ed razem.
Aby było jaśniej: [[[A,B],[C]],[[C,A],[B]],[[B],[A]]]
można odczytać jako:
(A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))
Wydajność
Wyjście ma wartość logiczną, np. Albo pewna wartość prawdy, albo pewna wartość fałszu.
Co robić?
To proste: Sprawdź, czy podana formuła jest zadowalająca, np. Czy istnieje przypisanie wszystkich zmiennych prawda i fałsz, tak aby ogólna formuła dawała „prawda”. Twoje wyniki będą „prawdziwe”, jeśli formuła będzie satysfakcjonująca, i „fałszywe”, jeśli nie będzie.
Ciekawostka: w ogólnym przypadku jest to problem NP-zupełny.
Uwaga: Dozwolone jest generowanie tabeli prawdy i sprawdzanie, czy jakikolwiek wynikowy wpis jest prawdziwy.
Obudowy narożne
Jeśli otrzymasz pustą listę trzeciego poziomu, nie ma takiej zmiennej (dodatniej / ujemnej) w tej klauzuli - prawidłowe dane wejściowe.
Jeśli chcesz, możesz pozostawić nieokreślone inne skrzynki narożne.
Możesz także zwrócić wartość true przy pustej formule (lista 1. poziomu) i false przy pustej klauzuli (lista 2. poziomu).
Kto wygrywa?
To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach!
Oczywiście obowiązują standardowe zasady.
Przypadki testowe
[[[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}}
(nie w tej kolejności), co można łatwo wykazać, jest sprzecznością. Dla 4): To jest trywialnie sprzeczność, ponieważ jest to,P AND ... AND (NOT P)
co oczywiście nigdy nie może być prawdziwe dla żadnej wartości P.Odpowiedzi:
Mathematica, 12 bajtów
Cóż, jest wbudowany ...
Format wejściowy to
And[Or[a, b, Not[c], Not[d]], Or[...], ...]
. Działa to poprawnie dla pustych podwyrażeń, ponieważOr[]
jestFalse
iAnd[]
jestTrue
.Dla przypomnienia, rozwiązanie, które odbiera format oparty na liście od wyzwania i dokonuje samej konwersji, ma 44 bajty, ale OP wyjaśnił w komentarzu, że dowolny format jest w porządku, o ile nie koduje żadnych dodatkowych informacji:
źródło
S a t i s f i a b l e Q
rozwiązałaby problem. Dopiero wtedyHaskell,
203200 bajtówTo wyzwanie zasługuje na odpowiedź niewbudowaną, więc proszę bardzo. Wypróbuj na ideone . Algorytm po prostu próbuje wszystkich przypisań zmiennych i sprawdza, czy jedno z nich spełnia formułę.
Dane wejściowe mają postać
[([],["P","Q"]),(["Q","P"],[]),(["P"],["Q"]),(["Q"],["P"])]
, chociaż zamiast łańcuchów każdy typ z równością będzie działał.Nieskluczony kod:
źródło
JavaScript 6, 69B
Stosowanie:
źródło