Trình tự nhảy lên


19

Hãy xem xét trình tự sau:

0 1 3 2 5 4 8 6 7 12 9 10 11 17 13 14 15 16 23 ...

Trông khá mẫu, phải không? Đây là cách nó hoạt động. Bắt đầu với 0, nhảy lên nsố nguyên, nbắt đầu từ 1. Đó là số tiếp theo trong chuỗi. Sau đó, nối bất kỳ số nào "bỏ qua" và chưa được nhìn thấy theo thứ tự tăng dần. Sau đó, tăng nvà nhảy từ số cuối cùng được nối. Lặp lại mô hình này.

Vì vậy, ví dụ, khi chúng tôi đạt được 11, chúng tôi đang ở n=5. Chúng tôi tăng nlên n=6, nhảy lên 17, sau đó nối tiếp 13 14 15 16vì những người chưa được nhìn thấy. Bước nhảy tiếp theo của chúng tôi là n=7, vì vậy yếu tố tiếp theo trong chuỗi là 23.

Các thách thức

Đưa ra đầu vào x, đầu ra xthuật ngữ thứ của chuỗi này, các xđiều khoản đầu tiên của chuỗi hoặc xây dựng một danh sách vô hạn các điều khoản của chuỗi. Bạn có thể chọn lập chỉ mục 0 hoặc 1.

I / O và Nội quy

  • Đầu vào và đầu ra có thể được cung cấp bởi bất kỳ phương pháp thuận tiện .
  • Đầu vào và đầu ra có thể được coi là phù hợp với loại số gốc của ngôn ngữ của bạn.
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Có vẻ như chưa (chưa?) Trên OEIS
JayCe

@JayCe Tôi không ngạc nhiên - đó là một chuỗi khá độc đoán.
admBorkBork

Câu trả lời:


24

JavaScript (ES7), 41 byte

Trả về số hạng thứ n của chuỗi, được lập chỉ mục 0.

n=>(d=(n--*8-23)**.5)%1?n:'121'[n]^n-~d/2

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

Làm sao?

Trường hợp chính: n>3

Bốn thuật ngữ đầu tiên của chuỗi là đặc biệt, vì vậy bây giờ chúng ta hãy đặt chúng sang một bên.

Đối với , chuỗi trông như thế:n>3

 n  | [4] 5 [6] 7 8 [ 9] 10 11 12 [13] 14 15 16 17 [18] 19 20 21 22 23 [24] 25 26 27 ...
----+------------------------------------------------------------------------------------
a(n)| [5] 4 [8] 6 7 [12]  9 10 11 [17] 13 14 15 16 [23] 18 19 20 21 22 [30] 24 25 26 ...
----+------------------------------------------------------------------------------------
 k  |  2  -  3  - -   4   -  -  -   5   -  -  -  -   6   -  -  -  -  -   7   -  -  - ...

Chúng ta có thể nhận thấy rằng trên thực tế có hai chuỗi con xen kẽ:

  • Hầu hết các giá trị thuộc về chuỗi con mà chúng ta đơn giản có:A

    A(n)=n1
  • Một số giá trị khác thuộc về chuỗi con (được đánh dấu bằng dấu ngoặc trong sơ đồ trên) có chỉ số theo trình tự số học 3, 3, 4, 6, 9, 13, 18, 24 ... và chúng tôi có:B

    B(n,k)=n+k1

    nơi là chỉ số trong chuỗi chính và k là chỉ số ở tiểu dãy B .nkB

Các chỉ số của trong chuỗi chính được cho bởi:B

nk=k2k+62

Cho , chúng ta biết rằng số hạng tương ứng trong dãy chính thuộc về B nếu n là một nghiệm nguyên của phương trình bậc hai:nBn

x2x+62n=0

có phân biệt đối xử là:

Δ=14(62n)=8n23

và giải pháp tích cực là:

x=1+Δ2

Chúng tôi hy vọng là một số nguyên. Do đó kiểm tra:Δ

