キンバリングシーケンス


18

前書き

もちろん、は多くの課題があるので、別の課題を示します。

キンバリングシーケンス(A007063)は次のとおりです。

1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28, 22, ...

これは、通常の反復をシャッフルすることにより生成されます。

[1] 2  3  4  5  6  7  8

シーケンスの最初の項は1です。その後、左側のすべての用語が使用されるまでシーケンスをシャッフルします。シャッフルにはパターンがありますright - left - right - left - ...。の左側に用語がないため1、シャッフルはありません。次のものが得られます。

 2 [3] 4  5  6  7  8  9

i 番目の反復で、i 番目のアイテムを破棄し、それをシーケンスに入れます。これは2目の反復なので、2番目の項目は破棄します。シーケンスは次のようになります1, 3。次の反復では、上記のパターンで現在の反復をシャッフルします。i 番目のアイテムの右側にある最初の未使用アイテムを受け取ります。これはたまたま4です。これを新しい反復に追加します。

 4

次に、i 番目のアイテムの左側にある最初の未使用アイテムを取得します。これがあります2。これを新しい反復に追加します。

 4  2

i 番目のアイテムの左にアイテムが残っていないため、シーケンスの残りを新しい反復に追加します。

 4  2 [5] 6  7  8  9  10  11  ...

これは3目の反復なので、3番目のアイテムを破棄します5。これは、シーケンスの3番目の項目です。

 1, 3, 5

次の反復を取得するには、プロセスを繰り返します。明確でない場合、gifを作成しました。

ここに画像の説明を入力してください

gifは実際の投稿を書くよりも時間がかかりました

仕事

  • 非負の整数nが与えられた場合、シーケンスの最初のn項を出力します
  • 機能またはプログラムを提供できます
  • これはであるため、バイト数が最小の提出が勝ちです!

テストケース:

Input: 4
Output: 1, 3, 5, 4

Input: 8
Output: 1, 3, 5, 4, 10, 7, 15, 8

Input: 15
Output: 1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28

注:出力のコンマは不要です。たとえば、改行を使用したり、リストを出力したりできます。


私は、スタックの回転を利用する方法に取り組んでいる
Cyoce

@Cyoce幸運:)
アドナン

私がそれをする必要がありますように見ている
Cyoce

回答:


3

Pyth、22バイト

JS*3QVQ@JN=J.i>JhN_<JN

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

OPで説明されているシャッフルテクニックを実行するだけです。

説明:

JS*3QVQ@JN=J.i>JhN_<JN
JS*3Q                    assign the list [1, 2, ..., 3*input-1] to J
     VQ                  for N in range(Q):
       @JN                  print J[N]
            .i              interleave 
              >JhN             J[N+1:] with
                  _<JN         reverse J[:N]
          =J                assign the resulting list to J

6

ジュリア、78 71バイト

