Giữ / Thả / Tăng trình tự


20

Đây là trình tự tôi đang nói về:

{1, 4, 5, 9, 10, 11, 16, 17, 18, 19, 25, 26, 27...}

Bắt đầu từ 1, giữ 1, thả 2 tiếp theo, giữ 2 tiếp theo, giảm 3, giữ 3 và cứ thế. Vâng, đó là trên OEIS (A064801) , quá!

Các thách thức

Cho một số nguyên n>0, tìm số hạng thứ n của dãy trên

Các trường hợp thử nghiệm

Input -> Output       
1->1  
22->49  
333->683
4444->8908
12345->24747

Đây là mã golf nên câu trả lời ngắn nhất tính bằng byte sẽ thắng! Chúc may mắn!



3
Chúng tôi có thể chọn từ 0 đến 1 lập chỉ mục không?
Ông Xcoder

1
@ Mr.Xcoder Tôi không sợ. Đây chỉ là 1 chỉ mục

Chúng tôi có thể trả về một danh sách chứa tất cả các yếu tố theo thứ tự không?
Thuật sĩ lúa mì

@WheatWizard điều này là hoàn toàn không thể chấp nhận. xin lỗi

Câu trả lời:


12

Java (OpenJDK 8) , 45 44 byte

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

Hãy thử trực tuyến!

-1 byte nhờ @Nevay

Sau khi nhìn chằm chằm vào nó một lúc, tôi nhận thấy một mô hình. Mỗi khi chúng ta bỏ nsố, số tiếp theo trong chuỗi là một hình vuông hoàn hảo. Nhìn thấy điều này, tôi đã phá vỡ chuỗi thành các phần thuận tiện: [[1],[4,5],[9,10,11],...]Về cơ bản, phần ithứ hai bắt đầu bằng i*ivà lặp đi lặp lại cho icác phần tử.

Để tìm nsố thứ tự trong chuỗi này, chúng tôi muốn tìm đầu tiên số chunk là số nào, và sau đó là vị trí nào trong khối mà nó chiếm giữ. Chúng tôi trừ số tăng của chúng tôi itừ ncho đến khi nít hơn i(mà cho chúng ta đoạn của chúng tôi), và sau đó chỉ cần thêm n-1vào i*iđể có được chính xác positiontrong đoạn.

Thí dụ:

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
Bạn có thể sử dụng return~-n+i*i;để lưu 1 byte.
Nevay

7

Haskell, 48 43 41 byte

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

4 byte bổ sung cho lập chỉ mục dựa trên 1 thay vì dựa trên 0. Một hạn chế không cần thiết, IMHO.

Hãy thử trực tuyến!

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 byte

1 byte nhờ ông Xcoder.

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

Hãy thử trực tuyến!

RẤT nhanh cho số cao hơn


46 byte : def f(n):a=round((2*n)**.5);return~-n+a*-~a//2. Không chắc chắn mặc dù ... Cách tiếp cận thông minh!
Ông Xcoder

Aw, đôi lambdas là một byte thêm, tôi đã hy vọng rằng sẽ tiết kiệm được một byte ...
Stephen

Tại sao một downvote này? Có bất kỳ vấn đề với cách tiếp cận mà chúng tôi đã không nhận thấy?
Ông Xcoder

@ Mr.Xcoder có lẽ vì nhận xét khó chịu.
Leaky Nun

a*(a+1)thậm chí cho mọi số nguyên. Python có phàn nàn về phân chia float trên các số nguyên không? Nó có phàn nàn về các hoạt động bitwise trên phao không? Nếu không : (2*n)**.5+.5|0.
Tít


3

Haskell , 33 byte

Một chức năng ẩn danh. Sử dụng như là((!!)$0:do n<-[1..];[n^2..n^2+n-1]) 1

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

