Rozpoczynając od łańcucha ABC
, rozważ wynik wielokrotnego dołączania do siebie ostatniej połowy siebie (użycie większej połowy, jeśli długość jest nieparzysta).
Otrzymujemy postęp:
ABC
ABCBC
ABCBCCBC
ABCBCCBCCCBC
ABCBCCBCCCBCBCCCBC
etc...
Niech S
reprezentuje wynikowy nieskończony ciąg (lub sekwencję), który powstaje, ponieważ ta procedura jest powtarzana na zawsze.
Cel
Celem tego wyzwania kodu jest znalezienie indeksu pierwszego wystąpienia uruchomień C
w S
.
Na początku jest to łatwe: C
najpierw pojawia się przy indeksie 2
, CC
o 4
, CCC
o 7
, CCCC
o 26
, ale CCCCC
cały czas o indeksie 27308
! Potem skończyła się moja pamięć.
Zwycięzcą zostanie zgłoszenie, które poprawnie generuje najwięcej uruchomionych indeksów (w kolejności, zaczynając od C
). Możesz użyć dowolnego algorytmu, ale wyjaśnij go, jeśli nie używasz podstawowej brutalnej siły. Dane wejściowe i wyjściowe mogą mieć dowolny łatwy do zrozumienia format.
Ważna uwaga: oficjalnie nie wiem, czy S
faktycznie zawiera wszystkie serie C
. To pytanie pochodzi od tego z Mathematics Stack Exchange , w którym autor również nie znalazł CCCCCC
. Jestem ciekawy, czy ktoś tu może. (To pytanie z kolei oparte jest na moim pierwotnym pytaniu na ten temat ).
Jeśli udowodnisz, że nie wszystkie serie C
występują S
, wygrasz automatycznie, ponieważ to pytanie nie będzie już ważne. Jeśli nikt nie może tego udowodnić ani znaleźć, CCCCCC
zwycięzcą zostanie osoba, która uzyska najwyższą dolną granicę indeksu CCCCCC
(lub cokolwiek, co będzie największym nierozstrzygniętym przebiegiem, jeśli CCCCCC
zostanie znaleziony).
Aktualizacja: Ogromne pochwały dla isaacga i res, którzy znaleźli CCCCCC
przy indeksie astronomicznym 2,124 * 10 ^ 519. W tym tempie nie wyobrażam sobie znalezienia CCCCCCC
jakiejkolwiek metody opartej na brutalnej sile. Dobra robota chłopaki!
źródło
CCCCC
przy indeksie 27308, ale później brzmi to tak, jakbyś nie wiedział, gdzie występuje po raz pierwszy. Miałeś na myśliCCCCCC
?Odpowiedzi:
CCCCCC znaleziono w 2.124 * 10 ^ 519.
Precyzyjny wskaźnik jest 2124002227156710537549582070283786072301315855169987260450819829164756027922998360364044010386660076550764749849261595395734745608255162468143483136030403857241667604197146133343367628903022619551535534430377929831860918493875279894519909944379122620704864579366098015086419629439009415947634870592393974557860358412680068086381231577773140182376767811142988329838752964017382641454691037714240414750501535213021638601291385412206075763857490254382670426605045419312312880204888045665938646319068208885093114686859061215
Znaleziono przez res, używając (starej wersji) kodu poniżej, po 3,5 godzinach wyszukiwania.
Wokół tego indeksu ciąg jest następujący:
...BCCBCBCCCBCCCCCCBCCB...
Aby to zweryfikować, zmień wskazany wiersz w poniższym kodzie, aby rozpocząć od 2946, zamiast 5. Weryfikacja zajmuje 20 sekund.
Aktualizacja: ulepszony program. Stary program szukał ~ 10 razy więcej lokalizacji niż to konieczne.
Nowa wersja znajduje się za
CCCCCC
33 minuty.Jak działa kod: Zasadniczo patrzę tylko na regiony odpowiadające końcom przyrostowych ciągów i obliczam litery, patrząc rekurencyjnie z powrotem na oryginalny ciąg. Pamiętaj, że korzysta z tabeli notatek, która może zapełnić pamięć. W razie potrzeby nałóż czapkę na długość tabeli notatek.
Bieżące maks. Wyszukiwane: 4000 iteracji
CCCCCC
znaleziono w iteracji: 2946źródło
sys.setrecursionlimit(4000)
iULIMIT=4000
znalazł (za około 3,5 godziny w moim systemie) pierwsze wystąpienie CCCCCC o indeksie = 2.124 * 10 ^ 519. Dokładny indeks znajduje się w następnym komentarzu ...CCCCCC znaleziono w 2.124 * 10 ^ 519.
Do wyszukiwania użyto następującego kodu ruby
CCCCCC
.Indeks jest taki sam jak w odpowiedzi @isaacg .
Czas działania powyższego kodu dla 6 jest rzędu dziesięciu sekund na moim komputerze. Niemniej jednak wciąż szuka odpowiedzi na
CCCCCCC
(jeśli chcesz spróbować samodzielnie ustawić stałąSEARCH
na7
).Możesz użyć,
getc
aby znaleźć znak w określonej pozycji,i
tak jak ma to miejsce w ostatnim wierszu, w którym drukowany jest ciąg znaków wokół indeksu.źródło
(Nie odpowiedź, ale za długa na komentarz).
Poniżej znajduje się tłumaczenie w języku Python programu Ruby @ Howarda (przyspieszone trzykrotnie, ponieważ tylko jeden znajduje się
getc
w pętli wyszukiwania). W moim systemie znajduje to pierwsze C ^ 6 w ciągu 3 sekund. W ciągu 93 godzin nie znajduje C ^ 7 w 231 000 iteracjach, więc pierwsze C ^ 7 (jeśli istnieje) musi wystąpić po ostatnich 10 ^ 40677 pozycjach w nieskończonym ciągu.źródło