Urutan referensi diri seperti Kolakoski

19

Ini adalah bagaimana urutan Kolakoski (OEIS A000002 ) didefinisikan:

Urutan Kolakoski adalah urutan yang berisi 1dan 2, dan nelemen ke-5 dari urutan adalah panjang nkelompok ke-sama dari elemen (run) dalam urutan itu sendiri. 20 syarat pertama dari urutan dan panjang masing-masing adalah:

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

Pada dasarnya, panjang kelompok unsur yang sama dari urutan Kolakoski adalah urutan Kolakoski itu sendiri.

Sejauh ini, sangat baik, tetapi mengapa kita harus membatasi diri pada 1dan 2? Kita tidak akan pergi! Diberikan dua input, array bilangan bulat positif Adan bilangan bulat N, mengembalikan Nistilah pertama dari urutan seperti Kolakoski yang didefinisikan oleh siklus bersepeda A. Untuk memahami lebih baik, berikut adalah contoh yang berhasil dengan panjang grup yang baru ditambahkan dalam tanda kurung:

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 ]

Berikut ini contoh lain yang berhasil dengan seorang pemimpin 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 ]

Seperti yang Anda lihat di atas, hasil akhir dipotong menjadi N = 10elemen. The nelemen th harus berapa lama nth sama-elemen kelompok, bahkan jika elemen itu sendiri termasuk dalam kelompok itu mengacu. Seperti dalam kasus di atas, yang pertama 1merujuk pada kelompok pertama yang demikian 1, dan yang pertama 2mengacu pada kelompok kedua yang dimulai dengan itu.

Aturan

  • Anda dapat berasumsi bahwa Atidak akan pernah memiliki dua atau lebih elemen yang sama berturut-turut. Amungkin mengandung integer lebih dari sekali, tetapi elemen pertama dan terakhir tidak akan sama, dan Aakan mengandung setidaknya 2 elemen (misalnya [1, 2, 2, 3], [2, 4, 3, 1, 2]dan [3]tidak akan diberikan). Itu karena jika ada elemen yang sama berturut-turut, hasil akhirnya akan menjadi awalan yang tidak valid untuk urutan seperti itu.
  • Anda dapat mengasumsikan Ahanya berisi bilangan bulat positif (karena urutan seperti itu akan tidak terdefinisi).
  • Anda dapat menganggap Nadalah bilangan bulat non-negatif ( N >= 0).
  • Anda tidak dapat mengembalikan lebih banyak persyaratan daripada yang diminta.
  • Dilarang menggunakan salah satu celah standar .
  • Anda dapat menggunakan metode I / O yang masuk akal .
  • Jawaban Anda tidak harus bekerja di luar batas bahasa alami, tetapi secara teori algoritma Anda harus bekerja untuk input dan bilangan bulat besar yang sewenang-wenang .
  • Ini , jadi jawaban terpendek menang.

Uji kasus

[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]
Erik the Outgolfer
sumber
sandbox (pengguna 2k +)
Erik the Outgolfer
Terkait
Martin Ender
@ MartinEnder pikir saya sudah menautkan itu
Erik the Outgolfer

Jawaban:

9

Sekam , 8 byte

Ṡωȯ↑⁰`Ṙ¢

Mengambil panjang pertama, lalu daftar. Cobalah online!

Penjelasan

Ṡωȯ↑⁰`Ṙ¢  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.
Zgarb
sumber
8

Pyth, 14 byte

u<s*V]M*QlGGvz

Cobalah online: Demonstrasi atau Test suite

Penjelasan:

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
Jakube
sumber
Alternatif menarik:u&VSvzs*V]M*Ql
Jakube
1
Ini pendekatan yang bagus.
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;}

Cobalah online!

Roberto Graham
sumber
1
Anda dapat mengurangi empat byte dengan mendapatkan menyingkirkan dua kurung, mengubah &&ke &dan menghapus tanda koma: 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 bytes )
Kevin Cruijssen
Sarankan (c==i?a:l)[i]alih-alihc==i?a[i]:l[i]
ceilingcat
5

R , 120 114 108 byte

-6 byte terima kasih kepada 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]}

Cobalah online!

Fungsi anonim; berturut-turut membalikkan RLE, mengganti panjang a[[1]]dengan RLE terbalik, dan nilai-nilai a[[2]]dengan Adireplikasi dengan panjang yang sama dengan a$l.

Giuseppe
sumber
@plannapus ah, benar! Saya sudah mencobanya dan menabrak R karena dalam penugasan, itu akan membuat a$ldan a$vjika mereka tidak ada, tetapi mereka tidak akan memengaruhi panggilan inverse.rle, menyebabkan loop tak terbatas. Saya pikir saya hanya dapat menggunakan a$ldalam whilekondisi dan repkondisi.
Giuseppe
5

Haskell , 68 byte

Banyak terima kasih kepada Laikoni dan flawr atas bantuan mereka dalam debugging dan golf jawaban ini di chatroom PPCG Haskell, Of Monads and Men . Selamat datang saran bermain golf! Cobalah online!

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

Baris pertama adalah fungsi anonim. Baris kedua adalah pemahaman daftar tak terbatas yang menghasilkan urutan seperti Kolakoski kami.

Penjelasan

Pertama, kami mendefinisikan zsebagai kepala adengan a@(z:_). Kemudian, kita inisialisasi urutan dengan (z<$[1..z]).

Kemudian, dari 1dan seterusnya,, do i<-[1..]kami menambahkan yang berikut ini ke urutan :, cycle a!!i<$[1..f a!!i]yang merupakan ianggota ke-kali dari a(siklus yang tidak terbatas) ditambahkan f a!!i.

Akhirnya, fungsi anonim hanya mengambil nsyarat pertama dari urutan seperti Kolaskoski kami.

Sherlock9
sumber
1

Python 2 , 123 byte

x,y=input()
k=x[0]
t,j=[],0
if k==1:t,j=[k]+x[1]*[x[1]],2
while len(t)<y:t+=(j and t[j]or k)*[x[j%len(x)]];j+=1
print t[:y]

Cobalah online!

officialaimm
sumber