Zachowaj / upuść / zwiększ sekwencję


20

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!



3
Czy możemy wybrać indeksowanie od 0 do 1?
— Pan Xcoder,

1
@ Mr.Xcoder Obawiam się, że nie. Jest to tylko 1 indeksowany

Czy możemy zwrócić listę zawierającą wszystkie elementy w kolejności?
— Wheat Wizard

@WheatWizard jest to całkowicie niedopuszczalne. przepraszam

Odpowiedzi:


12

Java (OpenJDK 8) , 45 44 bajtów

n->{int i=0;for(;++i<n;n-=i);return~-n+i*i;}

Wypró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 nliczby, 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, ifragment th zaczyna się od i*ii iteruje w górę dla ielementów.

Aby znaleźć nliczbę 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 przyrost iod nmomentu njest mniejszy niż i(co daje nam nasz kawałek), a następnie po prostu dodać n-1do i*iuzyskać poprawne positionw kawałku.

Przykład:

n = 8
n > 1? Yes, n = n - 1 = 7
n > 2? Yes, n = n - 2 = 5
n > 3? Yes, n = n - 3 = 2
n > 4? No, result is 4 * 4 + 2 - 1 = 17

1
Możesz użyć, return~-n+i*i;aby zapisać 1 bajt.
— Nevay

7

Haskell, 48 43 41 bajtów

