Inspirowane /puzzling/24334/to-catch-a-thief
Jesteś podawany był n
przez n
( n
sama jest opcjonalne wejście) siatka wypełniona 0
s oraz 1
s (lub dowolny inny znak wyboru). Twoim celem jest, aby każda komórka była taka sama (albo 0
albo 1
). Możesz wykonać serię ruchów, jak zdefiniowano poniżej (zauważ różnicę w łączu Puzzling SE):
- Wybierz komórkę.
- Każda komórka w tym samym wierszu i kolumnie (oprócz samej komórki) zostaje zamieniona na swoją stronę przeciwną.
0
do1
i1
do0
.
Podaj minimalną liczbę ruchów wymaganych do wykonania zadania. Jeśli nierozwiązywalne, wypisz cokolwiek oprócz nieujemnej liczby całkowitej. Najkrótszy kod wygrywa.
Przykładowe dane
1 0 0
0 0 0
0 0 0
-1
1 1 1
1 1 1
1 1 1
0
1 0 1
0 1 0
1 0 1
1
1 1 1 1
0 0 0 0
0 0 0 0
1 1 1 1
2
0 1 0 1
1 0 1 0
1 0 1 0
0 1 0 1
2
code-golf
grid
puzzle-solver
path-finding
ghosts_in_the_code
źródło
źródło
1000
(Przestawiony na kwadrat, nie ważne jak).Odpowiedzi:
Matlab 171 bajtów
Dane wejściowe powinny być macierzą 2D, więc nazwijmy to tak
c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])
(średniki rozpoczynają nowy wiersz). Ta funkcja po prostu brutalizuje wszystkie możliwe ruchy, więc otrzymujemy czas działaniaO(2^(n^2))
.Jak to jest zrobione
Odbywa się to poprzez wybranie wszystkich możliwych sposobów wypełnienia innej macierzy tego samego rozmiaru jednymi i zerami, co w zasadzie liczy się w postaci binarnej, w której każde wejście macierzy reprezentuje pewną potęgę 2.
Następnie wykonujemy ruchy na komórkach, które są 1, odbywa się to poprzez sumę (mod 2) dwuwymiarowego splotu z wektorem o wielkości 1xn i nx1.
Wreszcie decydujemy, czy te ruchy rzeczywiście przyniosły pożądany wynik, obliczając odchylenie standardowe dla wszystkich pozycji. Odchylenie standardowe wynosi tylko zero, jeśli wszystkie wpisy są takie same. I za każdym razem, gdy rzeczywiście znajdujemy pożądany wynik, porównujemy go z liczbą ruchów poprzednich rozwiązań. Funkcja powróci
inf
jeśli danego problemu nie da się rozwiązać.Matematyka?
Warto zauważyć, że wszystkie te ruchy razem tworzą grupę abelową! Jeśli komuś uda się skorygować te grupy, proszę dać mi znać.
Wersja golfowa:
Pełna wersja (z danymi wyjściowymi rzeczywistych ruchów.)
źródło
Perl 5, 498 bajtów
Akceptuje to „n” i pożądany wynik i wyświetla liczbę lub „X”, jeśli nie ma.
Na przykład:
daje
2
. Będzie działać tylko, gdy n ^ 2 <= 64, więcn <= 8
. Chociaż jest dość powolny, nawet przy n tak niskim jak 5. Buduje tablicę ^ 3-bitową i wcześniej sortuje tablicę 2 ^ (n ^ 2), ponieważ dlaczego nie ?Zmarnowałem tutaj kilka kanałów dla czytelności :
źródło