Oto sekwencja, o której mówię:
{1, 4, 5, 9, 10, 11, 16, 17, 18, 19, 25, 26, 27...}
Począwszy od 1, zachowaj 1, upuść kolejne 2, zachowaj następne 2, upuść 3, zachowaj 3 i tak dalej. Tak, dotyczy to również OEIS (A064801) !
Wyzwanie
Biorąc pod uwagę liczbę całkowitą n>0
, znajdź n-ty składnik powyższej sekwencji
Przypadki testowe
Input -> Output
1->1
22->49
333->683
4444->8908
12345->24747
To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach! Powodzenia!
Odpowiedzi:
Java (OpenJDK 8) ,
4544 bajtówWypróbuj online!
-1 bajt dzięki @Nevay
Po chwili wpatrywania się w to zauważyłem pewien wzór. Za każdym razem, gdy upuszczamy
n
liczby, następną liczbą w sekwencji jest idealny kwadrat. Widząc to, mentalnie podzieliłem sekwencję na wygodne fragmenty:[[1],[4,5],[9,10,11],...]
Zasadniczo,i
fragment th zaczyna się odi*i
i iteruje w górę dlai
elementów.Aby znaleźć
n
liczbę th w tej sekwencji, chcemy najpierw ustalić, w której części znajduje się liczba, a następnie jaką pozycję zajmuje w tej części. Odejmujemy nasz numer przyrosti
odn
momentun
jest mniejszy niżi
(co daje nam nasz kawałek), a następnie po prostu dodaćn-1
doi*i
uzyskać poprawneposition
w kawałku.Przykład:
źródło
return~-n+i*i;
aby zapisać 1 bajt.Haskell,
484341 bajtów4 dodatkowe bajty dla indeksowania 1 zamiast 0. Niepotrzebne ograniczenie, IMHO.
Wypróbuj online!
źródło
Python 3 ,
4746 bajtów1 bajt dzięki Mr. Xcoder.
Wypróbuj online!
BARDZO szybko dla wyższych liczb
źródło
def f(n):a=round((2*n)**.5);return~-n+a*-~a//2
. Nie jestem jednak pewien ... Sprytne podejście!a*(a+1)
jest nawet dla każdej liczby całkowitej. Czy Python skarży się na podział zmiennoprzecinkowy na liczbach całkowitych? Czy narzeka na bitowe operacje na pływakach? Jeśli nie:(2*n)**.5+.5|0
.Galaretka , 8 bajtów
Wypróbuj online!
źródło
Haskell , 33 bajty
Anonimowa funkcja. Użyj jako
((!!)$0:do n<-[1..];[n^2..n^2+n-1]) 1
Wypróbuj online!
!!
. The0:
to element fikcyjny umożliwiający dostosowanie indeksowania od 0 do 1.[n^2..n^2+n-1]
tworzy podciąg bez przerw, zaczynając od kwadratun
i zawierającegon
liczby.do
Notacja Łączy zbudowane dla wszystkich zakresówn>=1
.źródło
Python 3 , 46 bajtów
Wypróbuj online!
źródło
Perl 6 , 43 bajtów
Sprawdź to
Rozszerzony:
(1..*).rotor({++$=>++$+1}...*)
produkuje:źródło
TeX, 166 bajtów
Stosowanie
źródło
JavaScript,
4338 bajtówWypróbuj online!
Korzystam z faktu, że dla każdej liczby trójkątnej plus jeden wynik jest liczbą kwadratową.
Na przykład: liczby trójkątne to 0, 1, 3, 6, 10 ... więc dla 1, 2, 4, 7, 11 ... obserwujemy 1, 4, 9, 16, 25 ... w naszej sekwencji .
Jeśli indeks znajduje się gdzieś pomiędzy tymi znanymi liczbami, elementy naszej sekwencji przesuwają się tylko o jeden. Na przykład, aby obliczyć wynik dla 10, bierzemy 7 (jako liczbę trójkątną plus jeden), bierzemy wynik (16) i dodajemy 10-7 = 3. Zatem 16 + 3 = 19.
źródło
05AB1E , 12 bajtów
Wypróbuj online!
źródło
[0..a-1] + a**2
, fajną rzeczą tutaj imo jest po prostuÝÁćn+
zamiastD<Ýsn+
.cQuents , 27 bajtów
Wypróbuj online!
Obecnie jest to port odpowiedzi Leaky's Python , myślę jednak, że jest lepszy sposób.
źródło
Szybki 3 , 72 bajty
Port mojego rozwiązania Python .
Pakiet testowy.
źródło
C # (mono) , 164 bajty
Wypróbuj online!
źródło
Mathematica, 37 bajtów
Wyjaśnienie
Function
która przyjmuje dodatnią liczbę całkowitą#
i zwraca#
ciąg kolejnych liczb w sekwencji.Tworzy listę wszystkich takich przebiegów aż do wejścia
#
Flattens
wynikowa lista i zwraca#
element th.źródło
Perl 5 , 33 + 1 (-p) = 34 bajty
Wypróbuj online!
źródło
Tampio ,
310308 bajtówZastosowanie:
4:n uni
ocenia na9
.Wyjaśnienie:
Ze standardowej biblioteki:
źródło
JavaScript (ES6), 33 bajty
Rozwiązanie rekurencyjne inspirowane obserwacjami Xanderhall .
Spróbuj
źródło
Python 3 , 50 bajtów
Wypróbuj online!
źródło
Mathematica, 82 bajty
źródło
Python , 40 bajtów
Wypróbuj online!
Optymalizacja ekspresji Dziurawej Zakonnicy .
Python , 41 bajtów
Wypróbuj online!
Wyrażenie rekurencyjne.
źródło
JavaScript (ES6)
10098 bajtówNiby zrobiłem to szybko, więc założę się, że jest dużo miejsca na ulepszenia, tylko podstawowe pętle i liczniki.
źródło
Siatkówka , 27 bajtów
Wypróbuj online! Port odpowiedzi Python @ LeakyNun. Pierwszy i ostatni etap to tylko nudna konwersja dziesiętna. Drugi etap działa w następujący sposób:
((^1|1\2)+)
jest dopasowaniem liczb trójkątnych;$1
jest dopasowaną liczbą trójkątną, a$2
jej indeksem. Trailing1
oznacza, że pasuje do największej liczby trójkątnej dokładnie mniejszej niż wartość wejściowa, co powoduje dokładnie jedną mniejszą iterację niż pętla Pythona, co oznacza, że$1
jest ona równoważnaa-i
i$2
do,i-1
a ich suma jest równaa-1
lub równa się w tym przypadku.~-a
w miarę potrzeb. ($&
po prostu zapobiega usunięciu dopasowania z wyniku). Zauważ, że dla danych wejściowych1
nie występuje dopasowanie, a dane wyjściowe są po prostu takie same jak dane wejściowe. Gdybyś był przewrotny, mógłbyś użyć^((^1|1\2)*)1
źródło
MATL , 12 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
C (gcc) , 38 bajtów
Korzystając z algorytmu @ Xanderhall tutaj
Wypróbuj online!
źródło
PHP,
48 4237 + 1 bajtówprzeniesione z odpowiedzi Leaky Nun
Uruchom jako potok z
-F
lub spróbuj online .bezpośrednie podejście, 42 + 1 bajtów (przeniesione z innej odpowiedzi Leaky Nun )
Uruchom jako rura z
-nR
lub odkomentuj powyżej TiO.starsze iteracyjne rozwiązanie, 48 + 1 bajtów
źródło