Trình tự tự tham khảo giống Kolakoski


19

Đây là cách trình tự Kolakoski (OEIS A000002 ) được định nghĩa:

Chuỗi Kolakoski là một chuỗi chứa 12, và nphần tử thứ của chuỗi là độ dài của nnhóm thứ của các phần tử bằng nhau (chạy) trong chính chuỗi đó. 20 điều khoản đầu tiên của chuỗi và độ dài tương ứng là:

1 2 2 1 1 2 1 2 2 1 2 2 1 1 2 1 1 2 2 1
- --- --- - - --- - --- --- - --- --- -
1  2   2  1 1  2  1  2   2  1  2   2  1

Về cơ bản, độ dài của các nhóm phần tử bằng nhau của chuỗi Kolakoski là chính chuỗi Kolakoski.

Cho đến nay, rất tốt, nhưng đó là lý do tại sao chúng ta nên hạn chế 12? Chúng tôi sẽ không đến! Cho hai đầu vào, một mảng các số nguyên dương Avà một số nguyên N, trả về các số hạng đầu tiên Ncủa chuỗi giống Kolakoski được xác định bằng cách quay vòng qua A. Để hiểu rõ hơn về nó, đây là một ví dụ hoạt động với độ dài của các nhóm mới được thêm vào trong ngoặc:

A = [2, 3, 1]
N = 25

2: [[2], 2 ]
3: [ 2 ,[2], 3 , 3 ]
1: [ 2 , 2 ,[3], 3 , 1 , 1 , 1 ]
2: [ 2 , 2 , 3 ,[3], 1 , 1 , 1 , 2 , 2 , 2 ]
3: [ 2 , 2 , 3 , 3 ,[1], 1 , 1 , 2 , 2 , 2 , 3 ]
1: [ 2 , 2 , 3 , 3 , 1 ,[1], 1 , 2 , 2 , 2 , 3 , 1 ]
2: [ 2 , 2 , 3 , 3 , 1 , 1 ,[1], 2 , 2 , 2 , 3 , 1 , 2 ]
3: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 ,[2], 2 , 2 , 3 , 1 , 2 , 3 , 3 ]
1: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 ,[2], 2 , 3 , 1 , 2 , 3 , 3 , 1 , 1 ]
2: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 ,[2], 3 , 1 , 2 , 3 , 3 , 1 , 1 , 2 , 2 ]
3: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 ,[3], 1 , 2 , 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 ]
1: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 , 3 ,[1], 2 , 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 , 1 ]
2: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 1 ,[2], 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 , 1 , 2 , 2 ]
C: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 1 , 2 , 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 , 1 , 2 , 2 ]

Đây là một ví dụ làm việc với một hàng đầu 1:

A = [1, 2, 3]
N = 10

1: [[1]]
2: [ 1 ,[2], 2 ]
3: [ 1 , 2 ,[2], 3 , 3 ]
1: [ 1 , 2 , 2 ,[3], 3 , 1 , 1 , 1 ]
2: [ 1 , 2 , 2 , 3 ,[3], 1 , 1 , 1 , 2 , 2 , 2 ]
C: [ 1 , 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 ]

Như bạn có thể thấy ở trên, kết quả cuối cùng đã được cắt N = 10thành các phần tử. Phần ntử thứ nên là nnhóm phần tử thứ bằng dài bao nhiêu , ngay cả khi chính phần tử đó thuộc về nhóm mà nó đề cập đến. Như trong trường hợp trên, nhóm đầu tiên 1đề cập đến nhóm đầu tiên như vậy 1, và nhóm đầu tiên 2đề cập đến nhóm thứ hai như vậy, bắt đầu với nhóm này.

Quy tắc

  • Bạn có thể cho rằng Asẽ không bao giờ có hai hoặc nhiều phần tử bằng nhau liên tiếp. Acó thể chứa một số nguyên nhiều hơn một lần, nhưng các yếu tố đầu tiên và cuối cùng sẽ không được bình đẳng, và Asẽ có ít nhất 2 yếu tố (ví dụ [1, 2, 2, 3], [2, 4, 3, 1, 2][3]sẽ không được đưa ra). Đó là bởi vì nếu có các phần tử bằng nhau liên tiếp, kết quả cuối cùng sẽ là tiền tố không hợp lệ cho chuỗi như vậy.
  • Bạn có thể giả sử Achỉ chứa các số nguyên dương (vì như vậy một chuỗi sẽ không được xác định).
  • Bạn có thể giả sử Nlà một số nguyên không âm ( N >= 0).
  • Bạn không thể trả lại nhiều điều khoản hơn yêu cầu.
  • Sử dụng bất kỳ một trong những sơ hở tiêu chuẩn đều bị nghiêm cấm.
  • Bạn có thể sử dụng bất kỳ phương pháp I / O hợp lý .
  • Câu trả lời của bạn không phải hoạt động vượt quá giới hạn ngôn ngữ tự nhiên, nhưng về lý thuyết, thuật toán của bạn sẽ hoạt động với các đầu vào và số nguyên lớn tùy ý .
  • Đây là , vì vậy câu trả lời ngắn nhất sẽ thắng.

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

