Trình tự Kimberling


18

Giới thiệu

Tất nhiên, chúng tôi đã có rất nhiều thử thách theo , vì vậy đây là một thử thách khác.

Trình tự Kimberling ( A007063 ) diễn ra như sau:

1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28, 22, ...

Điều này được tạo ra bằng cách xáo trộn các lần lặp thông thường:

[1] 2  3  4  5  6  7  8

Thuật ngữ đầu tiên của chuỗi là 1. Sau đó, chúng tôi cải tổ lại chuỗi cho đến khi tất cả các thuật ngữ bên trái được sử dụng. Sự xáo trộn có hoa văn right - left - right - left - .... Vì không có điều khoản ở bên trái của 1, không có sự xáo trộn. Chúng tôi nhận được như sau:

 2 [3] 4  5  6  7  8  9

Trong lần lặp thứ i , chúng tôi loại bỏ mục thứ i và đưa nó vào trình tự của chúng tôi. Đây là lần lặp thứ 2 , vì vậy chúng tôi loại bỏ mục thứ 2 . Trình tự trở thành : 1, 3. Đối với lần lặp tiếp theo của chúng tôi, chúng tôi sẽ xáo trộn lần lặp hiện tại với mẫu ở trên. Chúng tôi lấy mục không sử dụng đầu tiên ở bên phải của mục thứ i . Điều này xảy ra 4. Chúng tôi sẽ nối nó với lần lặp mới của chúng tôi:

 4

Bây giờ chúng ta sẽ lấy mục không sử dụng đầu tiên ở bên trái của mục thứ i . Đây là 2. Chúng tôi sẽ nối nó với lần lặp mới của chúng tôi:

 4  2

Vì không có mục nào ở bên trái của mục thứ i , chúng tôi sẽ chỉ nối phần còn lại của chuỗi vào lần lặp mới:

 4  2 [5] 6  7  8  9  10  11  ...

Đây là lần lặp thứ 3 của chúng tôi , vì vậy chúng tôi sẽ loại bỏ mục thứ 35 . Đây là mục thứ ba trong chuỗi của chúng tôi:

 1, 3, 5

Để có được lần lặp tiếp theo, chỉ cần lặp lại quá trình. Tôi đã tạo một gif nếu nó không rõ ràng:

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

Các gif làm tôi mất nhiều thời gian hơn viết bài thực tế

Bài tập

  • Cho một số nguyên n không âm , xuất ra các số hạng n đầu tiên của chuỗi
  • Bạn có thể cung cấp một chức năng hoặc một chương trình
  • Đây là , vì vậy bài nộp có số byte ít nhất sẽ thắng!

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

Input: 4
Output: 1, 3, 5, 4

Input: 8
Output: 1, 3, 5, 4, 10, 7, 15, 8

Input: 15
Output: 1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28

Lưu ý: Dấu phẩy trong đầu ra là không cần thiết. Ví dụ, bạn có thể sử dụng dòng mới hoặc xuất danh sách, v.v.


Tôi đang làm việc trên một phương pháp sử dụng xoay vòng ngăn xếp
Cyoce

@Cyoce Chúc may mắn :)
Adnan

Trông giống như tôi sẽ cần nó
Cyoce

Câu trả lời:


3

Bình thường, 22 byte

JS*3QVQ@JN=J.i>JhN_<JN

Dùng thử trực tuyến: Trình diễn

Đơn giản chỉ cần thực hiện kỹ thuật xáo trộn được mô tả trong OP.

Giải trình:

JS*3QVQ@JN=J.i>JhN_<JN
JS*3Q                    assign the list [1, 2, ..., 3*input-1] to J
     VQ                  for N in range(Q):
       @JN                  print J[N]
            .i              interleave 
              >JhN             J[N+1:] with
                  _<JN         reverse J[:N]
          =J                assign the resulting list to J

6

Julia, 78 71 byte

