新订单6:复活节彩蛋


13

简介(可以忽略)

将所有正整数按其常规顺序(1、2、3,...)放置有点无聊,不是吗?因此,这是围绕所有正整数的排列(重新排列)的一系列挑战。这是本系列的第六个挑战(链接到第一第二第三第四第五个挑战)。

这个挑战有一个温和的复活节主题(因为是复活节)。我从这种装饰精美(并且我个人认为比较丑陋)的鹅卵中汲取了灵感。

装饰鹅蛋

它使我想起了Ulam螺旋形,其中所有正整数都放置在逆时针螺旋形中。这种螺旋具有一些与质数有关的有趣特征,但与这一挑战无关。

乌兰螺旋

如果我们采用Ulam螺旋中的数字并按从1开始的顺时针旋转螺旋追踪所有整数,那么就可以应对此挑战对正整数的置换。这样,我们得到:

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

如果您要绘制两个螺旋,则将得到某种无限的(例如蛋壳)螺旋网格请注意此处的“ 新订单”参考)。

该序列存在于OEIS中,编号为A090861。由于这是一个“纯序列”质询,因此任务是针对给定的输出作为输入,其中是A090861a(n)na(n)

任务

给定一个整数输入,以整数格式输出,其中是A090861na(n)a(n)

注意:此处假定基于1的索引;您可以使用基于0的索引,因此,等等。如果您选择使用它,请在答案中提及。a(0)=1;a(1)=6

测试用例

Input | Output
---------------
1     |  1
5     |  3
20    |  10
50    |  72
78    |  76
123   |  155
1234  |  1324
3000  |  2996
9999  |  9903
29890 |  29796

规则

  • 输入和输出是整数。
  • 您的程序至少应支持1到32767之间的输入。
  • 无效的输入(0,浮点数,字符串,负值等)可能会导致意外的输出,错误或(未定义的)行为。
  • 默认的I / O规则适用。
  • 禁止默认漏洞
  • 这是,因此最短的答案以字节为单位

Answers:


12

果冻 16 14 11 10 9  8 字节

-1感谢Lynn(mod-2;逻辑非;添加到自身:Ḃ¬+->与1进行按位或|1

|1×r)ẎQi

接受整数的单子链接n,产生整数a(n)

在线尝试!(效率很低,因为它会进入)n2

一个11字节的版本½‘|1×rƲ€ẎQi在30秒内完成了除最大测试用例之外的所有测试- 在TIO上尝试 -将使用的层限制为。n+12

怎么样?

排列是在长度的倒数切片中采用自然数[1,5,3,11,5,17,7,23,9,29,11,35,13,...]-奇数正整数散布在与等于5模6的正整数正整数,即[1, 2*3-1, 3, 4*3-1, 5, 6*3-1, 7, 8*3-1, 9, ...]

这与串联然后删除重复范围[1..x]的反向范围相同x,这些范围是这些切片长度的累积总和(即每个切片的最大值)- [1,6,9,20,25,42,49,72,81,110,121,156,169,...],即奇数平方的整数,点缀偶数乘以其自身的增量,即[1*1, 2*3, 3*3, 4*5, 5*5, 6*7, 7*7,...]

由于差异都大于1,我们可以通过[x..k]直接建立范围来保存一个字节(逆向),这里k是切片的1索引索引。

由于这种结构,置换是自共轭置换,即我们知道,因此我们实际上可以找到(1-indexed)index ()的值,而不是得到的第一次出现的(1-索引)的索引()。P(n)=vP(v)=nn|1×r)ẎQị@n|1×r)ẎQi

|1×r)ẎQi - Link: integer, n       e.g. 10
    )    - for each k in [1..n]:  vs = [ 1, 2, 3, 4, 5, 6, 7, 8, 9,10]
|1       -   bitwise-OR (k) with 1     [ 1, 3, 3, 5, 5, 7, 7, 9, 9,11]
  ×      -   multiply (by k)           [ 1, 6, 9,20,25,42,49,72,81,110]
   r     -   inclusive range (to k)    [[1],[6..2],[9..3],[20..4],...,[110..10]]
     Ẏ   - tighten                     [1,6,5,4,3,2,9,8,7,6,5,4,3,20,...,4,......,110,...,10]
      Q  - de-duplicate                [1,6,5,4,3,2,9,8,7,20,...,10,......,110,...82]
       i - first index with value (n)  20

