ハイパーキューブ要素


19

N次元ハイパーキューブの各タイプの要素(頂点、エッジ、面など)の数を出力する関数またはプログラムを作成します。

例として、3次元キューブには1つのセル(つまり1つの3次元キューブ)、6つの面(つまり6つの2次元キューブ)、12のエッジ(つまり12の2次元キューブ)と8つの頂点(つまり8つの0次元キューブキューブ)。

Hypercube要素の詳細については、こちらをご覧ください。

あなたにも見てとることができ、次のOEISシーケンスを

入力

コードは(STDINまたは関数パラメーターなどを介して)入力として、0以上の整数(ハイパーキューブの次元)を受け取ります。

コードは、メモリと時間の問題を無視して、理論的には0以上の入力に対して機能する必要があります(つまり、入力が大きい場合、速度と潜在的なスタックオーバーフローは答えの問題ではありません)。テストケースとして与えられた入力は12を超えません。

出力

「最高次元」要素から始めて、ハイパーキューブのすべての要素のリストを出力します。たとえば、キュ​​ーブ(入力= 3)の場合、リスト[1,6,12,8](1セル、6面、12エッジ、8頂点)を出力します。

出力のリストの形式は、リストのように見える限り比較的自由です。

結果をSTDOUTに出力するか、関数から返すことができます。

テストケース

Input = 0
Output = [1]

Input = 1
Output = [1,2]

Input = 3
Output = [1,6,12,8]

Input = 10
Output = [1, 20, 180, 960, 3360, 8064, 13440, 15360, 11520, 5120, 1024]

Input = 12
Output = [1, 24, 264, 1760, 7920, 25344, 59136, 101376, 126720, 112640, 67584, 24576, 4096]

得点

これはであるため、バイト単位の最短回答が優先されます。

回答:


10

サマウ8 5バイト

Dennisのおかげで3バイト節約できました。

▌2\$ⁿ

16進ダンプ(SamauはCP737エンコードを使用):

dd 32 2f 24 fc

説明:

▌        read a number
 2\      push the array [1 2]
   $     swap
    ⁿ    take the convolution power

2つのベクトルの畳み込みは、2つの多項式の乗算と同等です。同様に、n番目の畳み込みパワーを取得することは、多項式のn番目のパワーを取得することと同等です。


11

J、13バイト

