Zadaniem jest jak najszybsze obliczenie OEIS A005434 .
Rozważ ciąg binarny So długości n. Indeksując od 1, możemy ustalić, czy dokładnie S[1..i+1]pasuje S[n-i..n]do wszystkich iw kolejności od 0do n-1. Na przykład,
S = 01010
daje
[Y, N, Y, N, Y].
Jest tak, ponieważ 0dopasowuje 0, 01nie pasuje 10, 010dopasowuje 010, 0101nie pasuje 1010 i ostatecznie 01010dopasowuje się do siebie.
Zdefiniuj f(n)liczbę odrębnych tablic Ys i Ns, które otrzymujesz podczas iteracji wszystkich 2^nróżnych możliwych ciągów bitów Sdługości n.
Spostrzegający zauważy, że to pytanie jest prostszym wariantem innego mojego ostatniego pytania . Oczekuję jednak, że sprytne sztuczki mogą to uczynić o wiele szybszym i łatwiejszym.
Zadanie
Aby zwiększyć, nzaczynając od 1, twój kod powinien wypisywać n, f(n).
Przykładowe odpowiedzi
Dla n = 1..24, poprawne odpowiedzi są:
1, 2, 3, 4, 6, 8, 10, 13, 17, 21, 27, 30, 37, 47, 57, 62, 75, 87, 102, 116, 135, 155, 180, 194
Punktacja
Twój kod powinien powtarzać się od n = 1udzielenia odpowiedzi po nkolei. Poświęcę czas na cały bieg, zabijając go po dwóch minutach.
Twój wynik jest najwyższy nw tym czasie.
W przypadku remisu pierwsza odpowiedź wygrywa.
Gdzie będzie testowany mój kod?
Uruchomię twój kod pod Virtualbox na maszynie wirtualnej gościa Lubuntu (na moim hoście Windows 7).
Mój laptop ma 8 GB pamięci RAM i procesor Intel i7 5600U@2.6 GHz (Broadwell) z 2 rdzeniami i 4 wątkami. Zestaw instrukcji obejmuje SSE4.2, AVX, AVX2, FMA3 i TSX.
Wiodące wpisy według języka
- n = 599 w Rust bu Anders Kaseorg.
- n = 30 w C według Grimy'ego. Wersja równoległa osiąga 32, gdy działa natywnie w cygwin.