方形金字塔数


28

A000330-OEIS

任务

你的任务很简单,生成一个序列,鉴于指数i,在该位置的值是平方之和从0高达i哪里i >= 0

例:

Input: 0
Output: 0           (0^2)

Input: 4
Output: 30          (0^2 + 1^2 + 2^2 + 3^2 + 4^2)

Input: 5
Output: 55          (0^2 + 1^2 + 2^2 + 3^2 + 4^2 + 5^2)

规格:

  • 您可能不输入任何内容并无限期地输出序列;
  • 您可以输入N并输出Nth序列的元素;
  • 您可以输入N并输出N序列的前几个元素。

2
OEIS的有趣观察:该序列恰好包含两个完美的正方形:f(1) == 1 * 1 (1)f(24) == 70 * 70 (4900)
DJMcMayhem

我们可以从以下位置开始序列f(1) = 1吗?
Emigna '17

@Emigna很抱歉,但没有,您需要从开始f(0) = 0。我已经指出,对于未能满足该要求的一些答案
Felipe Nardi Batista

f(0) = 0要求毁了我的一些解决方案:(
ATaco

Answers:



22

Python 2,22个字节

lambda n:n*~n*~(n*2)/6

在线尝试!

这使用了封闭形式的公式n *(n + 1)*(2 * n + 1)/ 6。该代码执行以下操作:

  • n乘以(n*):

    • 的按位求补Ñ~n),其本质上意味着-1-正
    • 并且由2n*~(n*2))的按位补码表示-1-2n
  • 除以6/6)。

Python 2,27个字节

f=lambda n:n and f(n-1)+n*n

在线尝试!

Rod节省了1个字节,GB节省了1个字节。


1
这非常聪明!
斯凯勒


14

JavaScript(ES6),16个字节

n=>n*(n+++n)*n/6

演示版

怎么样?

该表达式n+++n被解析为n++ + n(1)。并不是真的很重要,因为n + ++n在这种情况下也可以使用。

因此:

n*(n+++n)*n/6 =
n * (n + (n + 1)) * (n + 1) / 6 =
n * (2 * n + 1) * (n + 1) / 6

计算结果为总和(K = 0,...,N)(K²)


(1)这可以通过执行操作来验证,n='2';console.log(n+++n)该操作给出整数5,而n + ++n给出字符串'23'




6

Brain-Flak,34个字节

({(({}[()])()){({}[()])({})}{}}{})

在线尝试!

它是如何工作的?

最初,我的想法与Riley 1相同,但使用调零器感觉不对。然后我意识到

{({}[()])({})}{}

计算n 2 -n。

为什么?好吧,我们知道

{({})({}[()])}{}

计算n 2并循环n次。这意味着,如果我们切换两次推送的顺序,则从每次将总和增加n +(n-1)变为每次将总和增加(n-1)+(n-1)。这将使每个循环的结果减少一,从而使我们的结果为n 2 -n。在最上层,此-n会被我们归零的推送生成的n抵消,从而减轻了对调零器的需求,并节省了两个字节。

Brain-Flak,36个字节

({({})(({}[()])){({})({}[()])}{}}{})

在线尝试!

这是另一种解决方案,虽然它不像高尔夫运动,但很奇怪,所以我认为我将把它作为挑战,弄清楚它是如何工作的。

如果您不喜欢Brain-Flak,但仍然想在这里挑战,那就是总结。

图片


1:在查看答案之前,我想出了解决方案。所以这里没有窃。


我知道必须有一种方法可以做到这一点,而且我感觉到您将是为此而生的数学家。
莱利







2

实际上,3个字节

R;*

在线尝试!

需要 N作为输入,并输出所述N第i个元素的序列中

说明:

R;*
R    range(1, N+1) ([1, 2, ..., N])
 ;*  dot product with self


2

R,17个字节

sum((0:scan())^2)

非常简单,它利用^(幂)在R中向量化这一事实。


1
(x=0:scan())%*%x短了一个字节,但我相信您需要a cat才能获得输出。
朱塞佩

@Giuseppe我已经尝试过了,您的代码也可以不工作cat,它输出一个1x1矩阵。
瑞·巴拉达斯

@RuiBarradas当前的元共识是,cat要使它有资格成为完整程序,这是必需的。如果您想更改此设置,请回答此问题,并在网站上的其他R个人中吸引一些人。
朱塞佩

2

CJam,9个字节

ri),_.*:+

在线尝试!

说明

ri        e# Read input and convert to integer N.
  ),      e# Get range [0 1 2 ... N].
    _     e# Duplicate.
     .*   e# Pairwise products, giving [0 1 4 ... N^2].
       :+ e# Sum.

或者:

ri),2f#:+