(d = (n-- * 8 - 23) ** .5) % 1

Trường hợp đặc biệt: 0n3

Đối với , phân biệt đối xử là âm tính và lấy kết quả căn bậc hai của nó trong NaN . Với n = 3 , phân biệt đối xử là 1n<3n=31 . Do đó, các bốn học kỳ đầu tiên của chuỗi được coi là thuộc về tiểu dãy .B

Chúng ta có nên áp dụng công thức tiêu chuẩn n - ~ d / 2 không , chúng ta sẽ nhận được:

12,12,32,3

thay vì:

0,1,3,2

Đó là lý do tại sao chúng tôi XOR những kết quả này với 0,1,2 and 1 tương ứng.


10

Husk , 12 byte

Θṁṙ_1C+ḣ2tNN

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

Đầu ra như một danh sách vô hạn. Đây là một phiên bản in N đầu tiên .

Giải trình

Θṁṙ_1C + 2tNN - Chương trình đầy đủ. Không có đầu vào, đầu ra cho STDOUT.
         tN - Xây dựng danh sách vô hạn các số tự nhiên, bắt đầu từ 2.
      + ḣ2 - Và nối [1, 2] vào nó. Sản lượng [1,2,2,3,4,5,6,7,8,9,10,11, ...].
     CN - Cắt danh sách vô hạn các số nguyên dương thành các phần của chúng
               kích cỡ. Sản lượng [[1], [2,3], [4,5], [6,7,8], [9,10,11,12], ...].
 - Bản đồ và làm phẳng các kết quả sau đó.
  ṙ_1 - Xoay mỗi bên phải 1 đơn vị.
               Sản lượng [1,3,2,5,4,8,6,7,12,9,10,11, ...]
- Chuẩn bị một 0. Sản lượng [0,1,3,2,5,4,8,6,7,12,9,10,11, ...]

7

Haskell , 43 byte

0:1:3:2:5!3
a!n=a:[a-n+2..a-1]++(a+n)!(n+1)

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

Xác định một danh sách vô hạn:

  0:1:3:2:(5!3)
 0:1:3:2:5:4:(8!4)
 0:1:3:2:5:4:8:6:7:(12!5)
 0:1:3:2:5:4:8:6:7:12:9:10:11:(17!6)
 0:1:3:2:5:4:8:6:7:12:9:10:11:17:13:14:15:16:(23!7) 

4

Thạch , 15 byte

+‘ɼṪRṙ-œ|@
0Ç¡ḣ

Đây là một chương trình đầy đủ, cho n , in n mục đầu tiên của chuỗi.

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

Làm thế nào nó hoạt động

0Ç¡ḣ        Main link. Argument: n

0           Set the return value to 0.
 Ç¡         Call the helper link n times, first with argument 0, then n-1 times
            with the previous return value as argument.
   ḣ        Head; extract the first n items of the last return value.


+‘ɼṪRṙ-œ|@  Helper link. Argument: A (array)

 ‘ɼ         Increment the value in the register (initially 0) and yield it.
+           Add that value to all items in the sequence.
   Ṫ        Tail; extract the last item.
    R       Range; map k to [1, .., k].
     ṙ-     Rotate -1 units to the left, yielding [k, 1, ..., k-1].
       œ|@  Perform multiset union of A and the previous return value.

3

C (gcc), 73 67 64 byte

t,d;f(x){for(t=4,d=2;d<x;t+=d++)x-t||(d+=x+=d);t=x<4?x^x/2:x-1;}

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

Xác định hàm flấy 0-index nvà tạo nsố thứ tự trong chuỗi.

Chúng ta có thể phân tích trình tự như sau:

f(n)  = n   where n = 0, 1

f(2)  = 3   // 2 and 3 are swapped
f(3)  = 2

f(4)  = 5   // (+2,+3)
f(6)  = 8   // (+3,+4)
f(9)  = 12  // (+4,+5)
f(13) = 17  // (...)
...

f(n)  = n-1 // for all cases not yet covered

