[N]とM反復の再帰的に連結された累積和


14

2つの正の整数NM取得し[N]M反復での連結累積和を作成します。最後の反復の結果を出力します。

連結累積合計の定義:

  1. 数字Nから始めてシーケンスを定義するX = [N]
  2. 追加Xの累積和X
  3. 手順を2 M回繰り返します。

ベクトルの累積合計X = [x1, x2, x3, x4]は次のとおり[x1, x1+x2, x1+x2+x3, x1+x2+x3+x4]です。

N = 1M = 4

P =累積和関数。

M = 0: [1]
M = 1: [1, 1]                    -  X = [1, P(1)] = [[1], [1]]      
M = 2: [1, 1, 1, 2]              -  X = [X, P(X)] = [[1, 1], [1, 2]]
M = 3: [1, 1, 1, 2, 1, 2, 3, 5]  -  X = [X, P(X)] = [[1, 1, 1, 2], [1, 2, 3, 5]]
M = 4: [1, 1, 1, 2, 1, 2, 3, 5, 1, 2, 3, 5, 6, 8, 11, 16]

最初X = [1]は反復としてカウントされないことに注意してください。M = 5上記の例(したがってX = [1]、1回の反復としてカウント)を選択することもできます。

これはOEIS A107946です


テストケース:

N = 5, M = 1
5, 5

N = 2, M = 3
2, 2, 2, 4, 2, 4, 6, 10

N = 4, M = 6
4, 4, 4, 8, 4, 8, 12, 20, 4, 8, 12, 20, 24, 32, 44, 64, 4, 8, 12, 20, 24, 32, 44, 64, 68, 76, 88, 108, 132, 164, 208, 272, 4, 8, 12, 20, 24, 32, 44, 64, 68, 76, 88, 108, 132, 164, 208, 272, 276, 284, 296, 316, 340, 372, 416, 480, 548, 624, 712, 820, 952, 1116, 1324, 1596

これはなので、最短のコードが優先されます。オプションの入力および出力形式。


今は少し遅すぎますが、N本当に問題に何かを追加しますか?結果に掛ける定数要素にすぎません。
マーティンエンダー

回答:


7

Haskell、35バイト

n!m=iterate((++)<*>scanl1(+))[n]!!m

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

-18バイトのH.PWizに感謝


tail.scanl(+)0可能性がありますscanl1(+)
H.PWiz

@ H.PWizありがとう、私はいつもとの*1バージョンを忘れています。scanfold
Mego


1
35バイトを使用iterate
-H.PWiz

私は説明を省略するつもりです-毎回それを変更するにはあまりにも多くの努力:P
Mego


6

9 8 7バイト

1バイトを節約してくれたH.PWizに感謝します。

!¡S+G+;

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

1ベースのを使用しMます。

説明

      ;     Wrap N in a list to get [N].
 ¡          Iterate the following function on this list and collect
            the results in an infinite list.
  S+        Concatenate the current value with...
    G+      ...the cumulative sum. We're not using the cumsum built-in ∫ 
            because it prepends a zero.
!           Use M as an index into the infinite list.

私のアプローチでもありましたが、ゴルフができるかどうかはわかりません。また、先頭(この場合は2バイトを節約するもの)を返さないことを既に提案しました。cumsum0
エリックアウトゴルファー

することot∫ができますG+か?
H.PWiz

@ H.PWizうーん...ドキュメントはそれについて不明確なようです(「スキャン」とは「累積」ではなく「削減」を意味します)。
エリックアウトゴルファー

F減るGは累積減る
-H.PWiz

5

MATL、6バイト

:"tYsh

入力はM、その後、N

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

説明

:"      % Implicitly input M. Do the following M times
  t     %   Implicitly input N the first time. Duplicate
  Ys    %   Cumulative sum
  h     %   Concatenate horizontally
        % Implicitly end loop. Implicitly display stack

3
うわぁ?私はそれを100回試したと確信しています。私も...確かそれは私がすべてでこれを理解していない... TIO上のいくつかの奇妙なエラーではありませんでし作るためにSueverのサイトにオーバー行くしようとした
Stewieグリフィン

2
私はこれについて考えることを止めることができません...私は、それらの正確なキャラクターを何度も何度も書いて、成功せずに2つの異なるサイトでそれを実行しようとしたことを絶対に確信しています。それは事実ではないので、残っている唯一の説明は、私が夢中になるということです...これは本当に私の頭を台無しにします!
スティービーグリフィン


3

パイソン283の 78 75 71 65 63 60バイト

def f(n,m):r=n,;exec"s=0\nfor c in r:s+=c;r+=s,\n"*m;print r

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

保存された6 8は、ロッドのおかげバイト
エリックのおかげバイト保存3


@Rodありがとう
。D– TFeld

あなたは必要ありません[:]rですtuple
エリックアウトゴルファー

@EriktheOutgolfer、ありがとう、それはrがリストだったときの残り物です
です-TFeld

3

Dyalog APL、12バイト

{(⊢,+\)⍣⍺⊢⍵}

右側のNと左側のMを取ります。 TryAPLはこちら!

説明:

{(⊢,+\)⍣⍺⊢⍵}
{          } an anonymous function
 (⊢,+\)      a train for a single iteration:
             the right argument
   ,          concatenated with
    +\        the cumulative sum 
            repeated
             left argument times
         ⊢⍵  on the right argument

説明が大好きです。何が起こっているか非常に明確です。それ以外の場合はAPLを理解するのは難しい:P
エミグナ





0

JavaScript(ES6)、55 54バイト

カリー化構文の入力を受け取ります(m)(n)

m=>g=a=>m--?g([...a=+a?[a]:a,...a.map(x=>s+=x,s=0)]):a

テストケース


0

ゼリー、5バイト

;+\$¡

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

Dennisによる推奨バージョン(シングルトン配列のn代わりに戻り[n]ます)。


Wおよび削除することができます。
デニス

@Dennisそのとき出力が正しくないのではないかと心配です。私はそれを考えたが、私は入力を取得する場合1と、0私は戻ってすることがあります怖い1の代わりに、[1]私はそれらを削除した場合、その出力は、まだそのようになるので、私は、代わりに完全なプログラムを使用することはできません。
エリックアウトゴルファー

1Jellyが配列を表示する方法[1]です。問題ありません。
デニス

@Dennis Hmm ...それについて少し疑っています(上記の私のコメントの最後の部分で言ったように)...それを可能にするコンセンサスはありますか?
エリックアウトゴルファー

どちらの形式でも構いません。
CG。

0

Clojure、67バイト

#(loop[c[%]i %2](if(= i 0)c(recur(into c(reductions + c))(dec i))))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.