Linusシーケンスを生成


14

定義

OEIS A006345の説明から:

見つけるa(n)には、1またはのいずれかを検討してください2。それぞれについて、最も長い繰り返しの接尾辞を見つけます。つまり、それぞれについてa(n)=1,2sシーケンスがでa(1),...,a(n)終わるプロパティを持つ最も長いシーケンスを見つけますss。そのような接尾辞が短くなる数字を使用します。a(1) = 1

完成した例

a(1)=1

の場合a(2)=11 1最後から2倍になった部分文字列が最も長いシーケンスになり1ます。場合はa(2)=2代わりに、それは空のストリングになります。したがってa(2)=2

ときn=6、我々は、のいずれかを選択1 2 1 1 2 1して1 2 1 1 2 2。最初の選択肢で1 2 1は、末尾から連続して2倍になります。2番目の選択肢では、2代わりになります。したがって、a(6)=2

ときn=9、我々は、のいずれかを選択1 2 1 1 2 2 1 2 1 して1 2 1 1 2 2 1 2 2。最初の選択肢では、最長の2倍連続部分文字列はですが2 1、2番目の選択肢で1 2 2は、最後に連続して2倍になります。したがってa(9)=1

仕事

与えられたn、戻りa(n)ます。

スペック

  • n ポジティブになります。
  • 1インデックスの代わりに0インデックスを使用できます。その場合は、回答にその旨を明記してください。また、その場合、nすること0もできます。

テストケース

テストケースは1から始まります。ただし、0インデックスを使用できます。

n  a(n)
1  1
2  2
3  1
4  1
5  2
6  2
7  1
8  2
9  1
10 1
11 2
12 1
13 2
14 2
15 1
16 1
17 2
18 1
19 1
20 1

参照資料


1
のテストケースでn=9は、最初の選択肢の最後に1 2 1 1 2 2 1 2 1二重の部分文字列2 1があります。
シャーロック

1
リンクされたOEISページには、〜43バイトのゴルフ用Perlソリューションがあります。
リオリ

回答:


7

ハスケル、146の 140 137 133 118バイト

s!l|take l s==take l(drop l s)=l|1<2=s!(l-1)
g[w,x]|w<x=1|1<2=2
a 1=1
a n=g$(\s x->(x:s)!n)(a<$>[n-1,n-2..1])<$>[1,2]

