ゴロムの不安定なシーケンス


21

OEISにGolombのシーケンスバリエーション(A111439)があります。GolombのシーケンスのA(n)ようnに、シーケンスに表示される頻度を説明します。ただし、さらに、連続する2つの番号が同一であってはなりません。シーケンスを構築する際、A(n)これらの2つのプロパティに違反しない最小の正の整数として常に選択されます。連続する同一の番号が許可されていないため、シリーズは成長するにつれてわずかに上下に揺れます。最初の100の用語は次のとおりです。

1, 2, 3, 2, 3, 4, 3, 4, 5, 6, 5, 6, 5, 6, 7, 6, 7, 8, 7, 8, 9, 8, 9, 8, 9, 
10, 9, 10, 9, 10, 11, 10, 11, 10, 11, 10, 11, 12, 11, 12, 13, 12, 13, 12, 
13, 12, 13, 12, 13, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 16, 15, 
16, 17, 16, 17, 16, 17, 16, 17, 16, 17, 18, 17, 18, 17, 18, 19, 18, 19, 18, 
19, 18, 19, 18, 19, 18, 19, 20, 19, 20, 21, 20, 21, 20, 21, 20, 21, 20

最初の10,000個の番号の完全なリストは、OEISにあります。

課題はA(n)、与えられたを計算するプログラムまたは関数を書くことnです。nされる1自己記述プロパティが動作することを確認するためにベース。

ルール

プログラムまたは関数を作成し、入力を受け取り出力を提供する当社の標準的な方法を使用できます。

任意のプログラミング言語を使用できますが、これらの抜け穴はデフォルトでは禁止されています。

これはであるため、バイト単位で測定された最短の有効な回答が勝ちます。

テストケース

n     A(n)
1     1
4     2
10    6
26    10
100   20
1000  86
1257  100
10000 358


3
私は興味があったのでグラフにした。ネイト。
エンジニアトースト

4
@EngineerToastグラフもOEISにあります。グラフに表示される「ラン」の長さを調べていましそれは本当に奇妙になります。(このグラフはN、最後の発生後N-1のウォブルの数を測定する頻度を示していますN。)
マーティンエンダー

回答:


5

Haskell、67バイト

f k|k<4=k|p<-k-1=[n|n<-[1..],n/=f p,sum[1|a<-[1..p],f a==n]<f n]!!0

関数を定義しますfオンラインでお試しください!f 15TIO での計算のタイムアウトは非常に遅くなります。

説明

定義に従ってください:すべての段階でn、制約を満たす前の最小の正の数を選択します(前のエントリと等しくなく、f nまだ発生していない時間)。

f k             -- Define f k:
 |k<4=k         -- If k < 4, it's k.
 |p<-k-1=       -- Otherwise, bind k-1 to p,
  [n|           -- compute the list of numbers n where
   n<-[1..],    -- n is drawn from [1,2,3,...],
   n/=f p,      -- n is not equal to f p, and
   sum[1|       -- the number of
    a<-[1..p],  -- those elements of [1,2,3,...,p]
    f a==n]     -- whose f-image equals n
   <f n]        -- is less than f n,
  !!0           -- and take the first element of that list.

5

Mathematica、69 68バイト

余分な-1バイトを見つけてくれたMartin Enderに感謝します!

