菱形序列


11

想象一下枚举增长的菱形元素[1],[1,3,1],[1,3,5,3,1],…(只有奇数才能使它们很好地对齐)。看起来如下所示,请注意,您始终使用以下方法开始枚举1

                   01
       1        02 03 04
 1   2 3 4   05 06 07 08 09          …
       5        10 11 12
                   13
(1) (1,3,1)    (1,3,5,3,1)    (1,3,5,7,5,3,1)   …

现在,如果您开始对列([1],[2],[1,3,5],[4],[5],[2,6,10],…)求和,您将得到菱形序列。这些是所述序列的前100个元素:

1,2,9,4,5,18,35,24,9,10,33,60,91,70,45,16,17,54,95,140,189,154,115,72,25,26,81,140,203,270,341,288,231,170,105,36,37,114,195,280,369,462,559,484,405,322,235,144,49,50,153,260,371,486,605,728,855,754,649,540,427,310,189,64,65,198,335,476,621,770,923,1080,1241,1110,975,836,693,546,395,240,81,82,249,420,595,774,957,1144,1335,1530,1729,1564,1395,1222,1045,864,679,490,297,100

IO

您可以自由选择以下三种输入/输出方法之一(您无需处理无效的输入):

  • 给定整数n,则按该顺序输出第n个元素(0或1索引,您可以选择)
  • 给定整数n输出该序列的前n个元素
  • 不确定地打印/返回序列

测试用例

请参考上面的前100个术语,这是一些较大的示例(1索引):

101 -> 101
443 -> 1329
1000 -> 49000    
1984 -> 164672
2017 -> 34289
2018 -> 30270
3000 -> 153000

Answers:


3

雪人,72位元组

((}1vn2nD#`nPnCdU!*2nM1`nR:#nSNaB#`nS2nMNdE;aM|#NdE2nP+#`nSNdE`|aA#nM*))

这是一个子程序,该程序接受1索引的输入,并通过permavar返回相应的输出+

在线尝试!

((        // begin subroutine
 }        // we'll only need 3 variables - b, e, g
 1vn2nD   // b = 0.5
 #`       // retrieve input and swap, now b = input and e = 0.5
 nP       // power, resulting in b=sqrt(input)
 nC       // ceiling - this gives the index i of the rhombus we want
 dU!*     // keep a copy of i in the permavar ! for later use
 2nM1`nR  // generate the range [1, 2i)
 :        // map the following block over the range...
  #nS     // subtract i, resulting in e.g. [-3 -2 -1 0 1 2 3] for i=4
  NaB     // absolute value - [3 2 1 0 1 2 3]
  #`nS    // subtract from i, giving [1 2 3 4 3 2 1]
  2nMNdE  // double and decrement, [1 3 5 7 5 3 1]
 ;aM      // map
 |        // shove the rhombus columns into g
 #NdE2nP  // b = (i-2)^2
 +#`      // move b into e and replace it with the original input
 nSNdE    // subtract the two and decrement, giving input-(i-2)^2-1
 `|aA     // this is the index into the rhombus columns that we want
 #nM*     // multiply by the original input and return
))

它使用与Xcoder先生的答案基本相同的算法-唯一的区别是,这里我们仅生成所需菱形的列,即第ceil(sqrt(n))个。为了说明为什么这样做,下面是与每个菱形相对应的输入:

rhombus #   inputs
1           1
2           2 3 4
3           5 6 7 8 9
4           10 11 12 13 14 15 16
...

请注意,左列与右列中每个元素的平方根的上限完全对应。要从此处获取基于1的索引,我们只需减去前一个菱形的索引的平方即可。


2

果冻,10 字节

Ḥ€€’ŒBFị@×

在线尝试!

完整的程序/单子链接返回第N个项(1索引)。

我注意到,每个总和都是该列在整个列列表(输入本身)中的索引乘以相应菱形中该列的索引,因此不需要实际生成行。

怎么样?

ŒBFị@×〜完整程序。我将输入称为N。

  €〜对于[1,N]范围内的每个整数X。
〜将[1,X]范围内的每个整数加倍。
   '〜减量(减1)。
    〜B〜反弹(按元素)。每个都Palindromize。
      F〜展平。
       ị@〜在列表中的索引N处获取元素。
         ×〜乘以N。


2

JavaScript(ES7),42 41字节

由于@ovs,节省了1个字节

0索引。派生自A004737的闭式表达式。

n=>((k=n**.5|0)-Math.abs(n+k*~k))*2*++n+n

测试用例


2

Befunge,62 60字节

&:1>:00p:*`|
00:-\*:g00:<>2-\-0v!`\g
*.@v+1<g00:<^*2g00_2*1+

在线尝试!

说明

突出显示执行路径的源代码

*我们首先从stdin中读取一个基于元素的元素编号n,然后保存一个副本。
*然后,通过对整数r进行计数,直到确定我们在哪个菱形中r*r >= n
*列从菱形,右手侧偏移Ç,是r*r - n
*为了使偏移量反映在中心轴周围,我们检查是否为c >= r
*如果是,则反射的c变为r*2 - 2 - c
*一旦我们有了反射的c,列的总和就是(c*2 + 1) * n



1

果冻,8字节

_.ạ²€ṂḤ×

在线尝试!

这个怎么运作

_.ạ²€ṂḤ×  Main link. Argument: n

_.        Subtract 0.5; yield (n - 0.5).
   ²€     Square each; yield [1², 2², ..., n²].
  ạ       Take the absolute differences of (n - 0.5) and each of the squares.
     Ṃ    Take the minimum.
      Ḥ   Unhalve; double the minimum.
       ×  Multiply the result by n.
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.