Zaczynamy od pustej sekwencji 1-indeksowanej:
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,...
W n- tym kroku wypełniamy wszystkie puste pola (a) liczbami całkowitymi większymi niż 1, zaczynając od pierwszego pozostałego pustego miejsca, gdzie (n) jest n- tym wpisem w sekwencji.
Po pierwszym kroku:
2,_,3,_,4,_,5,_,6,_,7,_,8,_,9,_,10,_,11,_,12,_,13,_,...
Zauważ, że a (1) musi być 2, ponieważ pierwsza liczba całkowita większa od 1 to 2.
W drugim kroku wypełniamy wszystkie (2) puste pola. Będzie oczywiste, że a (2) musi być 2.
2,2,3,_,4,3,5,_,6,4,7,_,8,5,9,_,10,6,11,_,12,7,13,_,...
W trzecim kroku wypełniamy wszystkie (3) puste pola. Z sekwencji a (3) = 3.
2,2,3,2,4,3,5,_,6,4,7,_,8,5,9,3,10,6,11,_,12,7,13,_,...
W czwartym kroku wypełniamy wszystkie (4) puste pola. Z sekwencji a (4) = 2.
2,2,3,2,4,3,5,2,6,4,7,_,8,5,9,3,10,6,11,3,12,7,13,_,...
Ostatecznie:
2,2,3,2,4,3,5,2,6,4,7,2,8,5,9,3,10,6,11,3,12,7,13,2,...
Zadanie
Biorąc pod uwagę n, zwróć n- ty element sekwencji.
Pierwsze 10 000 000 terminów sekwencji można znaleźć tutaj .
To jest golf golfowy . Najkrótsza odpowiedź w bajtach wygrywa. Obowiązują standardowe luki .
Odpowiedzi:
Haskell ,
8067 bajtówWypróbuj online!
Haskell to idealny język do definiowania nieskończonej listy.
źródło
let
strażników wzorów.pattern1 | let pattern2 = expr2 = expr1
oznacza to samo copattern1 = let pattern2 = expr2 in expr1
(z tego samego powodu, co[expr1 | let pattern2 = expr2]
oznacza to samo, co[let pattern2 = expr2 in expr1]
).let
strażnikach wzorów (szczególnie, że mogą wykonywać funkcje)! Ponadtom=2:2:2`drop`g m
jest krótszy bajt.(!!)$0:m
jest dwa bajty krótszy.2:2:
wszystko z nieco większym lenistwem:g ~(a:b)|...
im=g m
.C, 123 bajty
Wypróbuj online!
Przewodnik
Przydziel tablicę n liczb całkowitych do przechowywania pierwszych n elementów sekwencji. To hardcodes
sizeof(int)
as4
, co jest bezpiecznym założeniem w większości przypadków i na pewno takim, które jestem gotów zrobić w kontekście golfa kodu. :)Są to wszystkie liczniki:
i
dla indeksu kroku, na którym jesteśmy,j
aby przejść przez sekwencję w poszukiwaniu pustych miejsc ik
policzyć, ile pustych miejsc zostało zauważonych.Zanim zaczniemy naszą główną pętlę, podkradamy się podczas inicjalizacji pierwszych dwóch elementów sekwencji do
2
. (p[0]
=*(p + 0)
=*p
.) Wyklucza tok
jednak, ale ...... wykonujemy również sprytną inicjalizację
k
, która sprawdza, czy wartośći
jest mniejsza niż,2
i koryguje wartość początkową,k
jeśli tak jest. Tutaj zaczyna się również wewnętrzna pętla, która iteruje się po całej sekwencji do tej pory podczas każdego kroku.Ta linia mogłaby naprawdę trochę wyjaśnić. Możemy rozwinąć to do:
przez zwarcie, a następnie przez prawa De Morgana i fakt, że
0
jest to fałsz w C:Zasadniczo stwierdza się: „jeśli to miejsce jest puste, zwiększaj
k
. Jeślik
wcześniej była wielokrotnością wielkości kroku, uruchom następującą instrukcję”. Dlatego uruchamiamy instrukcję na każdym elemencie wielkości kroku , co dokładnie opisuje sekwencję. Samo zdanie jest proste; Wszystko robi to generuje2
,3
,4
, ....Korzystając z funkcji tricky-return-without-a-return
gcc
, „zwracamy” ostatni element pierwszych n terminów w sekwencji, który przypadkiem jest n- tym terminem.źródło
Pyth, 29 bajtów
Wypróbuj online
Jak to działa
Zamiast wygłupiać się z listami, używa zwykłej rekurencyjnej formuły.
źródło
Haskell , 67 bajtów
Wypróbuj online!
Rekurencyjne rozwiązanie arytmetyczne, które okazało się w zasadzie tą samą metodą, co odpowiedź Pythona Andersa Kaseorga .
Ten kod jest pokryty brodawkami - brzydkimi częściami, które wyglądają, jakby można je było zagrać w golfa, ale nie widziałem, jak to zrobić.
Funkcja
i%j
naprawdę chce użyć wartownika, aby sprawdzić, czymod i(f j)>0
i ocenić jedno z dwóch odpowiednich wyrażeń. Ale oba wyrażenia używajądiv i(f j)
. Wiązanie tego w osłonie nie spowoduje, że będzie miało zastosowanie do obu stron. O ile mi wiadomo, nie można zmusić strażnika do „rozdzielenia” się na innych strażników.let
iwhere
są za długie. Tak więc kod używalast
do wybrania jednego z dwóch wyrażeń, podczas gdy wartownik wiąże zmienną. Ugh.Idealnie byśmy użyli,
divMod
ponieważ zarównodiv
imod
są używane, ale(d,m)<-divMod ...
jest to długie wyrażenie. Zamiast tego pospiesznie sprawdzamy, czy mod jest niezerowy, sprawdzając, czydiv
wartość razy dzielnik nie jest równa pierwotnej wartości.0%j=2
Sprawa nie byłaby potrzebna, jeśli Haskell zwartediv 0
, których nie ma. W.pred
konwertuje 1-indeksowane wejście do zera indeksowane, albo nie będzie-1
korekty wszędzie.źródło
%
indeks 1, potrzebujesz pięciu bajtów korekty - która po prostu wiąże. Jednakże , można następnie inlinef
się%
bez żadnych kosztów, a następnief
staje się anonimowy więc można zaoszczędzić dwa bajty ogólnej.f
bez utraty bajtów.divMod
wydaje się być o jeden bajt tańszy, ponieważ pozwala na rozgałęzienie!!(0^m)
. Do tej pory mam:1%j=2;i%j|(d,m)<-divMod(i-1)$j%1=[(i-d-1)%(j+1),d+2]!!(0^m);(%1)
.pred
.JavaScript (ES6),
989391 bajtówFunkcja rekurencyjna, która zatrzymuje się, gdy tylko wynik będzie dostępny.
Alternatywna wersja, 90 bajtów
Sugerowane przez Shaggy dla -1 bajtów
Ten musi być wywołany z
f(n)()
. Chociaż odpowiadający post w meta obecnie daje pozytywny wynik, ta składnia jest najwyraźniej kwestionowana.Próbny
Pokaż fragment kodu
źródło
n=>g=(p,a=[...Array(n)])=>a[n-1]||g(-~p,a.map(c=>c?c:i?i++%k?c:++v:(i=1,v=2),i=0,k=a[p]||2))
powinien działać dla 92 bajtów. Zadzwoń za pomocąf(n)()
.Java 8, 124 bajty
Wyrażenie lambda.
Tworzy tablicę liczb całkowitych i nieustannie ją zapełnia, dopóki n-ta wartość nie zostanie zapełniona.
Wstępnie zadeklaruj zmienne u góry, aby zmniejszyć jak najwięcej deklaracji, ponieważ każda
int
kosztuje 4 bajty miejsca, w przeciwieństwie do dodawania,,n
które wynosi 2.Podczas
j
„iteracji obliczeń” liczba „odstępów”, które należy pominąć, jest równaa[j]
(lub 2, jeśli jest pusta). Okazuje się, że jeśli pierwsze puste miejsce, które musimy wypełnić, znajduje się w pozycjik
,k * a[j]
daje nam „krok” (s
).źródło