ものから始める


18

厳密に正の整数nを指定すると、次の手順に従います。

  1. n 1の配列Aを作成します。
  2. Aに要素が1つしかない場合、終了します。そうでない場合は、最初の要素から始めて、Aの各ペアをその合計で置き換え、Aの長さが奇数の場合は最後の要素をそのままにして、この手順を繰り返します。

出力には、各ステップの後に最初のステップから最後の順にAの状態が含まれている必要があります。標準の抜け穴の使用は禁止されています。これは課題であるため、各言語のバイト数が最も少ないソリューションが優先されます。

テストケース

これらの例の出力の各行は状態です。適切な形式で出力できます。

入力: 1

[1]

入力: 4

[1, 1, 1, 1]
[2, 2]
[4]

入力: 13

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 2, 2, 2, 2, 2, 1]
[4, 4, 4, 1]
[8, 5]
[13]

入力: 15

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 2, 2, 2, 2, 2, 2, 1]
[4, 4, 4, 3]
[8, 7]
[15]

この質問のアイデアを逆順にコピーできますか?番号nが与えられ、ステップワイズAを出力し、n 1秒に達するまで続きますか?
pixma140

9
@ pixma140それは、出力がその後逆になるだけで、本質的に同じ課題になります。変更は簡単です。
エリック・ザ・アウトゴルファー

回答:



4

MATL、10バイト

:g`t2estnq

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

使い方

:     % Input n (implicit). Range [1 2 ... n]
g     % Convert to logical. Gives [1 1 ... 1]
`     % Do...while
  t   %   Duplicate
  2   %   Push 2
  e   %   Reshape as 2-column matrix, in column-major order, padding with 0 if needed
  s   %   Sum of each column
  t   %   Duplicate
  n   %   Number of elements
  q   %   Subtract 1. This will be used as loop condition
      % End (implicit). If top of the stack is not zero run new iteration
      % Display stack, bottom to top (implicit)

4

Python 3、57バイト

def f(i,j=1):print(i//j*[j]+[i%j][:i%j]);i>j and f(i,j*2)

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

Python 2、51バイト

def f(i,j=1):print i/j*[j]+[i%j][:i%j];i>j>f(i,j*2)

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

tshのおかげで合計-6バイト

再帰関数。各ステップで2、合計が指定された整数以下になるように、の累乗のリストを作成します。次に、それがより大きい場合、残りを追加し0ます。


1
Python 3 61バイト:def f(i,j=1):l=i//j*[j]+[i%j][:i%j];print(l);i>j and f(i,j*2); Python 2 55バイト:def f(i,j=1):l=i/j*[j]+[i%j][:i%j];print l;i>j>f(i,j*2)
tsh

@tshもちろん、ありがとう!i>j以前のソリューションでは機能しなかったため、後で試すのを忘れていました。
Jitse


3

R、65バイト

ジュゼッペのおかげで-1バイト。

n=scan();while(T<2*n){cat(rep(+T,n%/%T),if(n%%T)n%%T,"\n");T=2*T}

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

%/%%%k=2^in%/%kkn%%k2n1

ここで私は使用していますT代わりにk、次のように初期化されているので、TRUE私はまだ印刷する必要が1に変換される+Tの代わりTのベクトル避けるために、TRUE出力で秒。


約5分と60バイト近くで私を打ち負かします...しかし、ジュゼッペは正しいです、それは最終ステップを出力しません。
Sumner18

@ Sumner18今修正する必要があります。
ロビンライダー

+Tより短いT+0
ジュゼッペ

@ジュゼッペありがとう、私は何かを忘れていたことを知っていた。
ロビンライダー

3

Pyth、10バイト

.u+McN2m1

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

.u          # Apply until a result is repeated, return all intermediate steps: lambda N,Y:
  +M        # map by + (reduce list on +):
    cN2     # chop N (current value) into chunks of 2, last one is shorter if needed
       m1Q  # map(1, range(Q)) (implicit Q = input)

FryAmTheEggmanのおかげで-1バイト







2

JavaScript、55バイト

f=(n,t=1,r=n)=>r>t?t+[,f(n,t,r-t)]:n>t?r+`
`+f(n,t+t):r

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

これは基本的に次のコードのゴルフ版です。

function f(n) {
  var output = '';
  t = 1;
  for (t = 1; ; t *= 2) {
    for (r = n; r > t; r -= t) {
      output += t + ',';
    }
    output += r;
    if (n <= t) break;
    output += '\n';
  }
  return output;
}


2

Brachylog、17バイト

;1j₍ẹẉ₂{ġ₂+ᵐ}ⁱ.ẉȮ

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

恐ろしく長いこれがあると、私はまだ使用するための巧妙なビットを感じるよう.ẉȮ:何かを印刷する明白な方法を、その長さが1であるかどうかを確認することになりẉ₂l1ẉ₂~gあるいはẉ₂≡Ȯ、どこために最後の1では必要であるẉ₂を統一その入力と出力出力するȮ、長さ1のリストになるように事前に制限されているため、入力が長さ1のリストでない場合、統合は失敗します。ẉ₂ただし、述部の最後では、この機能を回避できます。添え字の代わりに出力変数を使用します.ẉȮ最初に入力を出力変数と統合し、次に出力変数を出力しますȮ。その後でのみ、出力変数を統合します。


2

スタックス、10 バイト

Çë⌐ⁿ┤5π»Å╡

実行してデバッグする

手順:

  1. 0ベースの範囲を生成します。
  2. すべてのアイテムがゼロになるまで、各要素を繰り返し半分にします。
  3. 一意の配列ごとにランレングスを計算します。

注釈付きソース:

r       main:[0 .. 5] 
{{hmgu  main:[[0 .. 5], [0, 0, 1, 1, 2, 2], [0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0]] 
m:GJ    main:"1 1 1 1 1 1" 

1

、19バイト

NθIE↨⊖⊗θ²E⪪Eθ¹X²κLλ

オンラインでお試しください!リンクは、コードの詳細バージョンです。Charcoalのデフォルトの出力形式を使用します。これは行ごとに1つの数字であり、サブアレイは互いにダブルスペースで区切られています。説明:

Nθ                  Input `n` into a variable
       θ            `n`
      ⊗             Doubled
     ⊖              Decremented
    ↨   ²           Converted to base 2 (i.e. ceil(log2(input)))
   E                Map
           Eθ¹      List of `1`s of length `n`
          ⪪         Split into sublists of length
               ²    Literal `2`
              X     To power
                κ   Loop index
         E          Map over each sublist
                 Lλ Take the length
  I                 Cast to string for implicit print


1

Perl 6、38バイト

{1 xx$_,*.rotor(2,:partial)>>.sum...1}

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

私が今覚えていない部分的な回転へのいくつかのショートカットがあります...

説明:

{                                    }  # Anonymous code block
                                 ...    # Return a sequence
 1 xx$_,            # Starting with a list of 1s with input length
        *           # Where each element is
         .rotor(2,:partial)        # The previous list split into chunks of 2 or less
                           >>.sum  # And each chunk summed
                                    1  # Until the list is length 1



0

ガイア、12バイト

ċ)¦⟨:q2/Σ¦⟩ª

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

ċ)¦		| generate array of n 1's (really, generate array of n 0's and increment each)
   ⟨      ⟩ª	| do the following until you get to a fixed point:
    :q		| dup and print with a newline
      2/	| split into groups of 2, with last group possibly being smaller
	Σ¦	| take the sum
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.