[:p.2&^;$&_.5

@alephalphaのPARI / GP回答に触発されました。J.jsでオンラインで試してください。

バックグラウンド

二項定理により、

式

したがって、入力nの出力は、上記の多項式の係数で正確に構成されます。

コード

[:p.2&^;$&_.5  Monadic verb. Argument: n

        $&_.5  Yield an array of n instances of -0.5.
    2&^        Compute 2^n.
       ;       Link the results to the left and right.
               This specifies a polynomial of n roots (all -0.5)
               with leading term 2^n.  
[:p.           Convert from roots to coefficients.

10

MATL、8バイト

1i:"2:X+

@alephalphaのPARI / GP回答に触発されました。

オンラインでお試しください!Y+現代のMATLの使用)

使い方

1        % Push 1.
 i:      % Push [1 ... input].
   "     % Begin for-each loop:
    2:   %   Push [1 2].
      X+ %   Take the convolution product of the bottom-most stack item and [1 2].

5
私の最初のMATL回答。
デニス

そして素晴らしいものです!この言語を使用したことはとても光栄なことです:-)
ルイスメンドー

1
綺麗な。誰もが今MATLの時流に飛び乗り始めています!
rayryeng-モニカの復活

@rayryengあなたがいなくて寂しいです:
ルイスメンドー

8

MATL、12バイト

Q:q"H@^G@Xn*

オンラインで試す

説明

         % implicit: input number "n"
Q:q      % generate array[0,1,...,n]
"        % for each element "m" from that array
  H@^    % compute 2^m
  G      % push n
  @      % push m
  Xn     % compute n choose m
  *      % multiply
         % implicit: close loop and display stack contents

8

Mathematica、29バイト

CoefficientList[(1+2x)^#,x]&

私の最初のMathematicaの答え!これは、AlephalphaのPARI / GP answerと同じアプローチを使用する純粋な関数です。多項式を構築し、昇べきの順(1+2x)^nにリストされた係数のリストを取得します(つまり、定数が最初)。

使用例:

> F := CoefficientList[(1+2x)^#,x]&`
> F[10]
{1,20,180,960,3360,8064,13440,15360,11520,5120,1024}

6

APL、15 11バイト

1,(2*⍳)×⍳!⊢

これは、右側の整数を受け入れ、整数配列を返す単項関数列です。

説明、入力の呼び出しn

        ⍳!⊢  ⍝ Get n choose m for each m from 1 to n
       ×     ⍝ Multiply elementwise by
  (2*⍳)      ⍝ 2^m for m from 1 to n
1,           ⍝ Tack 1 onto the front to cover the m=0 case

オンラインで試す

デニスのおかげで4バイト節約できました!



5

ゼリー、8バイト

0rð2*×c@

電話でJellyを書くのをやめるべきです。

0r            Helper link. Input is n, inclusive range from 0 to n. Call the result r.
  ð           Start a new, dyadic link. Input is r, n.
   2*         Vectorized 2 to the power of r
     ×c@      Vectorized multiply by n nCr r. @ switches argument order.

ここで試してみてください


4

TI-BASIC、10バイト

3^Ansbinompdf(Ans,2/3

これは、より興味深い解決策の1つだと思います。私が今まで考えたかどうかはわかりませんbinompdf
PhiNotPi

4

CJam(17 14バイト)

ri_3@#_2+@#\b`

オンラインデモ

このアプローチでは、通常の生成関数を使用します(x + 2)^n。OEISはに言及しています(2x + 1)^nが、この質問は係数を逆の順序で索引付けします。同じことを行ったPARI / GP回答に対するAlephalphaの更新を見るまで、GFを逆転させることを考えていないので、私は自分を蹴っている。

この答えの興味深いトリックは、可能な係数よりも高いベースで動作することにより、多項式のべき乗演算に整数のべき乗を使用することです。一般的に、多項式所与p(x)その係数未満の全ての非負整数であるがbp(b)塩基であるb(個々の単項式は、「オーバーラップ」しないため)係数の表現。明らか(x + 2)^nに、正の整数であり、合計する係数がある3^nため、それらはそれぞれ個別に未満になり3^nます。

ri     e# Read an integer n from stdin
_3@#   e# Push 3^n to the stack
_2+    e# Duplicate and add 2, giving a base-3^n representation of x+2
@#     e# Raise to the power of n
\b`    e# Convert into a vector of base-3^n digits and format for output

代替アプローチ:17バイト

1a{0X$2f*+.+}ri*`

オンラインデモ

または

1a{0X$+_]:.+}ri*`

オンラインデモ

どちらも、前の行をオフセットと2倍の行で合計することで機能します(Pascalの三角形の標準的な手動構成と同様のスタイル)。

多項式のべき乗演算にデカルトのべき乗(整数のべき乗ではなく)を使用する「直接」アプローチは、24バイトで行われます。

2,rim*{1b_0a*2@#+}%z1fb`

マップは、非常に複雑で、使用する%よりも短くなりますf

2,rim*1fb_0af*2@f#.+z1fb`

3

ES6、71バイト

n=>[...Array(n+1)].fill(n).map(b=(n,i)=>!i?1:i>n?0:b(--n,i-1)*2+b(n,i))

単純な再帰式。各ハイパーキューブは、前のハイパーキューブ1ユニットをN番目の次元に移動することにより作成されます。これは、M次元オブジェクトがユニットの最初と最後に複製されることを意味しますが、(M-1)次元オブジェクトも余分な次元を獲得し、M次元オブジェクトに変わります。言い換えれば、c(n, m) = c(n - 1, m) * 2 + c(n - 1, m - 1)。(実際の送信では、パラメーターが逆になり、式が目的の順序で出力されます。)

巧妙に、再帰関数に正しい引数を提供するfillことmapができ、6バイト節約できます。


3

Pyth、10 9バイト

.<L.cQdhQ

誰もが使用していると思われるnCrアルゴリズムを使用します。


Lマップは1バイトを保存します:.<L.cQdhQ
isaacg

2

05AB1E、9バイト

コード:

WƒNoZNc*,

説明:

W          # Push input and store in Z
 ƒ         # For N in range(0, input + 1)
  No       # Compute 2**N
    ZNc    # Compute Z nCr N
       *   # Multiply
        ,  # Pop and print

CP-1252エンコードを使用します。


2

ジュリア、31バイト

n->[2^m*binomial(n,m)for m=0:n]

これは、整数を受け入れて整数配列を返すラムダ関数です。呼び出すには、変数に割り当てます。

0から入力nまでの各mについて、親のn次元の超立方体の境界にある(n - m)次元の超立方体の数をカウントします。ウィキペディアの式を使用すると、2 m * choose(nm)になります。m = 0 の場合は、nキューブ自体を参照するため、出力は入力に関係なく1から始まります。エッジはm = nで、頂点はm = n -1などで与えられます。


1

Ruby、Rev B 57バイト

->n{a=[1]+[0]*n
(n*n).downto(n){|i|a[1+j=i%n]+=2*a[j]}
a}

前のリビジョンは、毎回アレイの使用済み部分のみをスキャンしていました。この回転は、反復ごとにアレイ全体をスキャンします。これは遅いですが、バイトを節約します。1ループを使用して2のジョブを実行すると、さらにバイトが節約されます。

Ruby、Rev A 61バイト

->n{a=[1]+[0]*n
n.times{|i|i.downto(0){|j|a[j+1]+=2*a[j]}}
a}

ポイントで始まり、次の次元を繰り返し作成します

各反復で、既存の各要素の次元が増加し、元の次元の2つの新しい要素が生成されます。たとえば、水平面内の正方形が垂直に延長されて立方体になる場合:

1つの面は立方体になり、1組の面(上に1つ、下に1つ)を生成します

4つのエッジは面になり、4組のエッジ(上4つ、下4つ)を生成します

4つの頂点がエッジになり、4組の頂点(上4つ、下4つ)を生成します

テストプログラムでゴルフをしていません

f=->n{a=[1]+[0]*n                  #make an array with the inital point and space for other dimensions
  n.times{|i|                      #iteratively expand dimension by dimension 
    i.downto(0){|j|a[j+1]+=2*a[j]} #iterating downwards (to avoid interferences) add the 2 new elements generated by each existing element.
  }
a}                                 #return the array

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