Kolakoski benzeri kendinden referanslı diziler


19

Kolakoski dizisi ( OEIS A000002 ) şöyle tanımlanır:

Kolakoski sekansı içeren bir dizidir 1ve 2ve ndizinin inci elemanı uzunluğu ndizisi kendisinde eşit olan bir eleman (çalıştırma) th grubu. Dizinin ilk 20 terimi ve ilgili uzunluklar:

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

Esasen, Kolakoski dizisinin eşit eleman gruplarının uzunlukları Kolakoski dizisinin kendisidir.

Şimdiye kadar, çok iyi, ama neden kendimizi 1ve ile sınırlamalıyız 2? Yapmayacağız! Pozitif tamsayılar Ave bir tamsayı dizisi olmak üzere iki girdi göz önüne alındığında, döngü yoluyla tanımlanan Kolakoski benzeri dizinin Nilk Nterimlerini döndürür A. Daha iyi kavramak için, yeni eklenen grupların uzunluklarının köşeli parantez içinde çalıştığı bir örnek:

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 ]

İşte önde gelen bir başka örnek 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 ]

Yukarıda görebileceğiniz gibi, nihai sonuç N = 10unsurlara kesildi . nİnci elemanı ne kadar uzun olmalıdır neşit eleman inci grubu, elemanın kendisinin de değinmektedir grubuna ait olsa bile. Yukarıdaki durumda 1olduğu gibi, birincisi, sadece bu 1olan ilk 2gruba, birincisi ise onunla başlayan ikinci gruba karşılık gelir.

kurallar

  • Bunun Aasla iki veya daha fazla ardışık eşit öğeye sahip olmayacağını varsayabilirsiniz . Abirden fazla kez bir tamsayı içerebilir, fakat birinci ve son elemanları eşit olmayacaktır, ve Aen az 2 öğeleri içerebilir (örneğin [1, 2, 2, 3], [2, 4, 3, 1, 2]ve [3]verilecek olacak değildir). Çünkü ardışık eşit elemanlar olsaydı, nihai sonuç böyle bir sıra için geçersiz bir önek olurdu.
  • AYalnızca pozitif tamsayılar içerdiğini varsayabilirsiniz (bu tür bir dizi başka türlü tanımsız olur).
  • NNegatif olmayan bir tamsayı ( N >= 0) olduğunu varsayabilirsiniz .
  • İstediğinizden daha fazla terim iade edemezsiniz.
  • Standart boşluklardan herhangi birini kullanmak kesinlikle yasaktır.
  • Herhangi bir makul I / O yöntemi kullanabilirsiniz .
  • Cevabınız doğal dil sınırlarının ötesinde çalışmak zorunda değildir, ancak teoride algoritmanız keyfi olarak büyük girdiler ve tamsayılar için çalışmalıdır .
  • Bu , bu yüzden en kısa cevap kazanır.

Test senaryoları

[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]

sandbox (2k + users)
Erik Outgolfer


@MartinEnder bunu zaten bağladığımı sanıyordum
Outgolfer Erik

Yanıtlar:


9

kabuk , 8 bayt

Ṡωȯ↑⁰`Ṙ¢

Önce uzunluğu, sonra listeyi alır. Çevrimiçi deneyin!

açıklama

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

Pyth, 14 bayt

u<s*V]M*QlGGvz

Çevrimiçi deneyin: Gösteri veya Test paketi

Açıklama:

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

İlginç bir alternatif:u&VSvzs*V]M*Ql
Jakube

1
Bu hoş bir yaklaşım.
Outgolfer Erik

5

Java 8, 151 + 19119 115 bayt

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

Çevrimiçi deneyin!


1
Sen, iki parantez kurtulmak alma değiştirerek dört bayt azaltabilir &&için &ve bir virgül kaldırarak: 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 bayt )
Kevin Cruijssen

(c==i?a:l)[i]Bunun yerine önerc==i?a[i]:l[i]
ceilingcat

5

R , 120 114 108 bayt

Plannapus sayesinde -6 bayt

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

Çevrimiçi deneyin!

Anonim işlev; arka arkaya uzunlukları değiştirilerek, rle tersine çevirir a[[1]]ters RLE ile ve değerler a[[2]]ile Abir uzunluğa çoğaltılan eşit a$l.


@plannapus ah, doğru! Bunu denedim ve R'yi çökerttim, çünkü atamada, yaratacak a$lve a$vyoksa, ancak çağrıyı etkilemeyecek, inverse.rlesonsuz bir döngüye neden olacaklar . Ben sadece kullanabilirsiniz düşünmek a$lde whilekoşulu ve repkoşul.
Giuseppe

5

Haskell , 68 bayt

Birçok Laikoni sayesinde ve hata ayıklama ve PPCG Haskell sohbet odası bu cevabı, golf katkılarından dolayı flawr monad'ların ve İnsanlar . Golf önerileri hoş geldiniz! Çevrimiçi deneyin!

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

İlk satır anonim bir fonksiyondur. İkinci satır, Kolakoski benzeri dizimizi üreten sonsuz liste kavramasıdır.

açıklama

İlk olarak, tanımlamak zbaşkanı olarak asahipa@(z:_) . Sonra diziyi ile başlatırız (z<$[1..z]).

Daha sonra, gelen 1itibaren, do i<-[1..]biz ekleme dizisi için aşağıdaki: cycle a!!i<$[1..f a!!i], ki iiçinde inci elemanı a(belirsiz tur olarak) eklenirf a!!i kez.

Son olarak, anonim işlev nKolaskoski benzeri dizimizin ilk terimlerini alır .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.