シディ多項式係数の絶対和


28

バックグラウンド

次数nのSidi多項式または(n + 1)番目の Sidi多項式は、次のように定義されます。

シディ多項式の定義

シディ多項式にはいくつかの興味深い特性がありますが、係数も同様です。後者はOEISシーケンスA075513を形成します。

仕事

非負の整数を与え、ことをフルプログラムまたは機能を記述し、N、プリントまたは戻り度のシディ多項式の係数の絶対和をN、即ち

意図する出力の定義

これらの合計は、OEISシーケンスA074932を形成します。

1ベースのインデックス付けを希望する場合は、代わりに正の整数nを取り、n 番目の Sidi多項式の係数の絶対和を計算できます。

これはであるため、コードをできるだけ短くする必要があります。すべての標準ルールが適用されます。

テストケース(0ベース)

 n           Σ

 0           1
 1           3
 2          18
 3         170
 4        2200
 5       36232
 6      725200
 7    17095248
 8   463936896
 9 14246942336

テストケース(1ベース)

 n           Σ

 1           1
 2           3
 3          18
 4         170
 5        2200
 6       36232
 7      725200
 8    17095248
 9   463936896
10 14246942336

回答:



46

Python 2、43バイト

f=lambda n,k=1:k/n or n*f(n,k+1)+k*f(n-1,k)

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

別のアプローチ

このチャレンジを投稿して以来、この問題の再帰的な解決策を考え出そうとしました。私はペンと紙だけを使って失敗しましたが、ゴルフを実際の問題に変えることに成功しました。

次のように機能するk + mの候補を持つゲームショーを想像してください。

ラウンド1では、すべての候補者が特定のタスクをできるだけ早く達成する必要があります。k個のタスク最速を達成する候補者が勝つ1のk $(1 kilodollar)ラウンド3にそれぞれ、事前に。

ラウンド2では、残りのm人の候補者がもう1つのkに参加する2回目のチャンスを得ます。各候補者に質問があります。質問に正しく答えると、1 k $を獲得してラウンド3に進みます。ただし、質問に答えられなかった場合、ゲームから除外されます。3ラウンドのこの手段は間がありますKK +メートル彼らの質問に答えることができますどのように多くに応じて、候補者。

ラウンド3は、ラウンド1と同様のm個のコンテストで構成されます。各コンテストで、参加者は特定のタスクを達成する必要があります。ラウンド1とは異なり、賞を受け取る候補者は1人だけですが、すべての候補者は次のコンテストに参加できます。各コンテストは、その前のコンテストの2倍の金額を支払います。最初のものは2 k $を支払い、最後のものは2 m k $を支払います。

賞品はすべて2の累乗であるため、候補者が獲得した賞金の金額を知ることは、候補者がラウンド3に進出したかどうか、およびラウンド3のコンテストで勝ったことがわかることを意味します。

ゲームショーを見ているときに、ラウンド1がすでに終わっていると仮定すると、どのk候補者がすでにラウンド3に到達し、どのm候補者がまだラウンド2でスタックしているのかがわかります。

2番目のラウンドのm候補のうちどれがラウンド3に進んでいるかがわかれば、この特定のシナリオで起こりうる結果を簡単に計算できます。j人の候補者が進んだ場合、ラウンド3 にはk + jの合計候補者がいるため、各コンテストでk + jの可能な結果があります。M 3ラウンドの個々のコンテスト、このことができる(K + J)Mアウトカム全てに対してm個のコンテスト。

さて、jは間の任意の値を取ることができます0およびメートル、これに応じて、候補者がそれぞれの固定値についてラウンド2に正しく答えるJ、あるm個の CのJの異なる組み合わせjは、我々が呼び出した場合、ラウンド3に進出している可能性が候補者は、kラウンド3候補とmラウンド2候補g(m、k)の可能な結果の総数は、次の式を取得します。

gの式

k = 1を修正すると、次の特別なケースが得られます。これは、元の問題を解決するための新しいアプローチを構成します。

シグマとgの関係

再帰的な数式

ここで、第1ラウンド後のコマーシャル中に眠りに落ち、第3ラウンドの最後のコンテストで2 m k $の大賞を獲得したのは誰なのかを知るために目覚めたとします。候補者が合計でどれだけの賞金を獲得したかなど、他の情報はありません。残りの賞金はいくつの方法で分配できますか?

勝者が第2ラウンドのm候補の1人だった場合、すでに第3ラウンドに進んでいるはずです。したがって、ラウンド3 には実質的にk + 1の候補がありますが、ラウンド2にはm-1の候補しかありません。最後のコンテストの勝者がわかっているため、結果が不確実なm-1のコンテストしかないため、g(m -1、k + 1)考えられる結果。

