Definicja
Nazwijmy (nieskończoną) sekwencję całkowitą uniwersalną, jeśli zawiera ona każdą skończoną sekwencję całkowitą jako ciągłą podsekwencję.
Innymi słowy, sekwencja liczb całkowitych (a 1 , a 2 ,…) jest uniwersalna wtedy i tylko wtedy, gdy dla każdej skończonej sekwencji liczb całkowitych (b 1 ,…, b n ) istnieje przesunięcie k takie, że (a k + 1 ,…, A k + n ) = (b 1 ,…, b n ) .
Na przykład sekwencja dodatnich liczb pierwszych nie jest uniwersalna, między innymi z następujących powodów.
Nie zawiera ujemnych liczb całkowitych, 1 ani liczb zespolonych.
Chociaż zawiera 3 , nie zawiera ciągłej podsekwencji (3, 3, 3) .
Chociaż zawiera 2 i 5 , nie zawiera ciągłych podsekwencji (2, 5) .
Chociaż zawiera ciągłe podsekwencje (7, 11, 13) , nie zawiera ciągłych podsekwencji (13, 11, 7) .
Zadanie
Wybierz dowolną uniwersalną sekwencję liczb całkowitych (a 1 , 2 ,…) i zaimplementuj ją w wybranym przez siebie języku programowania, przestrzegając następujących zasad.
Możesz przesłać pełny program lub funkcję.
Masz trzy opcje wejścia / wyjścia:
Nie wprowadzaj danych i wydrukuj lub zwróć całą sekwencję.
Weź indeksu n jako wejście i wydrukować lub powrócić do n .
Weź indeks n jako dane wejściowe i wydrukuj lub zwróć (a 1 ,…, a n ) .
W przypadku opcji We / Wy 2 i 3 możesz użyć indeksowania opartego na 0 , jeśli wolisz.
Twoje przesłanie musi być deterministyczne: jeśli zostanie uruchomione wiele razy z tymi samymi danymi wejściowymi, musi dawać takie same wyniki.
Ponadto, o ile nie jest to od razu oczywiste, udowodnij, że wybrana sekwencja jest uniwersalna. Twój dowód może nie zależeć od niesprawdzonych przypuszczeń.
Obowiązują standardowe zasady gry w golfa . Niech wygra najkrótszy kod w bajtach!
Odpowiedzi:
Łuska , 5 bajtów
Spowoduje to wydrukowanie nieskończonej listy
Wypróbuj online! lub znajdź pierwszy indeks swojej sekwencji . (Zajmuje dużo pamięci dla większości sekwencji)
Wyjaśnienie:
W Husk
Ṗ
zachowuje się ładnie dla nieskończonych list. Widać, że to zachowanie tutajźródło
Q
działa. (Myślę, że mam, ale nie jestem pewien.)Ṗ
, a nieQ
Python 2 ,
494643 bajtyf(n)
Zwraca n tylko. Używa najmniejszej cyfry w bazie, aby wyodrębnić jedną z wyższych cyfr.n
d
Wypróbuj online! Ten skrypt (dzięki uprzejmości Dennisa) pobiera dowolną skończoną sekwencję i daje
n
początek sekwencji.Wyjaśnienie
Na przykład,
n
w przedziale3141592650
do3141592659
,d=10
a ostatnia cyfran
wybiera jedną z pozostałych cyfr. Następnie dodajemy,-d/2
aby uzyskać wartości ujemne.Autonomiczna alternatywa, również 43 bajty:
źródło
len(`n`)
zamiastlen(str(n))
.n=2**63-1
ponieważ reprezentacja zostanieL
dołączona (str(n)
rozwiązałaby to przez trzy bajty, jeśli to konieczne).Brachylog 2, 11 bajtów
Wypróbuj online!
Próbowałem też algorytmu wykorzystującego partycjonowane partycje na liście, ale nie był on krótszy. Jest to generator, który wytwarza nieskończony strumień liczb całkowitych jako wynik; link TIO ma nagłówek do wydrukowania pierwszych dziesięciu tysięcy z nich.
Wyjaśnienie
Program rozpoczyna od wypróbowania wszystkich możliwych liczb całkowitych po kolei (
≜
domyślnie wypróbowuje wszystkie pozostałe możliwości, dla liczb całkowitych). To 0, 1, -1, 2, -2 itd. (Chociaż ujemne liczby całkowite nie osiągają końca programu). Jest to jedyny „nieskończony” krok programu; wszystkie pozostałe są skończone.~×
następnie generuje wszystkie możliwe faktoryzacje liczby całkowitej, traktując różne rzędy jako różne, i używając tylko wartości od 2 w górę (więc jest tylko skończonych wiele); zauważ, że w rozkładzie na czynniki dozwolone są liczby złożone, a nie tylko liczby pierwsze. Oznacza to, że wszystkie możliwe sekwencje liczb całkowitych ≥ 2 zostaną wygenerowane na tym etapie w pewnym momencie wykonywania funkcji (ponieważ taka sekwencja niekoniecznie ma jakiś produkt, a ten produkt zostanie wygenerowany w pewnym momencie na początku≜
).Następnie musimy zmapować zestaw tych sekwencji na zbiór wszystkich sekwencji całkowitych, co odbywa się w dwóch krokach: odejmując 2 (
-₂
) od każdego elementu (ᵐ
), dając nam zestaw wszystkich nieujemnych sekwencji całkowitych, a następnie biorąc plus lub minus (~ȧ
tzn. „wartość, której wartością bezwzględną jest”) każdy element (ᵐ
). Ten ostatni krok jest oczywiście niedeterministyczny, więc Brachylog traktuje go jako generator, generując wszystkie możliwe listy, których elementy są plus lub minus odpowiedni element listy wejściowej. Oznacza to, że mamy teraz generator wszystkich możliwych sekwencji liczb całkowitych i generuje je w kolejności, która oznacza, że wszystkie są generowane (w szczególności kolejność, którą otrzymujesz, jeśli weźmiesz wartość bezwzględną każdego elementu, dodaj 2 do każdego element, a następnie uporządkuj według produktu uzyskanych elementów).Niestety pytanie wymaga pojedynczej sekwencji, a nie sekwencji, więc potrzebujemy jeszcze dwóch poleceń. Po pierwsze,
≜
Brachylog prosi o jawne wygenerowanie sekwencji sekwencji ściśle (w przeciwieństwie do tworzenia struktury danych opisującej koncepcję sekwencji wygenerowanej tą metodą, a nie generowania sekwencji dopóki nie będzie to konieczne); zarówno to sprawia, że program jest szybszy w tym przypadku, i zapewnia, że dane wyjściowe są wytwarzane w żądanej kolejności. Wreszcie,∋
powoduje , że generator wysyła elementy poszczególnych sekwencji pojedynczo (przejście do następnej sekwencji, gdy wypisze wszystkie elementy poprzedniej).Wynik końcowy: każda możliwa sekwencja liczb całkowitych jest generowana i wyprowadzana, po jednym elemencie na raz, i wszystkie łączone razem w jedną uniwersalną sekwencję.
źródło
Pyth - 11 bajtów
n
produkt kartezjański mocy[-n, n]
dla wszystkichn
.Wypróbuj online tutaj (ostatecznie).
źródło
Python 2 ,
10099 bajtówitertools
wbudowanej pętli bez końca.Wypróbuj online!
W nieskończoność wypisuje wszystkie permutacje
n
zakresu powtórzonych liczb całkowitych[-n; n)
dla wszystkich nieujemnych liczb całkowitychn
.Za
k
pomocą tej zmodyfikowanej wersji można wyszukać pierwsze przesunięcie dowolnego podsekwencji .źródło
while~0:
. Heh heh ...itertools.count
Perl 6 , 91 bajtów
Wypróbuj online!
To używa metody podobnej do niektórych innych odpowiedzi. Używa produktów kartezjańskich do drukowania elementów
(-1,0,1)
, następnie wszystkich uporządkowanych par elementów w(-2,-1,0,1,2)
, a następnie wszystkich zamówionych trojaczek elementów w(-3,-2,-1,0,1,2,3)
itp.Jestem nowy w Perlu, więc może być więcej golfa, które można by zrobić.
Bardziej czytelna wersja:
źródło