本当に必要(\x->(\s->...ですか?そうでなければ、書くことができます(\x s->...
-flawr

それはいくつかの節約に役立ちます
プログラムマン

PPCGへようこそ!
-betseg

正しい上限を使用する代わりにdiv ...、短い方を使用できますn。追加の比較はすべてfalseを返し、結果を変更しません。
クリスチャンシーバーズ

いいね、値が大きすぎるとテイクがクラッシュすると思いました
プログラムマン

6

Python、137バイト

def a(n,s=[0],r=lambda l:max([0]+filter(lambda i:l[-i:]==l[-i*2:-i],range(len(l))))):
 for _ in[0]*n:s+=[r(s+[0])>r(s+[1])]
 return-~s[n]

このソリューションは、0ベースのインデックスを使用しています。


6

ゼリー25 24 22 20 バイト

Dennisのおかげで2バイト。

2;€µḣJf;`€$ṪLµÞḢ
Ç¡Ḣ

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

Pythでの私の回答のポート

Ç¡Ḣ   Main chain

 ¡    Repeat for (input) times:
Ç         the helper chain
  Ḣ   Then take the first element



2;€µḣJf;`€$ṪLµÞḢ  Helper chain, argument: z

2;€               append z to 1 and 2, creating two possibilities
   µ         µÞ   sort the possibilities by the following:
    ḣJ                generate all prefixes from shortest to longest
       ;`€            append the prefixes to themselves
      f   $           intersect with the original set of prefixes
           Ṫ          take the last prefix in the intersection
            L         find its length
                 Ḣ   take the first (minimum)



2

MATL、34バイト

vXKi:"2:"K@h'(.+)\1$'XXgn]>QhXK]0)

オンラインでお試しください!または、すべてのテストケースを確認します

説明

v             % Concatenate stack vertically: produces empty array
XK            % Copy to clipboard K. This clipboard holds the current sequence
i:            % Take input n. Generate vector [1 2 ... n]
"             % For each k in [1 2 ... n]
  2:          %   Push [1 2]. These are the possible digits for extending the sequence
  "           %     For each j in [1 2]
    K         %       Push contents of clipboard K (current sequence)
    @         %       Push j (1 or 2)
    h         %       Concatenate horizontally: gives a possible extension of sequence
    '(.+)\1$' %       String to be used as regex pattern: maximal-length repeated suffix
    XX        %       Regex match
    gn        %       Convert to vector and push its length: gives length of match
  ]           %    End. We now have the suffix lengths of the two possible extensions
  >           %    Push 1 if extension with "1" has longer suffix than with "2"; else 0 
  Q           %    Add 1: gives 2 if extension with "1" produced a longer suffix, or 1
              %    otherwise. This is the digit to be appended to the sequence
  h           %    Concatenate horizontally
  XK          %    Update clipboard with extended sequence, for the next iteration
]             % End
0)            % Get last entry (1-based modular indexing). Implicitly display

2

Python 2、94バイト

import re
s='1'
exec"s+=`3-int(re.search(r'(.*)(.)\\1$',s).groups()[1])`;"*input()
print s[-1]

0ベースのインデックスを使用します。Ideoneでテストします。


2

Pyth、26バイト

huh.mleq#.<T/lT2._b+RGS2QY

テストスイート。

説明

ときn = 6、我々は、のいずれかを選択1 2 1 1 2 1して1 2 1 1 2 2

これら2つの可能性を生成し、それらのサフィックスを調べます。

まず一つは、接尾辞があります:12 11 2 11 1 2 12 1 1 2 11 2 1 1 2 1

長さを2で割った値を回転させた後、それらが同じかどうかをチェックすることで、2倍のサフィックスをフィルター処理します(このチェックは12も)。

最後の二重接尾辞を取り、その長さを取ります。

次に、上記で生成された最小長に対応する可能性を選択します。

次に、次の値に進みます n

このプログラムの目的では、逆の配列を生成する方がゴルファーでした。

huh.mleq#.<T/lT2._b+RGS2QY
 u                      QY   repeat Q (input) times,
                             start with Y (empty array),
                             storing the temporary result in G:
                   +RGS2         prepend 1 and 2 to G,
                                 creating two possibilities
   .m             b              find the one that
                                 makes the following minimal:
                ._                   generate all prefixes
       q#                            filter for prefixes as T
                                     that equals:
         .<T/lT2                         T left-rotated
                                         by its length halved
      e                              take the last one
     l                               generate its length
  h                              take the first minimal one
h                                take the first one from the generated
                                 array and implicitly print it out



2

Perl、40バイト

$a.=/(.*)(.)\1$/^$2for($a)x$_;$_=$a%5+1

コードの長さは39バイトで-pスイッチが必要です(+1バイト)。

ループは、関連するOEISページの Perlソリューションに触発されていますが、私は独自に正規表現を思いつきました。

Ideoneでテストします。


あなたはOEIS、具体的には、トンHospel /フィル・カーモディ... outgolfedいる
漏出修道女

OEISスクリプトは入力を受け取らず、シーケンス全体を出力するため、実際には比較できません。
デニス

1

JavaScript(ES6)、84

インデックスベース0

n=>eval("s='1';for(r=d=>(s+d).match(/(.*)\\1$/)[0].length;n--;s+=c)c=r(1)>r(2)?2:1")

少ないゴルフ

n=>{
  r = d => (s+d).match(/(.*)\1$/)[0].length;
  c = '1';
  for(s = c; n--; s += c)
    c = r(1) > r(2) ? 2 : 1;
  return c;
}

テスト

F=
n=>eval("s='1';for(r=d=>(s+d).match(/(.*)\\1$/)[0].length;n--;s+=c)c=r(1)>r(2)?2:1")

for(n=0;n<20;n++)console.log(n,F(n))

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