n->[(i=j=x;while j<2i-3 j=i-(j%2>0?1-j:j+22;i-=1end;i+j-1)for x=1:n]

Đây là một hàm không tên, chấp nhận một số nguyên và trả về một mảng số nguyên. Để gọi nó, gán nó cho một biến.

Cách tiếp cận ở đây giống như mô tả trên OEIS.

Ung dung:

# This computes the element of the sequence
function K(x)
    i = j = x
    while j < 2i - 3
        j = i - (j % 2 > 0 ? 1 - j : j + 22
        i -= 1
    end
    return i + j - 1
end

# This gives the first n terms of the sequence
n -> [K(i) for i = 1:n]

Đã lưu 7 byte nhờ Mauris!


3

Toán học 130 byte

(n=0;s={};Nest[(n++;AppendTo[s,z=#[[n]]];Flatten[TakeDrop[#,1+2(n-1)]/.{t___,z,r___}:> 
Riffle[{r},Reverse@{t}]])&,Range[3*#],#];s)&

Chúng tôi bắt đầu với một danh sách bao gồm phạm vi từ 1đến 3x, trong đó xsố lượng điều khoản trình tự Kimberling mong muốn.

Tại mỗi bước, n, TakeDropphá vỡ các danh sách hiện tại vào một danh sách trước 2n+1hạn (trong đó công việc được thực hiện) và danh sách phía sau (mà sau này sẽ được nối với làm lại danh sách trước). Danh sách phía trước được khớp với mẫu sau, {t___,z,r___}trong đó z là thuật ngữ Kimberling ở trung tâm của danh sách phía trước. rRiffle'd với đảo ngược tvà sau đó danh sách phía sau được nối thêm. zđược loại bỏ và gắn vào ( AppendTo) chuỗi Kimberling đang phát triển.

nđược tăng lên 1và danh sách hiện tại được xử lý bởi cùng chức năng thông quaNest.


Thí dụ

(n=0;s={};Nest[(n++;AppendTo[s,z=#[[n]]];Flatten[TakeDrop[#,1+2(n-1)]/.{t___,z,r___}:> 
Riffle[{r},Reverse@{t}]])&,Range[3*#],#];s)&[100]

{1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28, 22, 42, 35, 33, 46, 53, 6, 36, 23, 2 , 55, 62, 59, 76, 65, 54, 11, 34, 48, 70, 79, 99, 95, 44, 97, 58, 84, 25, 13, 122, 83, 26, 115, 82, 91 , 52, 138, 67, 90, 71, 119, 64, 37, 81, 39, 169, 88, 108, 141, 38, 16, 146, 41, 21, 175, 158, 165, 86, 191, 45 , 198, 216, 166, 124, 128, 204, 160, 12, 232, 126, 208, 114, 161, 156, 151, 249, 236, 263, 243, 101, 121, 72, 120, 47, 229 }


2

Python 2, 76 byte

for a in range(input()):
 b=a+1
 while-~b<2*a:b=a-(b^b%-2)/2;a-=1
 print a+b

Giải trình

Đây là công thức OEIS sau nhiều lần biến đổi golf-y! Nó làm việc rất đẹp . Mã ban đầu là

i=b=a+1
while b<2*i-3:b=i-(b+2,1-b)[b%2]/2;i-=1
print i+b-1

Trước tiên tôi đã loại bỏ inó, thay thế nó bằng a+1mọi nơi và mở rộng các biểu thức:

b=a+1
while b<2*a-1:b=a+1-(b+2,1-b)[b%2]/2;a-=1
print a+b

Sau đó, viết lại b<2*a-1như -~b<2*ađể lưu một byte khoảng trắng và di chuyển +1vào vùng chọn, chia cho 2 và phủ định:

while-~b<2*a:b=a-(b,-b-1)[b%2]/2;a-=1

Sau đó, -b-1chỉ là ~b, vì vậy chúng tôi có thể viết (b,~b)[b%2]. Điều này tương đương với b^0 if b%2 else b^-1việc sử dụng toán tử XOR hoặc cách khác , b^b%-2.

while-~b<2*a:b=a-(b^b%-2)/2;a-=1

2

Bình thường, 29 25 byte

VQ+.W<hHyN-~tN/x%Z_2Z2hNN

Jakube đã lưu 4 byte, nhưng tôi không biết cách đọc mã nữa.

Đây là giải pháp cũ:

VQKhNW<hKyN=K-~tN/x%K_2K2)+KN

Dịch câu trả lời Python của tôi. Tôi không giỏi về Pyth, nên có lẽ vẫn còn cách để rút ngắn điều này.

VQ                              for N in range(input()):
  KhN                             K = N+1
     W<hKyN                       while 1+K < 2*N:
           =K-~tN/x%K_2K2)         K = (N--) - (K%-2 xor K) / 2
                          +KN     print K + N

Bạn có thể sử dụng .Wđể đánh gôn 4 byte : VQ+.W<hHyN-~tN/x%Z_2Z2hNN.
Jakube

Điều đó thật tuyệt - bạn có thể giải thích sơ bộ về cách thức hoạt động của nó không?
Lynn

1
.Wcó dạng : .W<condition><apply><start-value>. Tôi đã sử dụng giá trị bắt đầu hN, giống như bạn đã làm trong KhN. .Wthay đổi giá trị này miễn <condition>là đúng. Tôi đã sử dụng điều kiện tương tự như bạn <hHyN. Điều kiện là hàm lambda với tham số H, vì vậy giá trị hiện tại (trong mã của bạn K) là H. Và tôi cũng đã sử dụng <apply>câu lệnh tương tự như bạn, tôi chỉ thay thế Kbằng Z, bởi vì <apply>câu lệnh là hàm lambda với tham số Z. Chúng ta có thể bỏ qua =K, .Wxử lý này. Nó thay thế giá trị cũ bằng giá trị được tính toán. Vào cuối bản in+...N
Jakube

2

APL, 56 44 byte

{⍵<⍺+⍺-3:(⍺-1)∇⍺-4÷⍨3+(1+2×⍵)ׯ1*⍵⋄⍺+⍵-1}⍨¨⍳

Đây là một tàu đơn nguyên không tên, chấp nhận một số nguyên ở bên phải và trả về một mảng. Đó là cách tiếp cận gần giống như câu trả lời Julia của tôi .

Hàm trong cùng là một hàm dy đệ quy trả về số hạng thứ n trong chuỗi Kimberling, được n là các đối số trái và phải giống hệt nhau.

{⍵<⍺+⍺-3:                                    ⍝ If ⍵ < 2⍺ - 3
         (⍺-1)∇⍺-4÷⍨3+(1+2×⍵)ׯ1*⍵           ⍝ Recurse, incrementing a and setting
                                             ⍝ ⍵ = ⍺ - (3 + (-1)^⍵ * (1 + 2⍵))/4
                                   ⋄⍺+⍵-1}   ⍝ Otherwise return ⍺ + ⍵ - 1

Với điều đó trong tay, chúng tôi có thể có được các điều khoản riêng lẻ của chuỗi. Tuy nhiên, vấn đề sau đó trở thành đây là một hàm dyadic , có nghĩa là nó đòi hỏi các đối số ở cả hai phía. Nhập toán tử! Cho một hàm fvà một đầu vào x, f⍨xgiống như x f x. Vì vậy, trong trường hợp của chúng tôi, đề cập đến chức năng đã nói ở trên f, chúng tôi có thể xây dựng tàu đơn nguyên sau:

f⍨¨⍳

Chúng tôi áp dụng fcho mỗi số nguyên từ 1 đến đầu vào, thu được một mảng.

Đã lưu 12 byte nhờ Dennis!

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.