Đầu tiên chúng tôi xử lý phần giữa:

for(t=4,d=2;d<x;t+=d++)x-t||(d+=x+=d);

Lưu ý rằng các đối số ở bên trái (4, 6, 9, 13, ...) theo một mẫu: đầu tiên thêm hai, sau đó thêm ba, sau đó thêm bốn, v.v. Chúng tôi bắt đầu t=4và thêmd (bắt đầu từ 2) mỗi lần lặp của vòng lặp, tăng dần dtrong quy trình.

Cơ thể của vòng lặp là thú vị hơn. Hãy nhớ rằng chúng tôi muốn ánh xạ 4 đến 5, 6 đến 8, 9 đến 12, v.v.; đó chỉ là thêm d-1nếu xt. Tuy nhiên, logic này xuất hiện trước trường hợp cuối cùng f(n) = n - 1, vì vậy chúng tôi biết rằng chúng tôi sẽ trừ đi 1 ở cuối. Do đó, chúng ta chỉ cần thêm dif x == t( x-t||(x+=d)). Tuy nhiên, chúng tôi cũng sẽ cần phải thoát ra khỏi vòng lặp ngay sau này - vì vậy chúng ta thêm rằng để dđể có được những ngớ ngẩn nhìn d+=x+=d, mà sẽ luôn luôn làm cho d<xtình trạng thất bại.

Điều này bao gồm tất cả mọi thứ trừ bốn giá trị đầu tiên. Nhìn vào chúng trong nhị phân, chúng ta nhận được:

00 -> 00
01 -> 01
10 -> 11
11 -> 10

Vì vậy, chúng tôi muốn lật bit cuối cùng nếu 2 <= x < 4. Điều này được thực hiện với x^x/2. x/2đưa ra bit có ý nghĩa thứ hai ít nhất, vì vậy XOR điều này với số ban đầu sẽ lật bit cuối cùng nếu số đó là 2 hoặc 3.


3

Thạch ,  13  10 byte

-3 Cảm ơn Dennis (sử dụng lập chỉ mục 0 để lưu 2 từ thiết lập tổng tích lũy và giảm dần)

Ḷ»2Äi+_>2$

Một liên kết đơn âm chấp nhận một số nguyên, 0 -indexed n , trả về một số nguyên, a (n)

Hãy thử trực tuyến! Hoặc xem một bộ thử nghiệm


Tốt đẹp! Tôi đã có ḶÄ+3i+’, nhưng không biết làm thế nào để xử lý các trường hợp cạnh.
Dennis

Tôi cũng có Ḷ»ạ¥3cho Ḋ3,2;- cảm thấy như không nên có terser cho bit này.
Jonathan Allan

Ḷ»2Äi+_>2$lưu 3 byte, với lập chỉ mục dựa trên 0.
Dennis

Ôi golf tuyệt vời! Tôi bị mắc kẹt trong đất 1 chỉ số.
Jonathan Allan


2

MATL , 22 byte

1y:"t0)@+h5M:yX-h]qw:)

Xuất ra các nđiều khoản đầu tiên của chuỗi.

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

Giải trình

1         % Push 1
y         % Implicit input: n. Duplicate from below
":        % For each k in [1 2 ... n]
  t0)     %   Duplicate sequence so far. Get last entry, say m
  @+      %   Add k: gives m+k
  h       %   Concatenate horizontally
  5M      %   Push m+k again
  :       %   Range [1 2 ... m+k]
  y       %   Duplicate from below
  X-      %   Set difference
  h       %   Concatenate horizontally
]         % End
q         % Subtract 1, element-wise
w         % Swap. Brings original copy of n to the top
:)        % Keep the first n entries. Implicit display

Tôi thích smilie ở cuối, bây giờ tôi muốn tất cả các chương trình MATL của tôi kết thúc với một nụ cười. :)
- Phục hồi Monica

@sundar Vâng, tôi rất vui vì đó là một thành ngữ tương đối phổ biến trong MATL :-D
Luis Mendo



