超立方体元素


19

编写一个函数或程序,输出一个N维超立方体的每种类型的元素(顶点,边,面等)的数量。

例如,三维立方体具有1个像元(即1个3维立方体),6个面(即6个2维立方体),12个边(即12个2维立方体)和8个顶点(即8个0维)立方体)。

有关Hypercube元素的更多详细信息,请参见此处

您还可以查看以下OEIS序列

输入项

您的代码将采用大于或等于0的整数作为输入(通过STDIN或函数参数或类似的东西),它是超多维数据集的维。

从理论上讲,您的代码必须对大于等于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]

计分

这是,因此最短的答案以字节为单位。

Answers:



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答案。
丹尼斯,

和一个优秀的!您使用这种语言真是一种荣幸:-)
Luis Mendo

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@

我真的应该停止在手机上写果冻了。

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

我认为这是更有趣的解决方案之一。我不知道是否想过binompdf
PhiNotPi '02

4

果酱(17 14字节)

ri_3@#_2+@#\b`

在线演示

这种方法使用普通的生成函数 (x + 2)^n。OEIS提到了(2x + 1)^n,但是这个问题以相反的顺序索引系数。我踢自己,直到我看到Alephalpha对PARI / GP答案的更新也没有做过,才想扭转gf。

这个答案中一个有趣的技巧是通过以高于任何可能系数的基数进行运算,将整数幂用于多项式幂运算。通常,给定一个p(x)系数都是小于的所有非负整数的多项式bp(b)b该系数的基本表示形式(因为各个单项式不重叠)。显然,(x + 2)^n它们的系数将为正整数且总和为0 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*`

在线演示

两者都通过将前一行与偏移量加倍的行相加来工作(与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映射保存一个字节:.<L.cQdhQ
isaacg '16

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]

这是一个lambda函数,它接受一个整数并返回一个整数数组。要调用它,请将其分配给变量。

对于从0到输入n的每个m,我们计算父n维超立方体边界上的(n - m)维超立方体的数量。使用Wikipedia上的公式,只需2 m * select(nm)。m = 0 的情况是指n多维数据集本身,因此无论输入如何,输出都从1开始。边由m = n给出,顶点由m = n -1 给出,依此类推。


1

Ruby,修订版B 57字节

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

以前的版本每次仅扫描阵列的已使用部分。该rev在每次迭代时扫描整个数组。这比较慢,但是节省了字节。通过使用1循环执行2的工作来保存另一个字节。

Ruby,修订版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]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.