Wprowadzenie
Sekwencja Gijswijta ( A090822 ) jest naprawdę, NAPRAWDĘ powolna. Ilustrować:
- Pierwsze 3 pojawiają się w 9 kadencji (w porządku).
- Pierwsze 4 pojawiają się w 220 kadencji (daleko, ale wykonalne).
- Pierwsze 5 pojawia się w (w przybliżeniu) 10 ^ (10 ^ 23) th (tylko nie).
- Nikt tak naprawdę nawet nie wie, gdzie jest pierwsza 6 ... podejrzewa się, że jest na ...
2 ^ (2 ^ (3 ^ (4 ^ 5))) termin.
Możesz założyć, że nie będziesz musiał mieć do czynienia z dwucyfrowym numerem.
Sekwencja jest generowana w następujący sposób:
- Pierwszy termin to 1.
- Każdy następny termin to ilość powtarzających się „bloków” poprzedzających go (jeśli istnieje wiele powtarzających się „bloków”, używana jest największa liczba powtarzających się bloków).
Aby to wyjaśnić, oto kilka pierwszych warunków.
1 -> 1, 1
(jeden powtarzający się blok ( 1
), więc zapisana cyfra to 1
)
1, 1 -> 1, 1, 2
(dwa powtarzające się bloki ( 1
), więc zapisana cyfra to 2
)
1, 1, 2 -> 1, 1, 2, 1
(jeden powtarzający się blok ( 2
lub 1, 1, 2
), więc zapisana cyfra to 1
)
1, 1, 2, 1 -> 1, 1, 2, 1, 1
(Masz pomysł)
1, 1, 2, 1, 1 -> 1, 1, 2, 1, 1, 2
1, 1, 2, 1, 1, 2 -> 1, 1, 2, 1, 1, 2, 2
(dwa powtarzające się bloki ( 1, 1, 2
), więc zapisana cyfra to 2
)
Zadanie
Twoim zadaniem jest, jak stwierdzono w pytaniu, wygenerowanie n cyfr sekwencji Gijswijt.
Instrukcje
- Wejście będzie liczbą całkowitą
n
. - Twój kod może wypisywać cyfry w dowolnej formie (lista, wiele wyników itp.).
To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach.
._
funkcji i innych przydatnych funkcjach w Pyth.CJam,
33313027 bajtówPodziękowania dla Petera Taylora za uratowanie 1 bajtu.
Sprawdź to tutaj.
Wyjaśnienie
źródło
CJam (
30 29 2724 bajtów)Demo online
To bardzo wspólny wysiłek Martina.
e`
) w celu identyfikacji powtórzeń należy do MartinaW$
celu uproszczenia zarządzania stosami$W>+
specjalnej obudowy, jak wyjaśniono w poniższym rozdzialeMoje pierwsze 30-bajtowe podejście:
Demo online
Sekcja
źródło
Haskell, 97 bajtów
Trzeci wiersz definiuje anonimową funkcję, która przyjmuje liczbę całkowitą i zwraca listę liczb całkowitych. Zobacz to w akcji.
Wyjaśnienie
Funkcja pomocnicza
f
konstruuje sekwencję w odwrotnej kolejności, rekurencyjnie sprawdzając, czy poprzednia sekwencja zaczyna się od powtarzanego bloku.k
to liczba powtórzeń ip
długość bloku.źródło
Pyth,
4138 bajtówWypróbuj online!
źródło
Siatkówka ,
6660 bajtówWejście jest jednostkową liczbą całkowitą używaną
!
jako cyfra (chociaż można ją zmienić na dowolny inny znak nienumeryczny). Dane wyjściowe to po prostu ciąg cyfr.Wypróbuj online! (Alternatywnie, dla wygody jest wersja, która pobiera dane dziesiętne. )
Do celów testowych można to znacznie przyspieszyć za pomocą niewielkiej modyfikacji, która pozwala na testowanie wejścia 220 w mniej niż minutę:
Wypróbuj online! ( Wersja dziesiętna. )
Jeśli chcesz przetestować jeszcze większe liczby, najlepiej po prostu podać trochę danych wejściowych i wstawić
:
po początkowej+
. Spowoduje to, że Retina wydrukuje bieżącą sekwencję za każdym razem, gdy zakończy obliczanie nowej cyfry (wszystkie cyfry będą wyłączone jeden po drugim).Wyjaśnienie
Rozwiązanie składa się z pojedynczego podstawienia wyrażenia regularnego, które jest wielokrotnie stosowane do danych wejściowych, aż wynik przestanie się zmieniać, co w tym przypadku dzieje się, ponieważ wyrażenie regularne już nie pasuje. Na
+
początku wprowadza się tę pętlę.1
Jest granica, która opowiada Retina tylko wymienić pierwszy mecz (ma to znaczenie tylko dla pierwszej iteracji). W każdej iteracji etap zastępuje jeden!
(od lewej) następną cyfrą sekwencji.Jak zwykle, jeśli potrzebujesz podkładu na grupy równoważące, odsyłam cię do mojej SO odpowiedzi .
Oto opatrzona komentarzem wersja wyrażenia regularnego. Pamiętaj, że celem jest przechwycenie maksymalnej liczby powtarzających się bloków w grupie
1
.Na koniec, po tym wszystkim, piszemy
$1
(usuwając w ten sposób!
), a także liczbę przechwyceń w grupie, z$#1
którymi odpowiada maksymalna liczba powtórzeń.źródło
Rubinowy, 84 bajtów
Odpowiedź Retiny zainspirowała mnie do opracowania rozwiązania opartego na wyrażeniach regularnych, aby znaleźć najlepszą sekwencję zamiast jakoś zliczać sekwencje w tablicy, ale z mniejszym geniuszem (negatywne spojrzenia z kwantyfikatorami nie są dozwolone w Ruby, więc wątpię W każdym razie mógłbym bezpośrednio przenieść odpowiedź Retiny)
Biorąc pod uwagę już wygenerowaną sekwencję
s
, odwzorowuje ona wszystkiei
od1
dos.length
(n
w tym przypadku była używana do zapisywania bajtów odn>=s.length
), a następnie używa tego wyrażenia regularnego, aby pomóc obliczyć liczbę powtórzeń podsekwencji o długościi
:Jeśli znaleziono dopasowanie o tej długości, oblicza liczbę powtórzeń, dzieląc długość danego dopasowania
$&
przezi
długość podsekwencji; jeśli nie znaleziono dopasowania, jest traktowane jak1
. Następnie funkcja wyszukuje maksymalną liczbę powtórzeń z tego odwzorowania i dodaje tę liczbę na końcu ciągu.źródło