レカマンの複製


14

Recamánのシーケンスは次のように定義されます。

an={0if n = 0an1nif an1n>0 and is not already in the sequence,an1+notherwise

または擬似コードで:

a(0) = 0,
if (a(n - 1) - n) > 0 and it is not 
   already included in the sequence,
     a(n) = a(n - 1) - n 
else 
     a(n) = a(n - 1) + n. 

最初の番号は(OEIS A005132)です。

0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11, 22, 10, 23, 9, 24, 8, 25, 43, 62, 42, 63, 41, 18, 42

このシーケンスを調べると、たとえば重複a(20) = a(24) = 42(0インデックス)があることに気付くでしょう。シーケンスの前に同じ番号が少なくとも1つある場合、その番号を重複と呼びます。


チャレンジ:

整数入力kを取得し、Recamánのシーケンスで重複として検出された順番で最初のk個の重複する番号、またはk番目の番号のみを出力します。

この最初に重複した番号は次のとおりです。

42, 43, 78, 79, 153, 154, 155, 156, 157, 152, 265, 261, 262, 135, 136, 269, 453, 454, 257, 258, 259, 260, 261, 262

注意すべき点がいくつかあります。

  • a(n)は、a(n + m)== a(n)であっても、a(0)... a(n-1)に同じ数がない場合、重複としてカウントされません。
  • 42は43の前になります。43の複製の前にその複製が発生するためです。
  • シーケンスはソートされていません
  • このシーケンスにも要素が重複しています。たとえば、12番目と23番目の数値は両方とも262(0から始まる)です。

テストケース(0インデックス付き)

k      Output
    0      42
    9     152
   12     262
   23     262
  944    5197
  945   10023
10000   62114

これはなので、各言語で最も短いコードが優先されます!

説明が奨励されています!



なぜ43以前に出力されないの42ですか?Recamánのシーケンスの最初に表示されます。最初に重複と判明したものを最初に出力するということですか?
ルイスメンドー

1
43424243

また、最近人気のmath.SE質問を見ました:P
orlp

@orlp?リンクできますか?私は...それを見ていない
Stewieグリフィン

回答:


5

Wolfram言語(Mathematica)88 85 76バイト

(For[i=k=j=p=0,k<#,i~FreeQ~p||k++,i=i|p;p+=If[p>++j&&FreeQ[i,p-j],-j,j]];p)&

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

1インデックス付き。

説明

For[

For ループ。

i=k=j=p=0

i={a1a2}kj=np=an1

k<#

k入力より小さい間、繰り返します。

i=i|p

追加pi頭部使用Alternatives(のgolfierバージョンListこの場合は)。

p+=If[p>++j&&FreeQ[i,p-j],-j,j]

jpjan1>np-jian1np-jpj

i~FreeQ~p||k++

各反復は、kif pがin i(ない場合は||(= or)ショートサーキット)でない場合に増加します。

... ;p

戻るp





2

JavaScript(ES6)、66 59バイト

0 番目のインデックスが付けられたN番目の用語を返します。

i=>(g=x=>!g[x+=x>n&!g[x-n]?-n:n]||i--?g(g[n++,x]=x):x)(n=0)

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

どうやって?

私たちは使用()グラムを、当社の主な再帰関数として及び重複を追跡するためにオブジェクトとして。

i => (                    // given i
  g = x =>                // g = recursive function and generic object
    !g[x +=               // update x:
      x > n & !g[x - n] ? //   if x is greater than n and x - n was not visited so far:
        -n                //     subtract n from x
      :                   //   else:
        n                 //     add n to x
    ]                     // if x is not a duplicate
    || i-- ?              // or x is a duplicate but not the one we're looking for:
      g(g[n++, x] = x)    //   increment n, mark x as visited and do a recursive call
    :                     // else:
      x                   //   stop recursion and return x
)(n = 0)                  // initial call to g() with n = x = 0

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