Last@Nest[{##&@@#,1//.x_/;x==Last@#||#~Count~x==#[[x]]->x+1}&,{},#]&

n入力として正の整数を取り、正の整数を返す名前のない関数。nこのシーケンスの最初の要素のリスト全体を作成してから、その要素を取得しLastます。リストは、空のリストから開始し、{}関数n時間を連続して(を介してNest)リストを操作することで作成されます。

問題の関数は{##&@@#,1//.x_/;x==Last@#||#~Count~x==#[[x]]->x+1}&、シーケンス値の部分的なリスト(本質的に##&@@#)を取り、次の値を追加します。次の値は、で始まり、条件が満たされる限りx=1繰り返し置換xx+1x==Last@#||#~Count~x==#[[x]]ます。つまり、いずれかxが前の要素であるかx、リストに正しい回数だけ既に存在する場合です。(たとえば)x初期リストのth要素を呼び出すべきではないため、この関数はいくつかのエラーを吐き出し{}ます。ただし、値はすべて正しいです。


4

Python 2、99 86バイト

合計13バイトのいくつかの改善をしてくれた@Dennisに感謝します!

s=0,1,2,3
exec't=1\nwhile t==s[-1]or s.count(t)/s[t]:t+=1\ns+=t,;'*input()
print s[-4]

プログラムは非常に単純に進行します。これまでに決定された値のリストを追跡し、次の値を追加しようとします。1可能な場合、リストの最後にaを追加しようとします。そうでない場合は、2何かが許可されるまでa などを試行します。

次に、結果を1,2,3にシードすることから始めます1,2,3。これは、すでに計算された値のリストが短すぎるという問題を回避するために行われます。少なくともif がthenの場合、厳密に未満であると推測します。(このプログラムでは、はに等しい。リストはPythonで-indexedされているため、リストは実際に初期化されます。そのため、たとえば、および)。n4a(n)ns[n]a(n)[0,1,2,3]0a(1)=s[1]=1a(2)=s[2]=2

したがって、決定しようとしているとしましょう。s[m]つまり、リストにはが既に含まれていますs[0], s[1], ..., s[m-1]。から始めてt=1、設定しようとしますs[m]=1。それがうまくいかない場合、に行きt=2、設定しようとしますs[m]=2。インクリメントするたびに... tかどうかをチェックしs.count(t)==s[t]ます。ただし、のように高くする必要がない限り、右側はエラーを生成しませんt=m。推測では、計算する最初の値は実際にはであるため、実行する必要はありませんs[4]

この実装は、シーケンスの値を必要以上に3つ計算します。たとえばn8、それが通って上の計算だろうs[11]、それは値を返す前にs[8]

推測の証拠を見てうれしいです。私はそれが(強い?)誘導によって証明できると信じています。

編集:これは推測の証拠です。実際には、余分な作業を必要としないため、ステートメントのわずかに強い形式を証明しています。

定理:すべてn以上の場合4、項a(n)は以下です(n-2)

証明(強力な帰納法による):(基数):のn=4ためn=4、ステートメントはtrueですa(4) = 2 = 4-2

今仮定a(k)未満又はに等しいk-2すべてのためk4スルーn、包括的(および想定n少なくともあります4)。特に、これは、シーケンスの以前のすべての用語が最大であったことを意味します(n-2)a(n+1)せいぜいそれを示す必要があり(n-1)ます。定義上、これa(n)はどの条件にも違反しない最小の正の整数であるため、値(n-1)がどの条件にも違反しないことを示す必要があります。

(n-1)帰納法の仮説により、前のエントリが最大であったため、値は「連続した繰り返しなし」条件に違反しません(n-2)。そして、既に到達した回数でない限り、「出現a(m)回数mは」という条件に違反しません。しかし、強力な誘導の仮定により、以前に達していた時間を、と等しくないので、すべて陽性です。(n-1)a(n-1)(n-1)0a(n-1)0a(m)m

したがって、必要に応じa(n+1)n-1 = (n+1)-2、以下になります。QED。


3

ゼリー、17バイト

Ṭ€S<;1Tḟ®Ḣ©ṭ
⁸Ç¡Ṫ

最後の3つのテストケースは、TIOには多すぎます。10001257をローカルで検証しました。

オンラインでお試しください!または、最初の100語を確認します。

使い方

⁸Ç¡Ṫ          Main link. No arguments.

⁸             Yield [].
 Ç¡           Execute the helper link n times (where n is an integer read from
              STDIN), initially with argument [], then with the previous return
              value as argument. Yield the last return value.
              Tail; yield the last element of the result.


Ṭ€S<;1Tḟ®Ḣ©ṭ  Helper link. Argument: A (array)

Ṭ€            Untruth each convert each k into an array of k-1 zeroes and one 1.
  S           Sum; column-wise reduce by +, counting the occurrences of all
              between 1 and max(A).
   <          Compare the count of k with A[k] (1-indexed), yielding 1 for all
              integers that still have to appear once or more times.
    ;1        Append a 1 (needed in case the previous result is all zeroes).
      T       Truth; find all indices of ones.
       ḟ®     Filter-false register; remove the value of the register (initially 0)
              from the previous result.
         Ḣ©   Head copy; yield the first (smallest) value of the result and save
              it in the register.
           ṭ  Tack; append the result to A.

3

パイソン277の 74バイト

f=lambda n,k=1:n*(n<4)or map(f,range(n)+k*[n-1]).count(k)<f(k)or-~f(n,k+1)

これは@mathmandanのアルゴリズムの再帰的な実装です

実装はO(非常識)です。入力9はローカルで2秒、入力10は 52秒、入力11は 17分28秒かかります。ただし、ラムダではなく通常の関数として宣言されている場合、メモ化を使用してテストケースを検証できます。

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

メモ化を使用しても、TIOはf(1257)またはf(10000)(両方ともローカルで検証)を計算できないことに注意してください。


2

05AB1E32 31バイト

XˆXˆG[N¯2(è<›¯¤NÊsN¢¯Nè‹&&#]N.ˆ

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

説明

XˆXˆ                             # initialize global list as [1,1]
    G                            # input-1 times do:
     [                    #]     # loop until expression is true     
      N¯2(è<›                    # n > list[-2]-1
             ¯¤NÊ                # list[-1] != N
                 sN¢¯Nè‹         # count(list, N) < list[N]
                        &&       # logical AND of the 3 expressions
                            N.ˆ  # add N to global list 
                                   and output last value in list and end of program

技術的にはNをグローバルリストにG追加するとループになりますが、05AB1Eのすべてのループは同じ変数Nをインデックスとして使用するため、内側のループはNを上書きして、ループの外側に追加できることを意味します。[...]G

ネストされたループと条件に関する問題により、ループ内でこれを行うことができません。


2

Befunge、141 136バイト

<v9\0:p8\2:*2:-1<9
v>p1+:3\8p0\9p:#^_&
>1-:#v_1.@>$8g.@
*+2%\>1-:!|>$!:::9g!\!9g!*\:8g\!8g`
9\+1g9::< \|`g9\g8+2::p
g2+\8p2+^:<>:0\9p::8

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

Befungeのメモリ制限のため、シーケンス内の以前のすべてのエントリエントリを追跡するのは実際的ではないため、このソリューションでは値をより直接計算するメモリフットプリントの小さいアルゴリズムを使用します。

ただし、Befunge-93リファレンスインタープリターでは符号付き8ビット値であるセルサイズによってまだ制限されているため、シーケンスでA(1876) = 126サポートされる最大の偶数はであり、サポートされる最大の奇数はA(1915) = 127です。

より大きな値をテストする場合は、より大きなセルサイズのインタープリターを使用する必要があります。これには、ほとんどのBefunge-98実装が含まれているはずですオンラインで試してみてください!)。


0

Python 2、117バイト

えー そんなに短くない。シンプルな反復ソリューション。

L=[1,2,3]
n=input()
while len(L)<n:
 for i in range(2,n):
    if L.count(i)<L[i-1]and L[-1]!=i:L+=[i];break
print L[n-1]

オンラインで試す

再帰的な解決策に対する非常に悪い試みです(129バイト):

def f(n,L=[1,2,3]):
 if len(L)>=n:print L[n-1];exit(0)
 for i in range(2,n):
    if L.count(i)<L[i-1]and L[-1]!=i:f(n,L+[i])
 f(n,L)

一定。バイトを保存する-1代わりに使用できると思いましたがn-1、そうではないと思います。
mbomb007
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.