Rozważ ciąg binarny S
o długości n
. Indeksując od 1
, możemy obliczyć odległości Hamminga pomiędzy S[1..i+1]
i S[n-i..n]
dla wszystkich i
w kolejności od 0
do n-1
. Odległość Hamminga między dwoma strunami o równej długości jest liczbą pozycji, w których odpowiednie symbole są różne. Na przykład,
S = 01010
daje
[0, 2, 0, 4, 0].
Wynika to z tego, że 0
mecze 0
, 01
odległość Hamminga dwa do 10
, 010
mecze 010
, 0101
odległość Hamminga cztery do, 1010
a ostatecznie 01010
dopasowuje się.
Interesują nas jednak tylko wyjścia, w których odległość Hamminga wynosi najwyżej 1. W tym zadaniu Y
zgłosimy, czy odległość Hamminga wynosi co najwyżej jeden, a w N
przeciwnym razie. W powyższym przykładzie otrzymalibyśmy
[Y, N, Y, N, Y]
Zdefiniuj f(n)
liczbę odrębnych tablic Y
s i N
s, które otrzymujesz podczas iteracji wszystkich 2^n
różnych możliwych ciągów bitów S
długości n
.
Zadanie
Aby zwiększyć, n
zaczynając od 1
, twój kod powinien wypisywać f(n)
.
Przykładowe odpowiedzi
Dla n = 1..24
, poprawne odpowiedzi są:
1, 1, 2, 4, 6, 8, 14, 18, 27, 36, 52, 65, 93, 113, 150, 188, 241, 279, 377, 427, 540, 632, 768, 870
Punktacja
Twój kod powinien powtarzać się od n = 1
udzielenia odpowiedzi po n
kolei. Poświęcę cały bieg, zabijając go po dwóch minutach.
Twój wynik jest najwyższy n
w tym czasie.
W przypadku remisu pierwsza odpowiedź wygrywa.
Gdzie będzie testowany mój kod?
Uruchomię twój kod na moim (nieco starym) laptopie z systemem Windows 7 pod cygwin. W związku z tym proszę udzielić wszelkiej możliwej pomocy, aby ułatwić to.
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 = 40 w Rust za pomocą CryptoMiniSat, autor: Anders Kaseorg. (W maszynie wirtualnej gościa Lubuntu pod Vbox.)
- n = 35 w C ++ przy użyciu biblioteki BuDDy, Christian Seviers. (W maszynie wirtualnej gościa Lubuntu pod Vbox.)
- n = 34 w Clingo autorstwa Andersa Kaseorga. (W maszynie wirtualnej gościa Lubuntu pod Vbox.)
- n = 31 w Rust przez Andersa Kaseorga.
- n = 29 w Clojure autorstwa NikoNyrh.
- n = 29 w C według bartavelle.
- n = 27 w Haskell według bartavelle
- n = 24 w Pari / gp przez alephalpha.
- n = 22 w Python 2 + pypy przeze mnie.
- n = 21 w Mathematica przez alephalpha. (Własne zgłoszenie)
Przyszłe nagrody
Dam teraz nagrodę w wysokości 200 punktów za każdą odpowiedź, która na mojej maszynie osiągnie n = 80 w ciągu dwóch minut.