コラコスキーのような自己参照シーケンス


19

これは、コラコスキーシーケンス(OEIS A000002)の定義方法です。

Kolakoski配列が含まシーケンスである12、そしてn配列の番目の要素はの長さであるn配列自体に等しい要素(ラン)の番目のグループ。シーケンスの最初の20項とそれぞれの長さは次のとおりです。

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

基本的に、コラコスキシーケンスの等しい要素のグループの長さはコラコスキシーケンス自体です。

これまでのところ、良いので、なぜ我々は自分自身を制限するべきである12?行きません!2つの入力(正の整数の配列と整数)が与えられるAと、を循環することによって定義されるコラコスキーのようなシーケンスのN最初のN項を返しAます。それをよりよく理解するために、新しく追加されたグループの長さを括弧内に入れた実例があります:

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 ]

以下に、先頭に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 ]

上記でわかるように、最終結果はN = 10要素にカットされました。n番目の要素はどのくらいであるべきn要素自体は、それが参照グループに属している場合でも、第等しい要素の基です。上記の場合のように、最初1は、その最初のグループを指し1、最初2は、それで始まる2番目のグループを指します。

ルール

  • A連続する2つ以上の等しい要素は決してないと仮定できます。A回以上の整数を含んでいてもよいが、最初と最後の要素が等しいことなく、A少なくとも2つの要素が含まれます(例えば[1, 2, 2, 3][2, 4, 3, 1, 2][3]与えられるつもりはありません)。これは、連続する等しい要素があった場合、最終結果はそのようなシーケンスの無効なプレフィックスになるためです。
  • A正の整数のみが含まれていると仮定することができます(そうでない場合、そのようなシーケンスは未定義になります)。
  • N負でない整数(N >= 0)であると仮定できます。
  • 要求された以上の用語を返すことはできません。
  • 標準の抜け穴のいずれかを使用することは固く禁じられています。
  • 適切なI / Oメソッドを使用できます。
  • 答えは自然言語の制限を超えて機能する必要はありませんが、理論的には、アルゴリズムは任意の大きな入力と整数に対して機能するはずです。
  • これはなので、最短の答えが勝ちです。

テストケース

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



@MartinEnderは既にリンクしていると思っていました
エリックアウトゴルファー

回答:


9

、8バイト

Ṡωȯ↑⁰`Ṙ¢

最初に長さを取り、次にリストを取ります。 オンラインでお試しください!

説明

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

u<s*V]M*QlGGvz

オンラインで試す:デモンストレーションまたはテストスイート

説明:

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

興味深い選択肢:u&VSvzs*V]M*Ql
ジャクベ

1
これは良いアプローチです。
エリックアウトゴルファー

5

Java 8、151 + 19 119 115バイト

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

オンラインでお試しください!


1
あなたは、2つの括弧を取り除く変更することで、4つのバイトを減らすことができます&&&してカンマを削除: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バイト
ケビンCruijssen

提案する(c==i?a:l)[i]代わりにc==i?a[i]:l[i]
ceilingcat

5

R120の 114 108バイト

plannapusのおかげで-6バイト

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

オンラインでお試しください!

無名関数; 連続的な長さを置き換え、RLEを反転させるa[[1]]反転RLEと、および値a[[2]]A長さに複製は、と等しいですa$l


@plannapusああ、そう!私はそれを試してRをクラッシュさせました。なぜなら割り当てでは、それが作成さa$la$v、それらが存在しない場合、それらは呼び出しに影響せずinverse.rle、無限ループを引き起こすからです。私がのみを使用することができると思うa$lwhile状態とrep状態。
ジュゼッペ

5

ハスケル、68バイト

PPCG HaskellチャットルームOf Of Monads and Menでこの回答をデバッグおよびゴルフするのを手伝ってくれたLaikoniとflawrに感謝します。ゴルフの提案を歓迎します!オンラインでお試しください!

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

最初の行は無名関数です。2行目は、コラコスキーのようなシーケンスを生成する無限リストの内包表記です。

説明

まず、with zの先頭として定義aa@(z:_)ます。次に、でシーケンスを初期化します(z<$[1..z])

次に、1以降、do i<-[1..]シーケンスに次を追加します。cycle a!!i<$[1..f a!!i]、これは(無限に循環する)追加された時間のi-番目のメンバーです。af a!!i

最後に、匿名関数は、単にnKolaskoskiのようなシーケンスの最初の項を取ります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.