Zadanie polega na napisaniu kodu, który może znaleźć małe logiczne formuły dla sum bitów.
Ogólne wyzwanie polega na tym, aby Twój kod znalazł najmniejszą możliwą logiczną formułę zdań, aby sprawdzić, czy suma y zmiennych binarnych 0/1 równa się pewnej wartości x. Nazwijmy zmienne x1, x2, x3, x4 itd. Twoje wyrażenie powinno być równoważne sumie. To znaczy, logiczna formuła powinna być prawdziwa wtedy i tylko wtedy, gdy suma jest równa x.
Oto naiwny sposób, aby to zrobić na początek. Powiedz y = 15 i x = 5. Wybierz wszystkie 3003 różne sposoby wyboru 5 zmiennych i dla każdej stwórz nową klauzulę z AND tych zmiennych AND AND z negacją pozostałych zmiennych. Otrzymujesz 3003 klauzul o długości dokładnie 15, których całkowity koszt to 45054.
Twoja odpowiedź powinna być logicznym wyrażeniem tego rodzaju, które można po prostu wkleić w python, powiedzmy, żebym mógł to przetestować. Jeśli dwie osoby otrzymają ten sam rozmiar wyrażenia, wygrywa kod, który uruchamia najszybciej.
Możesz wprowadzić nowe zmienne do swojego rozwiązania. Więc w tym przypadku twoja logiczna formuła składa się ze zmiennych binarnych y, x i kilku nowych zmiennych. Cała formuła byłaby zadowalająca wtedy i tylko wtedy, gdyby suma zmiennych y była równa x.
Na początku niektóre osoby mogą chcieć zacząć od y = 5 zmiennych dodających do x = 2. Naiwna metoda da wtedy koszt 50.
Kod powinien przyjmować dwie wartości y i x jako dane wejściowe i generować formułę, a jej rozmiar jako dane wyjściowe. Koszt rozwiązania to po prostu nieprzetworzona liczba zmiennych w jego wyniku. Tak (a or b) and (!a or c)
liczy się tylko jako 4. Dozwolone są operatorzy and
, or
a not
.
Aktualizacja Okazuje się, że istnieje sprytna metoda rozwiązania tego problemu, gdy x = 1, przynajmniej w teorii.
z[0] = y[0] and y[1]
, jak chcesz to wskazać?
z[0]
reprezentowała y[0] or y[1]
, musiałbym tylko wprowadzić klauzulę, która wygląda (y[0] or y[1]) or not z[0]
(lub dowolną równoważną instrukcję używającą 3 dozwolonych operatorów).