新订单3:5 8 6


16

简介(可以忽略)

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

在此挑战中,我们将自然数排列在增加长度的行中,以使每一行的总和为质数。我对此感到非常惊奇的是,每个自然数在这种排列方式中都有位置。没有数字被跳过!

这种安排的可视化如下所示:

row             numbers             sum
1                  1                  1
2                2   3                5
3              4   5   8             17
4            6   7   9  15           37
5          10 11  12  13  21         67
6        14  16 17  18  19  23      107
etc.

我们可以从该三角形的行中读取元素。前20个元素是:1,2,3,4,5,8,6,7,9,15,10,11,12,13,21,14,16,17,18,19(是的,有隐藏在此序列中的新歌)。

由于这是“纯序列”质询,因此任务是针对给定的n输出一种ñ作为输入,其中a n A162371ñ一种ñ

任务

给定整数输入ñ,以整数格式输出一种ñ

一种ñ定义为自然数在字典上最早排列的第ñ个元素,这样,当看作行读取的三角形时,对于n> 1,行的总和是质数。由于自然数的第一个字典序排列以1开头,一种1个为1。请注意,根据此定义,一种1个=1个一种1个为素必需的。这是OEIS序列A162371

注意:此处假定基于1的索引;您可以使用基于0的索引,因此一种0=1个;一种1个=2,依此类推。如果选择使用,请在答案中提及。

测试用例

Input | Output
---------------
1     |  1
5     |  5
20    |  19
50    |  50
78    |  87
123   |  123
1234  |  1233
3000  |  3000
9999  |  9999
29890 |  29913

规则

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

我们可以无限地输出序列,还是返回生成器?
乔·金

2
Err,1不是素数
Jo King

1
@JoKing关于a(1)= 1:我将其添加。确实是例外。这在OEIS条目中有明确说明,购买我没有明确提及。我将其添加到问题中。谢谢。
agtoever

@JoKing注意,序列的定义仅要求行的总和在n> 1时为素数。由于序列是自然数的第一个字典排列,因此a(1)的结果为1。因此,实际上1不是质数,但是质询或序列的定义并未说或要求1为质数。 。
agtoever

4
相关序列:A075348
jimmy23013

Answers:



3

Perl 6的80 77个字节

{({$!=@_;+(1...{$_$!&&(|$!,$_).rotor(1..*).one.sum.is-prime-1})}...*)[$_]}

在线尝试!

说明:

{                                  }  # Anonymous code block
 (                        ...*)[$_]   # Index into the infinite sequence
  {                      }   # Where each element is
   $!=@_;  # Save the list of previous elements into $!
   +(1...{             })    # Return the first number that
          $_$!         # Has not appeared in the list so far
          &&            # And
          (|$!,$_)      # The new sequence
          .rotor(1..*)  # Split into rows of increasing length
                        # And ignoring incomplete rows
          .one          # Have exactly one row
          .sum          # Where the sum
          .is-prime-1   # Is not prime (i.e. just the first row)

3

Haskell122120字节

import Data.Numbers.Primes
l%a|(p,q)<-splitAt l a,(s,k:t)<-span(not.isPrime.(+sum p))q=p++k:(l+1)%(s++t)
((1:1%[2..])!!)

在线尝试!(的额外2个字节f=

编辑:现在使用基于0的索引来保存2个字节。感谢@wastl指出这一点,我一定在OP中错过了它。

这非常有趣!辅助函数%需要一个长度l和可以使用的值列表a。它返回该序列的无限值列表。该长度比当前三角形行的长度小一,并且列表是无限的且已预先排序。首先,我们仅从中得出第一个la,然后遍历a的其余部分,直到找到使总和成为素数的第一个(最小)值。我们使用span和一些模式匹配将列表拆分成该值。现在,我们要做的就是产生该新值,并使用下一个行长l+1和中的其余值重复执行a。对于最终结果,我们在前面加上1(n = 0的特殊情况),然后使用对其进行索引!!


1
我认为您可以删除,0:因为挑战状态可以使用基于0的索引。
wastl

2

的JavaScript(ES6), 111个  110字节

n=>{for(g=n=>{for(d=n;n%--d;);},i=l=0;i--||(k=s=0,i=l++),n--;g[k]=s+=r=k)for(;g[++k]|g(!i*++s)|d>1;);return r}

在线尝试!


2

果冻,46个字节

S©‘æR®Ḥ‘¤_®ḟ;F¥Ṃ
FLḤRḟFḣ0ịLƊ;祵W
1;Ç$⁸½Ḥ¤¡Fị@

在线尝试!

在tio上等待大n的时间,但是除了最后两个示例外,都可以在那里工作。


0

的Lua242个 228 226 211字节

s={}u={}i=0 n=0+...while i<n do
n=n-i
x,S=1,0
for j=1,i do
while u[x]do x=x+1 end
s[j]=x
S=S+x
u[x]=0
end
while u[x]or p do
x=x+1
d=S+x
p=F
for c=2,d-1 do
p=p or d%c<1
end
end
i=i+1
s[i]=x
u[x]=0
end
print(s[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.