n#l=[l..l+n]++(n+1)#(l+2*n+3)
((0:0#1)!!)

4 dodatkowe bajty dla indeksowania 1 zamiast 0. Niepotrzebne ograniczenie, IMHO.

Wypróbuj online!

n#l             -- n is one less than the number of element to keep/drop and
                -- l the next number where the keep starts
   [l..l+n]     -- keep (n+1) numbers starting at l
   ++           -- and append a recursive call
   (n+1)#       -- where n is incremented by 1 and
      (l+2*n+3) -- l skips the elements to keep & drop

0#1             -- start with n=1 and l=0 and
 0:             -- prepend a dummy value to shift from 0 to 1-based index
    !!          -- pick the i-th element from the list 

6

Python 3 , 47 46 bajtów

1 bajt dzięki Mr. Xcoder.

def f(n):a=round((2*n)**.5);return~-n+a*-~a//2

Wypróbuj online!

BARDZO szybko dla wyższych liczb


46 bajtów: def f(n):a=round((2*n)**.5);return~-n+a*-~a//2. Nie jestem jednak pewien ... Sprytne podejście!
— Pan Xcoder,

Aw, podwójne lambdy to jeden dodatkowy bajt, miałem nadzieję, że uratuje bajt ...
— Stephen

Dlaczego ktoś głosował za tym? Czy jest jakiś problem z podejściem, którego nie zauważyliśmy?
— Pan Xcoder,

@ Mr.Xcoder może z powodu korkowej uwagi.
— Leaky Nun

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.
— Tytus


3

Haskell , 33 bajty

Anonimowa funkcja. Użyj jako((!!)$0:do n<-[1..];[n^2..n^2+n-1]) 1

(!!)$0:do n<-[1..];[n^2..n^2+n-1]

Wypróbuj online!

  • Konstruuje sekwencję jako nieskończoną listę, a następnie indeksuje do niej za pomocą !!. The0: to element fikcyjny umożliwiający dostosowanie indeksowania od 0 do 1.
  • Zakres [n^2..n^2+n-1]tworzy podciąg bez przerw, zaczynając od kwadratu ni zawierającegon liczby.
  • doNotacja Łączy zbudowane dla wszystkich zakresów n>=1.


2

Perl 6 , 43 bajtów

{(1..*).rotor({++$=>++$+1}...*).flat[$_-1]}

Sprawdź to

Rozszerzony:

{  # bare block lambda with implicit parameter 「$_」

  ( 1 .. * )                  # range starting from 1

  .rotor(                     # break it into chunks

    { ++$  =>  ++$ + 1} ... * # infinite Seq of increasing pairs
    #   1  =>    1 + 1    ==>   1 => 2 ( grab 1 skip 2 )
    #   2  =>    2 + 1    ==>   2 => 3
    #   3  =>    3 + 1    ==>   3 => 4
    # ...  =>  ... + 1

  ).flat\                     # reduce the sequence of lists to a flat sequence
  [ $_ - 1 ]                  # index into the sequence
                              # (adjusting to 0-based index)
}

(1..*).rotor({++$=>++$+1}...*) produkuje:

(
 (1,),
 (4, 5),
 (9, 10, 11),
 (16, 17, 18, 19),
 (25, 26, 27, 28, 29),
 ...
).Seq

2

TeX, 166 bajtów

\newcommand{\f}[1]{\count0=0\count1=0\loop\advance\count0 by\the\count1\advance\count1 by1\ifnum\count0<#1\repeat\advance\count0 by#1\advance\count0 by-1
\the\count0}

Stosowanie

\documentclass[12pt,a4paper]{article}
\begin{document}
\newcommand{\f}[1]{\count0=0\count1=0\loop\advance\count0 by\the\count1\advance\count1 by1\ifnum\count0<#1\repeat\advance\count0 by#1\advance\count0 by-1
\the\count0}

\f{1}

\f{22}

\f{333}

\f{4444}

\f{12345}
\end{document}

enter image description here


2

JavaScript, 43 38 bajtów

n=>eval("for(r=1;n>r;)n-=r++;r*r+n-1")

Wypró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.






1

Mathematica, 37 bajtów

Flatten[Range@#+#^2-1&~Array~#][[#]]&

Wyjaśnienie

Range@#+#^2-1&

Functionktóra przyjmuje dodatnią liczbę całkowitą #i zwraca #ciąg kolejnych liczb w sekwencji.

...~Array~#

Tworzy listę wszystkich takich przebiegów aż do wejścia #

Flatten[...][[#]]

Flattenswynikowa lista i zwraca #element th.



1

Tampio , 310 308 bajtów

n:n uni on n unena 1:lle
a unena k:lle on a vuona k:lla vähennettynä a:sta ja k
a vuona nollalla ja k on a
a vuona k:lla vähennettynä nollasta ja k on a
a vuona b:n seuraajalla ja k on yhteenlaskun kutsuttuna k:n kerrottuna 2:lla arvolla ja k:n vähennettynä a:sta arvolla unena k:n seuraajalle seuraaja

Zastosowanie: 4:n uniocenia na 9.

Wyjaśnienie:

n:n uni on n unena 1:lle
uni(n)  =  n `uni` 1

a unena k:lle on  a vuona  k:lla vähennettynä a:sta ja k
a `uni` k     =  (a `vuo` (k     `vähennetty` a)    )  k

 a vuona nollalla ja k on a
(a `vuo` 0        )  k =  a

 a vuona  k:lla vähennettynä nollasta ja k on a
(a `vuo` (k     `vähennetty` 0)       )  k =  a

 a vuona  b:n seuraajalla ja k on
(a `vuo` (b   + 1)        )  k =

 yhteenlaskun kutsuttuna k:n kerrottuna 2:lla arvolla
(yhteenlasku            (k   *          2     )

 ja k:n vähennettynä a:sta arvolla unena  k:n seuraajalle seuraaja
((  k   `vähennetty` a     )       `uni` (k   + 1)   )  ) + 1

Ze standardowej biblioteki:

a `vähennetty` b = b - a
yhteenlasku a b  = a + b

1

JavaScript (ES6), 33 bajty

Rozwiązanie rekurencyjne inspirowane obserwacjami Xanderhall .

f=(n,x=1)=>n<x?n+x*x-1:f(n-x,++x)

Spróbuj

o.innerText=(
f=(n,x=1)=>n<x?n+x*x-1:f(n-x,++x)
)(i.value=12345);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o>



0

Mathematica, 82 bajty

Complement[Range[3#],Array[#+⌊((r=Sqrt[1+8#])-1)/2⌋⌊(r+1)/2⌋/2&,3#]][[#]]&


0

JavaScript (ES6) 100 98 bajtów

var k=n=>{var s=[],i=1,c=1,j;while(s.length<n){for(j=i;j<i+c;j++){s.push(j)}i+=c*2+1;c++}return s}

Niby zrobiłem to szybko, więc założę się, że jest dużo miejsca na ulepszenia, tylko podstawowe pętle i liczniki.


0

Siatkówka , 27 bajtów

.+
$*
((^1|1\2)+)1
$1$2$&
1

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; $1jest dopasowaną liczbą trójkątną, a $2jej indeksem. Trailing 1oznacza, ż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 $1jest ona równoważna a-ii $2do, i-1a ich suma jest równa a-1lub równa się w tym przypadku.~-a w miarę potrzeb. ( $&po prostu zapobiega usunięciu dopasowania z wyniku). Zauważ, że dla danych wejściowych 1nie 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


0

MATL , 12 bajtów

:"@U@:q+]vG)

Wypróbuj online!

Wyjaśnienie

:        % Push range [1 2 ... n], where n is implicit input
"        % For each k in that range
  @U     %   Push k^2
  @:     %   Push range [1 2 ... k]
  q      %   Subtract 1: gives [0 1 ... k-1]
  +      %   Add: gives [k^2 k^2+1 ... k^2+k-1]
]        % End
v        % Concatenate all numbers into a column vector
G)       % Get n-th entry. Implicitly display


0

PHP, 48 42 37 + 1 bajtów

przeniesione z odpowiedzi Leaky Nun

while($argn>$a+=$i++);echo$a+~-$argn;

Uruchom jako potok z -Flub spróbuj online .

bezpośrednie podejście, 42 + 1 bajtów (przeniesione z innej odpowiedzi Leaky Nun )

<?=($a=(2*$argn)**.5+.5|0)*-~$a/2+~-$argn;

Uruchom jako rura z -nRlub odkomentuj powyżej TiO.

starsze iteracyjne rozwiązanie, 48 + 1 bajtów

for(;$argn--;$n++)$c++>$z&&$n+=++$z+$c=1;echo$n;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.