[5, 1, 2], 0 -> []
[2, 3, 1], 25 -> [2, 2, 3, 3, 1, 1, 1, 2, 2, 2, 3, 1, 2, 3, 3, 1, 1, 2, 2, 3, 3, 3, 1, 2, 2]
[1, 2, 3], 10 -> [1, 2, 2, 3, 3, 1, 1, 1, 2, 2]
[1, 2], 20 -> [1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1]
[1, 3], 20 -> [1, 3, 3, 3, 1, 1, 1, 3, 3, 3, 1, 3, 1, 3, 3, 3, 1, 1, 1, 3]
[2, 3], 50 -> [2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 2, 3, 3]
[7, 4], 99 -> [7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4]
[1, 2, 3], 5 -> [1, 2, 2, 3, 3]
[2, 1, 3, 1], 2 -> [2, 2]
[1, 3, 5], 2 -> [1, 3]
[2, 3, 2, 4], 10 -> [2, 2, 3, 3, 2, 2, 2, 4, 4, 4]

hộp cát (2k + người dùng)
Erik the Outgolfer


@MartinEnder nghĩ rằng tôi đã liên kết điều đó rồi
Erik the Outgolfer

Câu trả lời:


9

Husk , 8 byte

Ṡωȯ↑⁰`Ṙ¢

Đầu tiên là chiều dài, sau đó là danh sách. Hãy thử trực tuyến!

Giải trình

Ṡωȯ↑⁰`Ṙ¢  Inputs: n=9 and x=[2,1,3]
Ṡωȯ       Apply the following function to x until a fixed point is reached:
           Argument is a list, say y=[2,2,1,3,3,3]
       ¢   Cycle x: [2,1,3,2,1,3..
     `Ṙ    Replicate to lengths in y: [2,2,1,1,3,2,2,2,1,1,1,3,3,3]
   ↑⁰      Take first n elements: [2,2,1,1,3,2,2,2,1]
          Final result is [2,2,1,1,3,2,1,1,1], print implicitly.

8

Bình thường, 14 byte

u<s*V]M*QlGGvz

Dùng thử trực tuyến: Trình diễn hoặc bộ thử nghiệm

Giải trình:

u                 start with G = input array
       *QlG       repeat input array
     ]M           put every element into its own list
   *V      G      repeat every list vectorized by the counts in G
  s               flatten
 <          vz    take the first (second input line) numbers
                  and assign them to G until you reach fixed point

Thay thế thú vị:u&VSvzs*V]M*Ql
Jakube

1
Đây là một cách tiếp cận tốt đẹp.
Erik the Outgolfer

5

Java 8, 151 + 19 119 115 byte

a->n->{int c=0,l[]=new int[n],i=0,j;for(;i<n;i++)for(j=0;j<(c==i?a[i]:l[i])&c<n;j++)l[c++]=a[i%a.length];return l;}

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


1
Bạn có thể giảm bốn byte bằng cách loại bỏ hai dấu ngoặc đơn, thay đổi &&đến &và loại bỏ một dấu phẩy: a->n->{int c=0,l[]=new int[n],i=0,j;for(;i<n;i++)for(j=0;j<(c==i?a[i]:l[i])&c<n;j++)l[c++]=a[i%a.length];return l;}( 115 byte )
Kevin Cruijssen

Đề xuất (c==i?a:l)[i]thay vìc==i?a[i]:l[i]
trần mèo

5

R , 120 114 108 byte

-6 byte nhờ vào plannapus

function(A,N){i=inverse.rle
w=length
a=rle(A)
while(w(a$l)<N){a[[1]]=i(a)
a[[2]]=rep(A,l=w(a$l))}
i(a)[0:N]}

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

Chức năng ẩn danh; liên tiếp đảo ngược RLE, thay thế dài a[[1]]với RLE đảo ngược, và các giá trị a[[2]]với Anhân rộng với độ dài tương đương như của a$l.


@plannapus ah, đúng rồi! Tôi đã thử điều đó và làm hỏng R vì trong bài tập, nó sẽ tạo a$la$vnếu chúng không tồn tại, nhưng chúng sẽ không ảnh hưởng đến cuộc gọi đến inverse.rle, gây ra một vòng lặp vô hạn. Tôi nghĩ rằng tôi chỉ có thể sử dụng a$ltrong whileđiều kiện và repđiều kiện.
Giuseppe

5

Haskell , 68 byte

Rất cám ơn Laikoni và flawr vì sự giúp đỡ của họ trong việc gỡ lỗi và đánh golf câu trả lời này trong phòng chat PPCG Haskell, Of Monads and Men . Gợi ý chơi golf chào mừng! Hãy thử trực tuyến!

(.f).take
f a@(z:_)=(z<$[1..z])++do i<-[1..];cycle a!!i<$[1..f a!!i]

Dòng đầu tiên là một chức năng ẩn danh. Dòng thứ hai là sự hiểu biết danh sách vô hạn tạo ra chuỗi giống Kolakoski của chúng tôi.

Giải trình

Đầu tiên, chúng tôi xác định zlà người đứng đầu avới a@(z:_). Sau đó, chúng tôi khởi tạo trình tự với (z<$[1..z]).

Sau đó, từ đó 1trở đi, do i<-[1..]chúng tôi nối các phần sau vào chuỗi : cycle a!!i<$[1..f a!!i], là ithành viên thứ-thứ của a(chu kỳ vô thời hạn) được nối thêm f a!!ilần.

Cuối cùng, hàm ẩn danh chỉ đơn giản lấy các nthuật ngữ đầu tiên của chuỗi giống Kolaskoski của chúng tô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.