Rozważ następującą sekwencję:
0 1 3 2 5 4 8 6 7 12 9 10 11 17 13 14 15 16 23 ...
Wygląda całkiem bez wzoru, prawda? Oto jak to działa. Zaczynając od 0
, podskakuj n
liczby całkowite, n
zaczynając od 1
. To kolejny numer w sekwencji. Następnie dodaj wszystkie „pomijane” liczby, które nie były jeszcze widoczne w kolejności rosnącej. Następnie zwiększaj n
i przeskakuj od ostatniej dołączonej liczby. Powtórz ten wzór.
Na przykład, kiedy docieramy 11
, jesteśmy na n=5
. Zwiększamy n
się n=6
, wskoczyć do 17
, następnie dołączyć 13 14 15 16
od tych, które nie zostały jeszcze widoczne. Nasz następny skok to n=7
kolejny element w sekwencji 23
.
Wyzwanie
Biorąc pod uwagę dane wejściowe x
, wypisz x
th termin tej sekwencji, pierwsze x
warunki sekwencji lub zbuduj nieskończoną listę terminów sekwencji. Możesz wybrać indeksowanie 0 lub 1.
I / O i reguły
- Dane wejściowe i wyjściowe można podać dowolną dogodną metodą .
- Można założyć, że dane wejściowe i wyjściowe pasują do rodzimego typu liczb w twoim języku.
- Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
- Standardowe luki są zabronione.
- To jest golf golfowy, więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
Odpowiedzi:
JavaScript (ES7), 41 bajtów
Zwraca n-ty ciąg sekwencji, indeksowany 0.
Wypróbuj online!
W jaki sposób?
Główny przypadek:n>3
Pierwsze cztery terminy sekwencji są wyjątkowe, więc odłóżmy je na razie na bok.
Dla sekwencja wygląda następująco:n>3
Możemy zauważyć, że w rzeczywistości istnieją dwie przeplecione podsekwencje:
Większość wartości należy do podsekwencji dla której mamy po prostu:A
Niektóre inne wartości należą do podsekwencji (wyróżnionej nawiasami na powyższym diagramie), której indeksy są zgodne z sekwencją arytmetyczną 3, 3, 4, 6, 9, 13, 18, 24 ... i dla których mamy:B
gdzie jest indeksem w ciągu głównego, a k jest indeksem w pod-sekwencji B .n k B
Wskaźniki w sekwencji głównej są podane przez:B
Biorąc pod uwagę , wiemy, że odpowiadający termin w sekwencji głównej należy do B, jeśli n jest całkowitym rozwiązaniem równania kwadratowego:n B n
którego osobą dyskryminującą jest:
i którego pozytywnym rozwiązaniem jest:
Oczekujemy być liczbą całkowitą. Stąd test:Δ−−√
Przypadki specjalne:0≤n≤3
Dla dyskryminator jest ujemny, a przyjmowanie pierwiastka kwadratowego daje wynik w NaN . Dla n = 3 dyskryminatorem jestn<3 n=3 . Dlatego te pierwsze cztery terminy sekwencji są uważane za należące do podsekwencji B1 B .
Gdybyśmy po prostu zastosowali naszą standardową formułę n - ~ d / 2 , otrzymalibyśmy:
zamiast:
Dlatego XOR te wyniki XOR z0,1,2 and 1 .
źródło
Łuska , 12 bajtów
Wypróbuj online!
Wyprowadza jako nieskończoną listę. Oto wersja, która drukuje pierwsze N. .
Wyjaśnienie
źródło
Haskell , 43 bajty
Wypróbuj online!
Definiuje nieskończoną listę:
źródło
Galaretka , 15 bajtów
Jest to pełny program, który, biorąc pod uwagę n , wypisuje pierwsze n elementów sekwencji.
Wypróbuj online!
Jak to działa
źródło
C (gcc),
736764 bajtówWypróbuj online!
Definiuje funkcję,
f
która pobiera indeksowanie 0n
i generujen
liczbę th w sekwencji.Możemy przeanalizować sekwencję w następujący sposób:
Najpierw zajmiemy się środkową sekcją:
Zauważ, że argumenty po lewej stronie (4, 6, 9, 13, ...) są zgodne ze wzorem: najpierw dodaj dwa, następnie dodaj trzy, następnie dodaj cztery i tak dalej. Zaczynamy od
t=4
i dodajemyd
(która zaczyna się od 2) każdą iterację pętli, zwiększającd
w tym procesie.Ciało pętli jest bardziej interesujące. Pamiętaj, że chcemy zmapować 4 do 5, 6 do 8, 9 do 12 itd .; to tylko dodanie,
d-1
jeślix
jestt
. Jednak ta logika występuje przed ostatnim przypadkiem,f(n) = n - 1
więc wiemy, że odejmiemy 1 na końcu. Dlatego możemy po prostu dodaćd
ifx == t
(x-t||(x+=d)
). Jednakże, musimy też wyrwać się z pętli natychmiast po tym - więc dodać , że abyd
dostać się absurdu wyglądzied+=x+=d
, który zawsze sprawi, żed<x
warunek nie powiedzie się.Obejmuje to wszystko oprócz pierwszych czterech wartości. Patrząc na nie dwójkowo, otrzymujemy:
Chcemy więc odwrócić ostatni kawałek, jeśli
2 <= x < 4
. Dokonuje się tego za pomocąx^x/2
.x/2
daje drugi najmniej znaczący bit, więc XOR to z oryginalnym numerem odwraca ostatni bit, jeśli liczba wynosi 2 lub 3.źródło
Galaretka ,
1310 bajtów-3 Dzięki Dennisowi (użyj indeksowania 0, aby zapisać 2 z konfiguracji sumy łącznej i ostatecznego zmniejszenia)
Monadyczny link akceptujący liczbę całkowitą, 0 -indexed n , która zwraca liczbę całkowitą, a (n)
Wypróbuj online!Lub zobacz zestaw testowy
źródło
ḶÄ+3i+’
, ale nie miałem pojęcia, jak radzić sobie z przypadkowymi skrzynkami.Ḷ»ạ¥3
zaḊ3,2;
- Odczuwana jak nie powinno być terser do tego kawałka.Ḷ»2Äi+_>2$
zapisuje 3 bajty z indeksowaniem opartym na 0.Perl 5 z
-pl
, 70 bajtówWypróbuj online!
źródło
MATL , 22 bajty
Zwraca pierwsze
n
warunki sekwencji.Wypróbuj online!
Wyjaśnienie
źródło
Haskell , 51 bajtów
Wypróbuj online!
Trochę dłużej niż odpowiedź Haskell Lynna , ale inne podejście może być interesujące.
źródło
Rubinowy , 73 bajty
Wypróbuj online!
Funkcja rekurencyjna, która zwraca pierwsze x liczb z listy.
źródło
QBasic, 58 bajtów
Wydaje na czas nieokreślony. Możesz dodać
SLEEP 1
wewnątrz pętli lub zrobić toLOOP WHILE b<100
coś takiego, aby zobaczyć wyniki.To po prostu implementuje specyfikację. Zauważ, że liczby, do których wracamy, zawsze będą liczbami między ostatnią przeskakiwaną liczbą a przeskakiwaną liczbą przed nią. Przechowujemy więc te granice jako
a
ib
i używamyFOR
pętli, aby wydrukować wszystkie liczby między nimi.źródło
05AB1E , 14 bajtów
Wypróbuj online!
źródło
R , 70 bajtów
Wypróbuj online!
F
stałej dzięki sugestii @JADsetdiff
zamiastx[x %in% y]
Poprzednia wersja (79 bajtów)
źródło
5 bytes
powoduje wiele ostrzeżeń!F/T
nie zostaną ponownie zdefiniowane w definicji funkcji. Nie modyfikuje (IIRC) globalnej wartości dlaF/T
Python 2 , 123 bajty
Wypróbuj online!
Biorąc pod uwagę wejście x, wypisz pierwsze x wyrażenia sekwencji,
Uczę się języka Python, a dzięki tym wyzwaniom wszystko staje się ciekawsze.
Edycja: gol trochę białych znaków
źródło
for n in range(1,z) if len(s) < z]; return s
:for n in range(1,z)if len(s)<z];return s
.Galareta , 16 bajtów
Wypróbuj online!
Jeden bajt dłuższy niż istniejąca odpowiedź Jelly, ale to może być trochę golfa.
RÄṬŻk²Ḋ$
może być krótszy.18 bajtów
Dłuższy, ale inny.
źródło
Rubinowy , 63 bajty
Wypróbuj online!
0-indeksowane. Prawdopodobnie można go zagrać w golfa.
źródło
Perl 6 , 52 bajtów
Wypróbuj online!
To wyrażenie generatora używa
...
operatora. Wyszukuje luki w poprzedniej sekwencji@_
poprzez((^max @_)∖@_).min.?key
:Jest
?
to konieczne dla wartości początkowej, która nie ma.key
. Jeśli nie zostaną znalezione luki, to dodaje n (tutaj w$
zmiennej) do ostatniej wartości na liście, plus jeden dla off o 0 błędów.źródło
Python 3 , 104 bajty
Wypróbuj online!
Biorąc pod uwagę wejście x, wypisz pierwsze x „sekwencje”
źródło