Wyobraź sobie „drut”, który ma n
spacje. Wyobraź sobie dalej, że w tym przewodzie są „elektrony”. Te elektrony żyją tylko przez jedną jednostkę czasu. Wszelkie przestrzenie w przewodzie, które sąsiadują z dokładnie jednym elektronem, stają się elektronem. W terminologii Game of Life tak właśnie jest B1/S
.
Na przykład jest to drut o długości 10, z okresem 62.
Zasady
- Dane wejściowe
n
to pojedyncza, dodatnia liczba całkowita. - Wyjściem musi być pojedyncza liczba całkowita oznaczająca okres drutu o długości n.
- Stanem początkowym jest pojedynczy elektron na jednym końcu drutu.
- Okres niekoniecznie obejmuje stan początkowy. Niektóre długości nigdy nie wracają do stanu początkowego, ale wszystkie są okresowe.
- Drut statyczny (tj. Bez elektronów) ma okres 1.
- Warunki brzegowe nie są okresowe. Oznacza to, że drut nie jest w żaden sposób toroidalny.
Przypadki testowe
Specjalne podziękowania dla orlp za stworzenie tej listy. (Sprawdziłem to do n = 27).
1 1
2 2
3 1
4 6
5 4
6 14
7 1
8 14
9 12
10 62
11 8
12 126
13 28
14 30
15 1
16 30
17 28
18 1022
19 24
20 126
21 124
22 4094
23 16
24 2046
25 252
26 1022
27 56
28 32766
29 60
30 62
31 1
32 62
33 60
34 8190
35 56
36 174762
37 2044
38 8190
39 48
40 2046
41 252
42 254
43 248
44 8190
45 8188
Tutaj możesz zobaczyć przypadki testowe dla n = 2 do 21 w moim symulatorze Game-of-Life: Wariacje życia .
EDYCJA: sekwencja tutaj została opublikowana jako A268754 !
code-golf
cellular-automata
El'endia Starman
źródło
źródło
2^n-1
, ponieważ jest to liczba możliwych niezerowych stanów „drutu”The period does not necessarily include the starting state. Some lengths never return to the starting state, but all of them are periodic.
Czy masz przykład?Odpowiedzi:
Python 2,
14814287 bajtówWykorzystuje algorytm wykrywania cyklu Brenta , a tym samym działa szybko.
Napisałem również animację w języku Python (zarówno prace 2, jak i 3). To musi
pyglet
biec. Możesz wyświetlić animację, uruchamiając:(Nie krępuj się pobrać listy i sprawdzić kod przed uruchomieniem.) Możesz nacisnąć klawisze + i -, aby zwiększyć / zmniejszyć wyświetlaną n .
I na koniec, dla osób zainteresowanych dalszym badaniem tej sekwencji numerów, oto czytelna wersja (została użyta do wygenerowania powyższych przypadków testowych):
źródło
Mathematica, 127 bajtów
Wyjaśnienie
Reguła 18 :
Przypadki testowe
źródło
Python 2, 68 bajtów
Wykrywanie cyklu może być lepsze, ale krok iteracyjny jest przyjemny.
Reprezentując tablicę jako liczbę binarną
k
, aktualizacji można dokonać, biorąc XORk
przesuniętego jednego w lewo/2
i jednego w prawo*2
, a następnie skracając don
bajtów jako%2**n
.źródło
Python
32,134121118 bajtówZasadniczo to samo, co moja odpowiedź w języku Pyth , ale dostosowałem ją nieco z powodu braku niektórych wbudowanych funkcji w języku Python.
Wersja bez golfa:
źródło
Pyth,
3936 bajtówUżywa funkcji „skumulowanego punktu stałego” do iteracji do momentu, gdy konfiguracja się powtórzy, i zwraca wszystkie konfiguracje pośrednie jako listę list. Działa to, ponieważ reguły są deterministyczne, a konfiguracja następnej generacji jest funkcją bieżącej konfiguracji. Oznacza to, że gdy ta sama konfiguracja pojawi się ponownie, automaty zakończą cykl.
Po osiągnięciu tego (ostatniej iteracji cyklu) wywołuje funkcję następnej generacji po raz ostatni na ostatnim elemencie listy „historii”, aby uzyskać następną konfigurację (czyli konfigurację początkową cyklu), i znajdź jego indeks w historii. Teraz okres jest po prostu długością (1 + wskaźnik końca cyklu) minus wskaźnik początku cyklu.
W pythonowym pseudokodzie:
Zestaw testowy zabiera zbyt dużo czasu, aby serwer go zabił, więc musisz użyć zwykłego programu i przetestować go jeden po drugim lub zainstalować Pyth (jeśli nie masz) i użyć skryptu, aby go przetestować.
źródło
Galaretka,
191817 bajtówTen kod oblicza pierwsze 2 n stanów, więc nie jest szczególnie szybki ani nie zajmuje mało pamięci ...
Wypróbuj online! lub sprawdź pierwsze 16 przypadków testowych .
Wersja alternatywna, 13 bajtów (niekonkurująca)
Wersje Galaretki po tym wyzwaniu mają wbudowane wykrywanie pętli, dzięki czemu rozwiązanie jest zarówno krótsze, jak i bardziej wydajne.
To z łatwością obsługuje ostatni przypadek testowy. Wypróbuj online!
Jak to działa
Zauważ, że łącze pomocnicze jest stosowane do 2 n w pierwszej iteracji, która nie koduje prawidłowego stanu. Jednak ((2 n ÷ 2) ^ (2 n × 2))% 2 n = (2 n - 1 + 2 n + 1 )% 2 n = 2 n - 1 , co jest jednym z możliwych stanów początkowych.
Ponieważ zapętlamy 2 n + 1 razy, gwarantujemy, że napotkamy dwa razy stan, dzięki czemu wykrywanie pętli zakończy się powodzeniem.
źródło
CJam,
4134312725 bajtówDzięki Dennis za oszczędność 3 bajtów. Pożyczenie pomysłu z jego odpowiedzi na żelki uratowało kolejne 4.
Sprawdź to tutaj.
Wyjaśnienie
Przedstawiam drut po prostu jako liczbę całkowitą (której bity wskazują pozycje elektronów) zamiast używania rzeczywistej listy bitów. Stan jest aktualizowany za pomocą dość prostych obliczeń bitowych.
Aby znaleźć okres, w którym zbieramy wszystkie wyniki pośrednie na stosie, uruchom symulację dla 2 kroków n-1 +1, a następnie określ okres jako liczbę elementów od ostatniego wystąpienia stanu końcowego (plus 1).
Oto podział kodu:
źródło
JavaScript (ES6) 99
104Test
źródło
Haskell, 170 bajtów
x!p
daje element o indeksie p, jeśli jest w granicach, w przeciwnym razie 0.n
oblicza następny krok.g i
dajei
th krok.c x
podaje okres, jeśli zaczyna się odx
.f
otacza to wszystko razem.(Uwaga: wysłane z telefonu, który ma interpretera uścisków, który nie jest w pełni funkcjonalny, więc mogą mieć literówki).
źródło
MATL ,
38373635 bajtówKorzysta z pętli, która oblicza nowe stany, dopóki nowy stan nie będzie równy jednemu z poprzednich. Każdy stan jest wektorem zer i jedynek. Wektory te są przechowywane jako rzędy rosnącej tablicy 2D.
Obliczanie każdego nowego stanu odbywa się przez zebranie bieżącego stanu z sekwencją
[1,0,1]
, zachowanie tylko środkowej części i ustawienie dla0
dowolnego wpisu, który nie jest1
.EDYCJA (13 maja 2016 r.) Kod w poniższym linku został nieco zmodyfikowany zgodnie ze zmianami wprowadzonymi w języku po napisaniu tej odpowiedzi
Wypróbuj online!
źródło
Perl 6, 81 bajtów
Rozbudował się i trochę nie golfił
Trochę wyjaśnienia:
[op]
zmniejsza listę za pomocą op. Na przykład[+] @list
suma@list
R
to meta-op, który odwraca argumenty podane dla op. Na przykład1 R- 3
spowoduje 2.źródło
C ++, 211 bajtów
Grał w golfa
Z dodatkową spacją dla czytelności
Dobra praktyka dla zestawu bitów C ++; oraz wspaniałą edukację zdobywającą wiedzę na temat algorytmu detekcji cyklu Brenta (używanego przez @orlp)
źródło
Pyth, 95 bajtów
Możesz to wypróbować tutaj .
źródło
Pyth, 29 bajtów
Używa algorytmu
a(n+1) = ((a(n) << 1)^(a(n) >> 1)) % (2 ** N)
.źródło
Rubinowy, 72 bajty
Funkcja anonimowa.
źródło