Hãy thử trực tuyến!

  • Xây dựng chuỗi như một danh sách vô hạn, sau đó lập chỉ mục vào nó với !!. Đây 0:là một yếu tố giả để điều chỉnh từ lập chỉ mục dựa trên 0 đến 1.
  • Phạm vi [n^2..n^2+n-1]xây dựng một dãy con không có khoảng trống, bắt đầu bằng bình phương nvà chứa các nsố.
  • Các doký hiệu concatenates phạm vi xây dựng cho tất cả n>=1.


2

Perl 6 , 43 byte

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

Kiểm tra nó

Mở rộng:

{  # 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}...*) sản xuất:

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

2

TeX, 166 byte

\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}

Sử dụng

\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}

nhập mô tả hình ảnh ở đây


2

Javascript, 43 38 byte

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

Hãy thử trực tuyến!

Tôi sử dụng thực tế, với mỗi số tam giác cộng với một, kết quả là một số vuông.

Ví dụ: các số tam giác là 0, 1, 3, 6, 10 ... vì vậy với 1, 2, 4, 7, 11 ... chúng tôi quan sát 1, 4, 9, 16, 25 ... trong chuỗi của chúng tôi .

Nếu chỉ số nằm ở đâu đó giữa các số đã biết này, các phần tử của chuỗi của chúng tôi chỉ tăng trước một. Chẳng hạn, để tính kết quả cho 10, chúng ta lấy 7 (dưới dạng số tam giác cộng với một), lấy kết quả (16) và cộng 10-7 = 3. Do đó, 16 + 3 = 19.






1

Toán học, 37 byte

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

Giải trình

Range@#+#^2-1&

Functiontrong đó có một số nguyên dương #và trả về việc chạy các #số liên tiếp trong chuỗi.

...~Array~#

Tạo danh sách tất cả các lần chạy như vậy cho đến đầu vào #

Flatten[...][[#]]

Flattensdanh sách kết quả và trả về #phần tử thứ.



1

Băng vệ sinh , 310 308 byte

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

Cách sử dụng: 4:n uniđánh giá 9.

Giải trình:

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

Từ thư viện chuẩn:

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



0

Toán học, 82 byte

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


0

Javascript (ES6) 100 98 byte

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}

Loại này đã làm điều này nhanh chóng, vì vậy tôi cá rằng có rất nhiều chỗ để cải thiện, chỉ là các vòng lặp và bộ đếm cơ bản.


0

Võng mạc , 27 byte

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

Hãy thử trực tuyến! Câu trả lời Python của @ LeakyNun. Các giai đoạn đầu tiên và cuối cùng chỉ là số thập phân nhàm chán, chuyển đổi đơn phương. Giai đoạn thứ hai hoạt động như thế này: ((^1|1\2)+)là một công cụ khớp số tam giác; $1là số tam giác phù hợp trong khi $2là chỉ số của nó. Các trailing 1phương tiện đó phù hợp với số tam giác lớn nhất chặt chẽ ít hơn đầu vào, do đó dẫn đến sự lặp lại chính xác một ít hơn vòng lặp Python, có nghĩa là $1tương đương với a-i$2để i-1và tổng của chúng là a-1hoặc ~-atheo yêu cầu. ( $&chỉ ngăn kết quả bị xóa khỏi kết quả.) Lưu ý rằng đối với đầu vào 1không có kết quả khớp nào xảy ra và đầu ra chỉ đơn giản giống như đầu vào. Nếu bạn hư hỏng, bạn có thể sử dụng^((^1|1\2)*)1 để phù hợp trong trường hợp đó quá.


0

MATL , 12 byte

:"@U@:q+]vG)

Hãy thử trực tuyến!

Giải trình

:        % 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 byte

chuyển từ câu trả lời của Leaky Nun

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

Chạy như ống với -Fhoặc thử trực tuyến .

cách tiếp cận trực tiếp, 42 + 1 byte (được chuyển từ câu trả lời khác của Leaky Nun )

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

Chạy như đường ống có -nRhoặc không có trong TiO ở trên.

giải pháp lặp cũ hơn, 48 + 1 byte

for(;$argn--;$n++)$c++>$z&&$n+=++$z+$c=1;echo$n;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.