这通过映射2#而不是使用成对乘积来平方每个元素。只是为了好玩,另一种替代方法由于使用浮点算法而使大输入变得不准确:

ri),:mh2#


2

迷宫,11字节

:!\
+ :
*:#

在线尝试!

无限期打印序列。

说明

指令指针只是不断地在代码的平方上运行:

:!\    Duplicate the last result (initially zero), print it and a linefeed.
:      Duplicate the result again, which increases the stack depth.
#      Push the stack depth (used as a counter variable).
:*     Square it.
+      Add it to the running total.

2

Cubix,15个字节

Iu):^\+*p*6u@O,

在线尝试!

我的代码有点难过 ):

计算 n*(n+1)*(2n+1)/6

    I u
    ) :
^ \ + * p * 6 u
@ O , . . . . .
    . .
    . .

^Iu : read in input, u-turn
    : stack  n
:)\ : dup, increment, go right..oh, hey, it cheered up!
    : stack: n, n+1
+   : sum
    : stack: n, n+1, 2*n+1
*   : multiply
    : stack: n, n+1, 2*n+1, (n+1)*(2*n+1)
p   : move bottom of stack to top
    : stack: n+1, 2*n+1, (n+1)*(2*n+1), n
*   : multiply
6   : push 6
u   : right u-turn
,   : divide
O   : output
@   : terminate





2

六边形,23字节

?'+)=:!@/*"*'6/{=+'+}/{

在线尝试!

说明

展开:

   ? ' + )
  = : ! @ /
 * " * ' 6 /
{ = + ' + } /
 { . . . . .
  . . . . .
   . . . .

这实际上只是一个/用于某些重定向的线性程序。线性代码为:

?'+){=+'+}*"*'6{=:!@

计算n(n + 1)(2n + 1)/ 6。它使用以下内存边缘:

在此处输入图片说明

内存点(MP)从标记为n的边开始,指向北。

?   Read input into edge labelled 'n'.
'   Move MP backwards onto edge labelled 'n+1'.
+   Copy 'n' into 'n+1'.
)   Increment the value (so that it actually stores the value n+1).
{=  Move MP forwards onto edge labelled 'temp' and turn around to face
    edges 'n' and 'n+1'.
+   Add 'n' and 'n+1' into edge 'temp', so that it stores the value 2n+1.
'   Move MP backwards onto edge labelled '2n+1'.
+   Copy the value 2n+1 into this edge.
}   Move MP forwards onto 'temp' again.
*   Multiply 'n' and 'n+1' into edge 'temp', so that it stores the value
    n(n+1).
"   Move MP backwards onto edge labelled 'product'.
*   Multiply 'temp' and '2n+1' into edge 'product', so that it stores the
    value n(n+1)(2n+1).
'   Move MP backwards onto edge labelled '6'.
6   Store an actual 6 there.
{=  Move MP forwards onto edge labelled 'result' and turn around, so that
    the MP faces edges 'product' and '6'.
:   Divide 'product' by '6' into 'result', so that it stores the value
    n(n+1)(2n+1)/6, i.e. the actual result.
!   Print the result.
@   Terminate the program.

从理论上讲,有可能使该程序适合边长3,因为/不需要进行计算,:可以重复使用终止程序,并且某些程序'"=+*{也可以重用,从而带来所需的数量低于19(侧面长度3的最大值)的命令。我怀疑是否有可能手动找到这样的解决方案,如果有的话。


2

> <>15 13 11字节

由于没有树,节省了2个字节

0:n:l1-:*+!

在线尝试!

无限期输出序列。


1
14个字节(12 + 2的-v标志): ::1+:}+**6,n在线试试吧!
不是树

1
或11个字节(永久打印,始于N=1):在线尝试!
不是一棵树

@Notatree:很好的主意l。检查OP是否可以从1开始
。– Emigna

@Notatree:不幸的是我们不允许从1开始,但是它仍然保存2个字节。谢谢!
Emigna

1
(我要指出,我得到了l来自马丁·安德的想法迷宫答案。)
不是树

2

Pyth7 5个字节,感谢Steven H

s^R2h

说明:

s^R2h       Full program - inputs from stdin and outputs to stdout
s           output the sum of
    h       range(input), with
 ^R2         each element squared

我的第一个解决方案

sm*ddUh

在线尝试!

说明:

sm*ddUh    Full program - inputs from stdin and outputs to stdout
s          sum of
 m   Uh    each d in range(input)
  *dd      squared

佩斯(Pyth)没有内置广场吗?
caird coinheringaahing

据我所知...
Dave

不存在没有内置的方形Pyth。另外6个字节
Xcoder先生


每个答案都可以+1字节固定,一旦离开手机,我将进行编辑。
戴夫




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.