n->[(i=j=x;while j<2i-3 j=i-(j%2>0?1-j:j+22;i-=1end;i+j-1)for x=1:n]

これは、整数を受け入れて整数配列を返す名前のない関数です。呼び出すには、変数に割り当てます。

ここでのアプローチは、OEISで説明されているものと同じです。

ゴルフをしていない:

# This computes the element of the sequence
function K(x)
    i = j = x
    while j < 2i - 3
        j = i - (j % 2 > 0 ? 1 - j : j + 22
        i -= 1
    end
    return i + j - 1
end

# This gives the first n terms of the sequence
n -> [K(i) for i = 1:n]

Maurisのおかげで7バイト節約されました!


3

Mathematica 130バイト

(n=0;s={};Nest[(n++;AppendTo[s,z=#[[n]]];Flatten[TakeDrop[#,1+2(n-1)]/.{t___,z,r___}:> 
Riffle[{r},Reverse@{t}]])&,Range[3*#],#];s)&

我々は、範囲からなるリストから始まる1まで3xxKimberlingシーケンス用語の所望の数です。

各ステップでnTakeDrop現在のリストを2n+1用語のフロントリスト(作業が行われる場所)とリアリスト(後で修正されたフロントリストに結合されます)に分割します。フロントリストは、次のパターンと一致します。{t___,z,r___}ここで、zはフロントリストの中央にあるキンバリング用語です。 逆とD」、その後、リアリストが追加されます。が削除され、成長しているKimberlingシーケンスに()に追加されます。rRiffletzAppendTo

nによってインクリメントされ1、現在のリストは同じ関数によって次のように処理されますNest.


(n=0;s={};Nest[(n++;AppendTo[s,z=#[[n]]];Flatten[TakeDrop[#,1+2(n-1)]/.{t___,z,r___}:> 
Riffle[{r},Reverse@{t}]])&,Range[3*#],#];s)&[100]

{1、3、5、4、10、7、15、8、20、9、18、24、31、14、28、22、42、35、33、46、53、6、36、23、2 、55、62、59、76、65、54、11、34、48、70、79、99、95、44、97、58、84、25、13、122、83、26、115、82、91 、52、138、67、90、71、119、64、37、81、39、169、88、108、141、38、16、146、41、21、175、158、165、86、191、45 、198、216、166、124、128、204、160、12、232、126、208、114、161、156、151、249、236、263、243、101、121、72、120、47、229 }


2

Python 2、76バイト

for a in range(input()):
 b=a+1
 while-~b<2*a:b=a-(b^b%-2)/2;a-=1
 print a+b

説明

これは、多くのゴルフの変容後のOEISフォーミュラです!それは美しく働きました。元のコードは

i=b=a+1
while b<2*i-3:b=i-(b+2,1-b)[b%2]/2;i-=1
print i+b-1

私は最初にそれを取り除きi、それをa+1どこにでも置き換え、式を拡張しました:

b=a+1
while b<2*a-1:b=a+1-(b+2,1-b)[b%2]/2;a-=1
print a+b

次に、1バイトの空白を保存するb<2*a-1よう-~b<2*aに書き直し+1、選択、2による除算、および否定に移動しました。

while-~b<2*a:b=a-(b,-b-1)[b%2]/2;a-=1

次に、-b-1はだけな~bので、を書くことができます(b,~b)[b%2]。これはb^0 if b%2 else b^-1、XOR演算子、またはb^b%-2

while-~b<2*a:b=a-(b^b%-2)/2;a-=1

2

Pyth、29 25バイト

VQ+.W<hHyN-~tN/x%Z_2Z2hNN

Jakubeは4バイトを節約しましたが、コードの読み方がわかりません。

古いソリューションは次のとおりです。

VQKhNW<hKyN=K-~tN/x%K_2K2)+KN

Pythonの回答の翻訳。私はPythがあまり得意ではないので、これを短くする方法がまだあるかもしれません。

VQ                              for N in range(input()):
  KhN                             K = N+1
     W<hKyN                       while 1+K < 2*N:
           =K-~tN/x%K_2K2)         K = (N--) - (K%-2 xor K) / 2
                          +KN     print K + N

.W4バイトのゴルフに使用できます:VQ+.W<hHyN-~tN/x%Z_2Z2hNN
ジャクベ

それはクールです-それがどのように機能するかを大まかに説明できますか?
リン

1
.W形式は次のとおり.W<condition><apply><start-value>です。hNあなたがしたように、私は開始値を使いましたKhN。がtrueである.W限り、この値を変更し<condition>ます。私はあなたと同じ状態を使いました<hHyN。条件はパラメーターを持つラムダ関数であるHため、現在の値(コード内K)はHです。また<apply>、私はあなたと同じステートメントを使用しましたKZ、この<apply>ステートメントはparameterを持つラムダ関数であるため、に置き換えましたZ。を無視して=K.Wこれを処理します。古い値を計算された値に置き換えます。最後の印刷+...N
ジャクベ

2

APL、56 44バイト

{⍵<⍺+⍺-3:(⍺-1)∇⍺-4÷⍨3+(1+2×⍵)ׯ1*⍵⋄⍺+⍵-1}⍨¨⍳

これは名前のないモナド列で、右側の整数を受け入れて配列を返します。それは私のジュリアの答えとほぼ同じアプローチです。

最も内側の関数は、同じ左引数と右引数としてnを指定すると、Kimberlingシーケンスのn番目の項を返す再帰的な二項関数です。

{⍵<⍺+⍺-3:                                    ⍝ If ⍵ < 2⍺ - 3
         (⍺-1)∇⍺-4÷⍨3+(1+2×⍵)ׯ1*⍵           ⍝ Recurse, incrementing a and setting
                                             ⍝ ⍵ = ⍺ - (3 + (-1)^⍵ * (1 + 2⍵))/4
                                   ⋄⍺+⍵-1}   ⍝ Otherwise return ⍺ + ⍵ - 1

それを手に入れると、シーケンスの個々の用語を取得できます。ただし、この場合、これは2 関数であるという問題になります。つまり、両側の引数が必要です。演算子を入力してください!関数fと入力xを指定するf⍨xと、と同じになりx f xます。そのため、前述の関数をとして参照する場合、f次のモナド列を作成できます。

f⍨¨⍳

f1から入力までの各整数に適用して、配列を生成します。

Dennisのおかげで12バイト節約されました!

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