Biorąc pod uwagę dodatnią liczbę całkowitą N, określ wzór początkowy na siatce N x N, która daje najdłuższą niepowtarzalną sekwencję zgodnie z Regułami Gry Życia, a kończy się stałym wzorem (cykl długości 1), rozgrywanym na torusie.
Celem nie jest najkrótszy program, ale najszybszy.
Ponieważ świat jest skończony, ostatecznie skończysz w pętli, powtarzając w ten sposób już odwiedzony stan. Jeśli ta pętla ma okres 1, wówczas wzorzec początkowy jest prawidłowym kandydatem.
Dane wyjściowe: wzorzec początkowy i całkowita liczba unikalnych stanów w sekwencji (w tym wzorzec początkowy).
Teraz torus 1x1 jest wyjątkowy, ponieważ komórkę można uznać za sąsiadującą z nią lub nie, ale w praktyce nie ma problemu, jedna żywa komórka w obu przypadkach po prostu umrze (z powodu przeludnienia lub samotności). Zatem dane wejściowe 1 dają sekwencję o długości 2, przy czym sekwencja jest jedną komórką żyjącą, a następnie na zawsze martwą.
Motywacja tego pytania polega na tym, że jest to odpowiednik funkcji zajętego bobra, ale zdecydowanie mniej skomplikowane, ponieważ mamy ograniczoną pamięć. Będzie to również niezła sekwencja do włączenia w OEIS.
Dla N = 3 długość sekwencji wynosi 3, dowolny wzór po lewej stronie osiąga całkowicie czarny kwadrat 3 x 3, a następnie umiera. (Wszystkie wzory, które są częścią 1 cyklu usunięte).
źródło
Odpowiedzi:
C ++ do N = 6
Ta technika koncentruje się wokół szybkiej funkcji następnego stanu. Każda tablica jest reprezentowana jako maska bitowa N ^ 2 bitów, a do obliczenia następnego stanu dla wszystkich komórek jednocześnie wykorzystywane są sztuczki typu „bit-twiddly”.
next
kompiluje do około200100 instrukcji montażu dla N <= 8. Następnie wykonujemy standardowe try-all-stany-aż-one się powtarzają i wybieramy najdłuższą.Trwa kilka sekund do 5x5, kilka godzin dla 6x6.
źródło
next
licząc, a nie sortując.#define H(x,y){x^=y;y&=(x^y);}
a potem coś w styluH(n1,n2);H(n3,n4);H(n5,n6);H(n7,n8);H(n1,n3);H(n5,n7);H(n2,n4);H(n6,n8);H(n1,n5);H(n3,n7);H(n2,n6);H(n2,n3);H(n2,n5); return n2 & (b | n1) & ~(n3|n4|n5|n6|n7|n8) & ALL;
Widzę następujące możliwe rozwiązania:
Next(board)
funkcję, widzimy, że ma ona pewne zalety, chociaż nie tak wiele, jak początkowo miałem nadzieję.Prev2
.Nie sądzę, że mikrooptymalizacja pozwoli mi dogonić kod Keitha, ale ze względu na zainteresowanie opublikuję to, co mam. To rozwiązuje N = 5 w ciągu około minuty na maszynie 2 GHz przy użyciu Mono 2.4 lub .Net (bez PLINQ) i po około 20 sekundach przy użyciu PLINQ; N = 6 uruchomień przez wiele godzin.
źródło
Czynnik
Niektóre statystyki czasowe:
A testowanie 5 rozbiło REPL. Hmph. Najbardziej nieefektywną częścią programu jest prawdopodobnie funkcja sekwencji gry. Może później będę mógł to poprawić.
źródło