2
非常好。您超越了MATL的答案!
agtoever

1
现在绑起来... :-)
路易斯·门多

@LuisMendo我刚刚意识到我可以在这里做一些鬼y的事,并节省一个字节:)
Jonathan Allan

1
@乔纳森·艾伦·奥 值得一提的是:-)
路易斯·门多

1
@Lynn我实际上只是更新到另一个9字节。您的概率为8!
乔纳森·艾伦,

6

JavaScript(ES7), 46 45  41字节

0索引。

n=>((x=n**.5+1&~1)*2-(n<x*x+x)*4+3)*x+1-n

在线尝试!

怎么样?

这基于A090861示例程序中使用的1索引公式。

xn是螺线的层索引,从中心正方形的开始:0

xn=n1+12

在线尝试!

kn底部(包括中心正方形)的设置为,均设置为:62

kn={2if n4xn2+2xn6otherwise

在线尝试!

然后由下式给出:an

an=8xn2+knxn+2n

在线尝试!

可以翻译为:

n=>8*(x=(n-1)**.5+1>>1)*x+(n<=4*x*x+2*x?-2:6)*x+2-n

将其设为0索引可立即节省5个字节:

n=>8*(x=n**.5+1>>1)*x+(n<4*x*x+2*x?-2:6)*x+1-n

该公式可以通过使用以下方式进一步简化:

xn=2×n+12

可以表示为:

x=n**.5+1&~1

导致:

n=>2*(x=n**.5+1&~1)*x+(n<x*x+x?-1:3)*x+1-n

最后:

n=>((x=n**.5+1&~1)*2-(n<x*x+x)*4+3)*x+1-n




3

蟒3.8,104个 74 65 60 57字节

lambda n:(-2,6)[n>4*(x:=(n**.5+1)//2)*x+2*x]*x+2+~n+8*x*x

编辑:感谢Johnathan Allan从74到57字节!

此解决方案使用基于0的索引。


1
节省39避免了进口,去除一些多余的括号,并使用>替代<=x*x取代的x**2......像这样:def f(n):x=((n-1)**.5+1)//2;return 8*x**2+(-2,6)[n>4*x*x+2*x]*x+2-n... TIO
乔纳森·艾伦

太棒了!我将合并修改。在我看到您的评论之前进行了一些更改,并将其减少到74个字节。您的退货浮标有关系吗?我认为不...
Kapocsi '19

整数的浮点数表示应该很好。使用Python 3.8分配保存更多内容...编辑:使其零索引化
乔纳森·艾伦

很酷。随意直接进行任何进一步的编辑!
卡波西(Kapocsi)'19


2

Befunge,67 57字节

该解决方案假定输入值的索引从0开始。

p&v-*8p00:+1g00:<
0:<@.-\+1*g00+*<|`
0g6*\`!8*2+00g4^>$:0

在线尝试!

说明

我们首先计算通过循环找到输入n的“半径” :

radius = 0
while n > 0
  radius += 1
  n -= radius*8

在循环结束时,n的先前值是该半径处螺旋的偏移量:

offset = n + radius*8

然后,我们可以确定是位于螺旋的顶部还是底部,如下所示:

bottom = offset >= radius*6

一旦我们拥有了所有这些细节,就可以使用以下公式计算螺旋值:

value = ((bottom?10:2) + 4*radius)*radius + 1 - offset

半径是我们唯一需要存储为“变量”的值,在Befunge-93中将其限制为最大值127,因此该算法最多可以处理输入65024。


1

Japt,15个字节

Jonathan的Jelly解决方案的端口。1个索引。

gUòȲ+X*v)õÃcÔâ

尝试一下

gUòȲ+X*v)õÃcÔâ     :Implicit input of integer U
g                   :Index into
 Uò                 :  Range [0,U]
   È                :  Map each X
    ²               :    Square X
     +X*            :    Add X multiplied by
        v           :    1 if X is divisible by 2, 0 otherwise
         )          :    Group result
          õ         :    Range [1,result]
           Ã        :  End map
            c       :  Flatten
             Ô      :    After reversing each
              â     :  Deduplicate

我敢打赌,我刚刚告诉Jonathan,这x+(1-x%2)x|1(在Jelly中保存一个字节),这个答案也可以从中受益。
林恩

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.