Chodzi tutaj o stworzenie niemal powtarzalnego wzoru. Oznacza to, że konstruowana sekwencja zmienia się w ostatniej chwili, aby uniknąć powtórzenia się niektórych podsekwencji. Należy unikać następstw typu AA i ABA (gdzie B nie jest dłuższy niż A).
Przykłady:
Zacznę od listy wszystkich małych przykładów, aby mój opis był jaśniejszy. Zacznijmy od 0.
Ważne: 0 Nieprawidłowy: 00 (wzór AA) Ważne: 01 Nieprawidłowy: 010 (wzór ABA) Nieprawidłowy: 011 (wzór AA) Ważne: 012 Ważne: 0120 Nieprawidłowy: 0121 (wzór ABA) Nieprawidłowy: 0122 (wzór AA) Nieprawidłowy: 01200 (wzór AA) Nieprawidłowy: 01201 (wzór ABA; 01-2-01) Nieprawidłowy: 01202 (wzór ABA) Ważne: 01203
Teraz mocno wierzę, że a 4nigdy nie jest potrzebne, chociaż nie mam dowodu, ponieważ z łatwością znalazłem sekwencje setek znaków, które używają tylko 0123. (Prawdopodobnie jest to ściśle związane z tym, jak potrzebne są tylko trzy znaki, aby mieć nieskończone ciągi znaków, które nie mają żadnych wzorców AA. Jest tam strona Wikipedii .)
Wejście wyjście
Dane wejściowe to pojedyncza, dodatnia, niezerowa liczba całkowita n. Możesz to założyć n <= 1000.
Dane wyjściowe to nsekwencja -znakowa bez podsekwencji pasujących do wzorca zabronionego (AA lub ABA).
Przykładowe wejścia i wyjścia
>>> 1 0 >>> 2 01 >>> 3 012 >>> 4 0120 >>> 5 01203 >>> 50 01203102130123103201302103120132102301203102132012
Zasady
- Dozwolone
0123są tylko postacie . - B nie jest dłużej niż A. Ma to na celu uniknięcie sytuacji, w której
012345musi być przestrzegana przez6ponieważ0123451ma to:1-2345-1. Innymi słowy, sekwencja byłaby trywialna i nieciekawa. nmogą być wprowadzane dowolną pożądaną metodą, z wyjątkiem kodowania na stałe.- Dane wyjściowe mogą być listą lub łańcuchem, w zależności od tego, co jest łatwiejsze.
- Bez brutalnej siły ; czas pracy powinien być rzędu minut, najwyżej godziny na naprawdę wolnej maszynie
n=1000. (Ma to na celu zdyskwalifikowanie rozwiązań, które po prostu przechodzą przeznpermutacje na całej długości{0,1,2,3}, dzięki czemu lewy i podobne lewy są niedozwolone). - Standardowe luki są jak zwykle niedozwolone.
- Punktacja jest w bajtach. To jestgolf-golf, więc wygrywa najkrótszy wpis (prawdopodobnie - patrz bonus).
- Bonus: wybierz najniższą dozwoloną cyfrę na każdym kroku. Jeśli
1i3są możliwe opcje dla następnej cyfry w sekwencji, wybierz1. Odejmij 5 bajtów od swojego wyniku. Zwróć jednak uwagę na notatkę poniżej.
Uwaga!
Ślepe zaułki są możliwe. Twój program lub funkcja musi tego unikać. Oto przykład:
Kikut: 0120310213012310320130210312013210230120310213201230210312013023103201230213203102301203210231201302103123013203102130120321023013203123021032012310213012031023013201221 Kikut: 0120310213012310320130210312013210230120310213201230210312013023103201230213203102301203210231201302103123013203102130120321023013203123021032012310213012031023013201221 Kikut: 01203102130123103201302103120132102301203102132012302103120130231032012302132031023012032102312013021031230132031021301203210230132031230210320123102130120310230132012 Kikut: 01203102130123103201302103120132102301203102132012302103120130231032012302132031023012032102312013021031230132031021301203210230132031230210320123102130120310230132031010
Każda z tych sekwencji nie może być dalej przedłużana (bez użycia a 4). Ale zauważ też, że istnieje zasadnicza różnica między pierwszymi dwoma a drugimi dwoma. Zastąpię początkową podsekwencję literą, Xaby to było jaśniejsze.
Kikut: X2130120 Kikut: X2130123 Kikut: X320 Kikut: X321301203102130
Dwie ostatnie cyfry Xto 10, więc jedynymi możliwymi opcjami dla następnej cyfry są 2i 3. Wybór 2prowadzi do sytuacji, w której sekwencja musi się zakończyć. Chciwy algorytm tu nie zadziała. (W każdym razie nie bez powrotu).
n, ale biorąc pod uwagę, że pniaki znalezione przez mój program wydają się wydłużać średnio o 10 cyfr za każdym razem, jestem pewien, że istnieje nieskończona sekwencja. Nie jestem pewien, w jaki sposób można przetestować częściowo chciwy algorytm dla dowolnie dużych sekwencji. Mógłbym ograniczyć wymaganie do n= 1000 i po prostu nie martwić się o wyższe n.
AAnaprawdę jest typ, ABAgdzie Bjest pusty. Może to pomóc w usprawnieniu niektórych rozwiązań.
n? Jeśli ktoś poda heurystyczny algorytm na wpół chciwy, jak sprawdzisz, czy nie ma on problemów na bardzo dużej długości? Ogólny problem jest interesujący i nie udało mi się znaleźć niczego na temat unikania wzoru, w którym ograniczamy długość części wzoru. Jeśli ktoś może stworzyć ogólny przepis, oczekuję, że będzie to najlepsze podejście.