螺旋排列序列


17

我们可以将自然数汇总为矩形螺旋:

 17--16--15--14--13
  |               |
 18   5---4---3  12
  |   |       |   |
 19   6   1---2  11
  |   |           |
 20   7---8---9--10
  |
 21--22--23--24--25

但是现在我们将它们放置在矩形网格上,我们可以按不同的顺序展开螺旋线,例如顺时针方向向北开始:

 17  16--15--14--13
  |   |           |
 18   5   4---3  12
  |   |   |   |   |
 19   6   1   2  11
  |   |       |   |
 20   7---8---9  10
  |               |
 21--22--23--24--25

结果序列显然是自然数的排列:

1, 4, 3, 2, 9, 8, 7, 6, 5, 16, 15, 14, 13, 12, 11, 10, 25, 24, 23, 22, 21, 20, 19, 18, 17, ...

您的任务是计算此序列。(OEIS A020703,但扰流板警告:它包含另一个有趣的定义和一些您可能想弄清楚自己的公式。)

有趣的事实:所有8个可能的平仓订单都有其自己的OEIS条目。

挑战

给定正整数n,返回n上述序列的th元素。

您可以编写程序或函数,通过STDIN(或最接近的替代方案),命令行参数或函数自变量获取输入,并通过STDOUT(或最接近的替代方案),函数返回值或函数(out)参数输出结果。

适用标准规则。

测试用例

1       1
2       4
3       3
4       2
5       9
6       8
7       7
8       6
9       5
100     82
111     111
633     669
1000    986
5000    4942
9802    10000
10000   9802

有关直到并包括在内的完整列表,n = 11131 请参阅OEIS上的b文件

Answers:


6

果冻,11 10字节

’ƽð²+ḷ‘Ḥ_

我手机上的另一个果冻答案。

’ƽð²+ḷ‘Ḥ_   A monadic hook:
’ƽ          Helper link. Input: n
’             n-1
 ƽ            Atop integer square root. Call this m.
   ð         Start a new dyadic link. Inputs: m, n
    ²+ḷ‘Ḥ_    Main link:
    ²+ḷ       Square m, add it to itself,
       ‘      and add one.
        Ḥ     Double the result
         _    and subtract n.

在这里尝试。


关于Jelly入门的任何提示?我完全无法分辨叉子/钩子。
林恩

首先学习APL或J。实际上,链比火车更容易,因为功能都有固定的联系。
lirtosiast '16

我知道了。是的,我有J经验。我想我将尝试阅读jelly.py并找出支持哪些链。
林恩

2
您怎么在手机上键入该密码!?这比代码本身更令人印象深刻!
DJMcMayhem

8

Japt,20 19 16字节

V=U¬c)²-V *2-U+2

在线测试!

根据观察,

F(N)= ceil(N ^ .5)*(ceil(N ^ .5)-1)-N + 2

或者说

F(N)=大于或等于N的第一个平方减去其平方根再减去N,再加上2。

我不知道此解释是否在OEIS页面上,因为我还没有看过。


5

朱莉娅,28个字节

n->2((m=isqrt(n-1))^2+m+1)-n

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

我们定义是最大的整数,使得2Ñ -1,即整数平方根Ñ -1( isqrt)。然后,我们可以将OEIS表达式2(m + 1)m - n + 2简化为2(m 2 + m + 1)-n

在线尝试


4

CJam,14个字节

qi_(mQ7Ybb2*\-

使用Alex的方法:2*(m^2+m+1)-nwhere m = isqrt(n-1)


2

ES7,31 28 26个字节

n=>(m=--n**.5|0)*++m*2-~-n

我已经独立发现了亚历克斯的公式,但由于当时不在电脑旁,所以无法证明。

编辑:由于@ETHproductions,部分节省了3个字节。保存了另外2个字节。


n=>((m=--n**.5|0)+m*m)*2-n+1我认为可以。
ETHproductions's

@ETHproductions谢谢,我在想自己怎么把它--n放在那里……
Neil

@ETHproductions嘿,我设法从您的答案中删除了2个字节。
尼尔


1

MATL16 13字节

qX^Y[tQ*Q2*G-

基于Lynn的CJam答案

在线尝试!Y[k根据语言更改替换为)

q       % input n. Subtract 1
X^      % square root
Y[      % floor
tQ      % duplicate and add 1
*       % multiply
Q       % add 1
2*      % multiply by 2
G-      % subtract n

这与其他答案(16个字节)使用的方法不同:

6Y3iQG2\+YLt!G=)

它显式生成两个螺旋矩阵(实际上是它们的垂直翻转版本,但这并不影响输出)。第一个是

17    16    15    14    13
18     5     4     3    12
19     6     1     2    11
20     7     8     9    10
21    22    23    24    25

第二个跟踪修改后的路径:

25    10    11    12    13
24     9     2     3    14
23     8     1     4    15
22     7     6     5    16
21    20    19    18    17

要找到n序列的第-个数字,只需n在第二个矩阵中找到并在第一个矩阵中选择相应的数字即可。矩阵必须足够大以便n出现,并且矩阵的大小应为奇数,以使原点(数字1)在两者中的相同位置。

也可以在线尝试!(6Y3已根据语言更改移动)

6Y3      % 'spiral' string
i        % input n
QG2\+    % round up to an odd number large enough
YL       % generate spiral matrix of that size: first matrix
t!       % duplicate and transpose: second matrix
G=       % logical index that locates n in the second matrix
)        % use that index into first matrix

0

Brachylog,20个字节

-1$r$[I*I+I+1=*2-?=.

几乎所有其他答案都使用相同的技术。

说明

-1                   § Build the expression Input - 1
  $r                 § Square root of Input - 1
    $[I              § Unify I with the floor of this square root
       *I+I+1        § Build the expression I * I + I + 1
             =*2-?   § Evaluate the previous expression (say, M) and build the expression
                     § M * 2 - Input
                  =. § Unify the output with the evaluation of M * 2 - Input

关于这个答案的一个中间有趣的事实是,它=比括号更易于使用和缩短。

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.