1

QBasic, 58 byte

DO
b=r+j
?b
r=b
FOR x=a+1TO b-1
?x
r=x
NEXT
a=b
j=j+1
LOOP

Đầu ra vô thời hạn. Bạn có thể muốn thêm một SLEEP 1vòng lặp bên trong hoặc thực hiện nó LOOP WHILE b<100hoặc một cái gì đó tương tự để xem kết quả.

Điều này về cơ bản chỉ thực hiện các thông số kỹ thuật. Quan sát rằng các số chúng tôi quay lại sẽ luôn là các số giữa số được nhảy gần đây nhất và số được nhảy trước đó. Vì vậy, chúng tôi lưu trữ những giới hạn như abvà sử dụng một FORvòng lặp để in tất cả các số giữa chúng.



1

R , 70 byte

function(e){for(i in 1:e)F=c(setdiff((F+i):1-1,F),F[1]+i,F);rev(F)[e]}

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

  • 1 chỉ mục
  • -4 byte sử dụng Fhằng nhờ vào đề xuất @JAD
  • -5 byte đảo ngược danh sách nhờ đề xuất @Giuseppe
  • -2 byte loại bỏ các dấu ngoặc vô dụng trong vòng lặp nhờ đề xuất @JAD
  • -2 byte sử dụng setdiffthay vìx[x %in% y]

Phiên bản trước (79 byte)



@JAD: Tôi luôn quên sử dụng F / T ... Tôi không thể giúp được, tôi quá thiên về tránh "mã không an toàn": D
digEmAll

1
Xây dựng danh sách tiết kiệm ngược 5 bytesvà gây ra một loạt các cảnh báo!
Giuseppe

Nó thậm chí không an toàn nếu F/Tkhông được xác định lại theo định nghĩa hàm. Nó không (IIRC) sửa đổi giá trị toàn cầu choF/T
JAD


1

Python 2 , 123 byte

def f(z):[s.extend([s[-1]+n]+[x for x in range(s[-1]+1,s[-1]+n)if not x in s]) for n in range(1,z)if len(s)<z];return s    

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

Cho đầu vào x, xuất các thuật ngữ x đầu tiên của chuỗi,

Tôi đang học Python và những thách thức này làm cho mọi thứ thú vị hơn.

Chỉnh sửa: cạo một số khoảng trắng


Chào mừng đến với PPCG! Bạn có thể thoát khỏi một số không gian hơn trong for n in range(1,z) if len(s) < z]; return s: for n in range(1,z)if len(s)<z];return s.
Laikoni

0

Thạch , 16 byte

RÄṬŻk²Ḋ$ṙ€-Ø.;Fḣ

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

Một byte dài hơn câu trả lời Jelly hiện có nhưng điều này có thể có thể được đánh gôn một chút. RÄṬŻk²Ḋ$có thể ngắn hơn

18 byte

RÄṬŻk²Ḋ$‘ṙ€1FŻŻỤ’ḣ

Dài hơn nhưng khác.



0

Perl 6 , 52 byte

(0,{((^max @_)∖@_).min.?key//(1+@_[*-1]+$++)}...*)

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

Đây là một biểu thức tạo bằng cách sử dụng ...toán tử. Nó tìm kiếm các khoảng trống trong trình tự trước @_thông qua ((^max @_)∖@_).min.?key:

      @_  # prior sequence values         [0,1,3]
  max @_  # largest prior sequence value       3
 ^        # the Range 0..max @_            0,1,2
(       )∖@_  # set subtract prior seq     -0,1  -> (2=>True)
            .min  # smallest unseen value  2=>True
                .?key  # set yields pairs  2

Điều ?này là cần thiết cho giá trị ban đầu không có a .key. Nếu không tìm thấy khoảng trống nào, thì nó sẽ thêm n (ở đây trong $biến) vào giá trị cuối cùng trong danh sách, cộng với một lỗi cho 0 lỗi.


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.