勝者がラウンド2をスキップしたk個の候補の1つである場合、計算は少し複雑になります。前と同じように、残りのラウンドはm-1ラウンドのみですが、ラウンド3にはk候補、ラウンド2にはm候補が残っています。ラウンド2候補の数とラウンド3コンテストの数は異なるため、可能な結果gの単純な呼び出しで計算されます。ただし、最初のラウンド2の候補者が(正誤を問わず)回答した後、ラウンド2の候補者の数はm-1ラウンド3のコンテストに再び一致します。候補が進む場合、k + 1ラウンド3の候補があるため、g(m-1、k + 1)可能な結果; 候補が削除された場合、ラウンド3の候補の数はkのままであり、g(m-1、k)の可能な結果があります。候補は前進するかしないかのいずれかなので、これらの2つのケースを組み合わせた結果はg(m-1、k + 1)+ g(m-1、k)になります。

ここで、大賞を獲得できたすべてのk + m候補の潜在的な結果を追加する場合、結果はg(m、k)と一致する必要があります。あるM 2競技ラウンドとリード- G(1、K + 1 m)の電位成果それぞれ、及びkは 3ラウンド競技をするリードそのG(M - 1、K + 1)+ G(M - 1、k)はもの。まとめると、次のアイデンティティが得られます。

gの再帰式

ベースケースと一緒に

gのベースケース

これら2つの式は、関数gを完全に特徴付けます。

ゴルフの実装

ながら

g=lambda m,k=1:0**m or(m+k)*g(m-1,k+1)+k*g(m-1,k)

(49バイト、0**m収率1mはに低下0)あるいは

g=lambda m,k=1:m<1 or(m+k)*g(m-1,k+1)+k*g(m-1,k)

(48バイト、1の代わりにTrueを返します)は有効なソリューションになりますが、保存するバイトがまだあります。

最初の引数としてラウンド2候補の数mの代わりにラウンド1候補の数nを取る関数fを定義すると、

gに関するfの定義

再帰式を取得します

fの再帰式

ベースケース付き

fのベースケース

最後に、

シグマとfの関係

Pythonの実装

f=lambda n,k=1:k/n or n*f(n,k+1)+k*f(n-1,k)

n = kで1を1k/n生成)は、1から始まるインデックス付けで手元のタスクを解決します。




3

MATL、12バイト

t:XnG:QG^*sQ

入力は0ベースです。

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

説明

5例として入力を検討してください。

t      % Take n implicitly. Duplicate
       % STACK: 5, 5
:      % Range [1 2 ...n]
       % STACK: 5, [1 2 3 4 5]
Xn     % N-choose-k, vectorized
       % STACK: [5 10 10 5 1]
G:Q    % Push [2 3 ... n+1]
       % STACK: [5 10 10 5 1], [2 3 4 5 6]
G^     % Raise to n
       % STACK: [5 10 10 5 1], [32 243 1024 3125 7776]
*      % Multiply, element-wise
       % STACK: [160 2430 10240 15625 7776]
s      % Sum of array
       % STACK: 36231
Q      % Add 1. Display implicitly
       % STACK: 36232

2

R、36バイト

sum(choose(n<-scan(),0:n)*(0:n+1)^n)

Rのベクトル化は、式を適用するときにここで役立ちます。


2

J、19バイト

+/@((!{:)*>:^{:)@i.

1ベースのインデックスを使用します。

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

説明

+/@((!{:)*>:^{:)@i.  Input: integer n
                 i.  Range [0, 1, ..., n-1]
   (           )@    Operate on that range
             {:        Get the last value, n-1
          >:           Increment, range becomes [1, 2, ..., n]
            ^          Exponentiate. [1^(n-1), 2^(n-1), ..., n^(n-1)]
    ( {:)              Get the last value, n-1
     !                 Binomial coefficient. [C(n-1, 0), C(n-1, 1), ..., C(n-1, n-1)]
         *             Multiply
+/@                  Reduce by addition



0

公理、39バイト

f(n)==sum(binomial(n,i)*(i+1)^n,i=0..n)

テストコードと結果

(35) -> [[i,f(i)] for i in 0..9]
   (35)
   [[0,1], [1,3], [2,18], [3,170], [4,2200], [5,36232], [6,725200],
    [7,17095248], [8,463936896], [9,14246942336]]

0

ゼリー、9バイト

cR×R‘*ƊS‘

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

使い方

cR×R‘*ƊS‘ - Main link. Argument: n (integer)        e.g.   5
 R        - Range from 1 to n                              [1, 2, 3, 4, 5]
c         - Binomial coefficient                           [5, 10, 10, 5, 1]
      Ɗ   - Last three links as a monad:
   R      -   Link 1: Range from 1 to n                    [1, 2, 3, 4, 5]
    ‘     -   Link 2: Increment                            [2, 3, 4, 5, 6]
     *    -   Link 3: To the power of n                    [32, 243, 1024, 3125, 7776]
  ×       - Multiply, pairwise                             [160, 2430, 10240, 15625, 7776]
       S  - Sum                                            36231
        ‘ - Increment                                      36232
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.