计算最小值


12

背景

请考虑以下顺序(OEIS中为A051935):

  • 从术语开始。2
  • 找出大于的最低整数,使为质数。2 2 + nn22+n
  • 找到大于的最低整数,使为质数,以此类推。 Ñ 2 + Ñ + Ñ 'nn2+n+n

一个更正式的定义:

an={2if n=0min{xNx>an1 and (x+i=0n1ai) is prime}otherwise

序列的前几个术语是(请将其称为测试用例):

2, 3, 6, 8, 10, 12, 18, 20, 22, 26, 30, 34, 36, 42, 44, 46, 50, 52, 60, 66, 72, 74, ...

任务

您的任务是通过以下任何一种方式生成此序列:

  • 无限期输出其条件。
  • 给定n,输出annth项,索引为01)。
  • 给定n,输出{a1,a2,,an}(前n项)。

您可以使用任何编程语言进行竞争,并且可以通过任何标准方法接受输入并提供输出,同时请注意,默认情况下,这些漏洞是禁止的。这是,因此每种语言的最短提交(以字节为单位)将获胜。


4
编写挑战时应避免的提示:质数。您可以使用除素数以外的其他方法。
Okx

3
@Okx这次选择素数时,我想到了两个原因:1)有一些针对此序列的聪明算法,例如Dennis实现的算法 2)已经有一个OEIS条目
Mr. Xcoder

Answers:


4

Brachylog,13个字节

~l.<₁a₀ᵇ+ᵐṗᵐ∧

在线尝试!

输出是序列的前n个项的列表。

?~l.<₁a₀ᵇ+ᵐṗᵐ∧    Full code (? at beginning is implicit)

?~l.              Output is a list whose length is the input
    <₁            Output is an increasing list
      a₀ᵇ+ᵐ       And the cumulative sum of the output
           ṗᵐ     Consists only of prime numbers
             ∧    No further constraints on output

Explanation for a₀ᵇ+ᵐ:
a₀ᵇ               Get the list of all prefixes of the list
                  Is returned in increasing order of length
                  For eg. [2, 3, 6, 8] -> [[2], [2, 3], [2, 3, 6], [2, 3, 6, 8]]
   +ᵐ             Sum each inner list  -> [2, 5, 11, 19]


4

果冻11 9字节

0Ḥ_ÆnɗСI

这是一个完整的程序,将n作为参数并显示序列的前n个项。

在线尝试!

怎么运行的

0Ḥ_ÆnɗСI  Main link. Argument: n

0          Set the return value to 0.
      С   Accumulating iterate. When acting on a dyadic link d and called with
           arguments x and y, the resulting quicklink executes
           "x, y = d(x, y), x" n times, returning all intermediate values of x.
           Initially, x = 0 and  y = n.
     ɗ       Drei; combine the three links to the left into a dyadic chain.
 Ḥ             Unhalve; double the left argument.
  _            Subtract the right argument.
   Æn          Compute the next prime.
           This computes the partial sums of the sequence a, starting with 0.
        I  Increments; compute the forward differences.

3

05AB1E v2,10字节

2λλOD₁+ÅNα

在线尝试!

这仅适用于非旧版版本,即Elixir重写。输出无限的整数流。Prime测试中的一些错误已在最新的提交中修复,但尚未在TIO上发布。但是,它确实在本地工作。是它在我的机器上执行的GIF,已修改为输出前几项而不是整个流。

怎么运行的

定义基本情况为的递归无限序列。该结构是05AB1E非常酷的新功能之一。简而言之,它需要一个函数,将设置给定的整数参数,在这种情况下为。a n a 0 22λa(n)a(0)2

λO

在这部分代码中,λ的角色不同。它已经在递归环境中,而是生成所有先前结果的列表。然后,总结一下。[a(0),a(1),,a(n1)]O

D₁+

复制总和以供以后使用,并将到第二个副本中。a(n1)

ÅN

生成最低的素数,其大于上述总和。

α

最后,获取上面计算出的素数与先前计算出的总和(所有先前迭代的总和)的第一个副本之间的绝对差。

然后,将流无限期地隐式打印到STDOUT。


2

Perl 6,45个字节

2,{first (*+@_.sum).is-prime,@_[*-1]^..*}...*

在线尝试!

返回一个懒惰列表,该列表生成没有结束的序列。

说明:

这使用了Sequence运算符...,该运算符将序列定义为:

2,  # The first element is 2
  {  # The next element is:
    first  # The first value that:
          (*+@_.sum).is-prime,  # When added to the sum is a prime
          @_[*-1]^..*  # And is larger than the previous element
  }
...*  # And continue the sequence indefinitely


2

JavaScript(ES6),63个字节

返回 1个索引的项。nth

n=>(k=0,s=1,g=d=>s%d?g(d-1):d<2?--n?g(s-=k-(k=s)):s-k:g(s++))()

在线尝试!


2

Pyth12 11字节

.f&P-;Z=-;Z

在线尝试!

感谢isaacg,节省了1个字节。

n使用基于1的索引生成第一个此类数字。

.f查找k从零开始满足特定条件的前整数。在这里,判据是我们计算的先前素数;加上当前数Z为素数(P)。如果是,我们还使用逻辑和函数(&)的短路行为更新最后计算的素数。不幸.f的是,默认变量是Z在更新中花费一个字节。

isaacg找出的诀窍是存储最后一个素数的取反,然后在减去当前值的基础上进行测试。在Pyth中,这很短,因为素数检查超载:在正数上查找素数分解,在负数上确定素数的正值是否为素数。

这或多或少转化为:

to_find = input()
last_prime = 0
current = 0
results = []
while to_find > 0:
    if is_prime( current + last_prime ):
        results.append( current )
        to_find -= 1
        last_prime += current
    current += 1
print results

更换_+-+-为-1字节。
isaacg

@isaacg真是太聪明了!我将对其进行编辑
。– FryAmTheEggman

2

MATL,21字节

O2hGq:"t0)yd0)+_Yqh]d

在线尝试!

输出是序列的前n个项。

说明:

构造一个素数列表(以0开头),最后找到返回值,返回列表中连续素数之间的差。

              % Implicit input, say n
O2h           % Push P = [0, 2] on the stack 
Gq:"          % for loop: 1 to n-1
  t0)           % Take the last element of P
                %  Stack: [[0, 2], [2]] (in first iteration)
  yd0)          % Take the difference between the last
                %   two elements of P
                %  Stack: [[0, 2], [2], [2]]
  +             % Add those up
                %  Stack: [[0, 2], [4]]
  _Yq           % Get the next prime higher than that sum
                %  Stack: [[0, 2], [5]]
  h             % Concatenate that to the list P
                %  Stack: [[0, 2, 5]]
]             % End for loop
d             % Get the differences between successive elements of
              %   the final list P

2

Haskell,67个字节

(1#1)2 2
(p#n)s k|p`mod`n>0,n-s>k=k:(p#n)n(n-s)|w<-p*n=(w#(n+1))s k

在线尝试!

(1#1)2 2是一个无需输入且输出无限列表的函数


旧答案:

Haskell88 83 78 76字节

原始性测试来自此答案,并通过Christian Sievers(-2字节)进行了改进。

-5个字节,感谢WW

2#2
(p#s)n|n<1=p|w<-until(\m->mod(product[1..m-1])m>0)(+1)$s+p+1=(w-s)#w$n-1

在线尝试!


你可以没有^2。这将使谓词从测试为素数变为测试为素数或4,这在此应用程序中无关紧要。
Christian Sievers

2

05AB1E(旧版),12个字节

0U[XN+DpiN,U

在线尝试!

说明

0U              # initialize X as 0
  [             # start an infinite loop
   XN+          # add X to N (the current iteration number)
      Dpi       # if the sum is prime:
         N,     #   print N
           U    #   and store the sum in X

有几种不同的12字节解决方案。
如果我们将一个可用变量初始化为0(而不是1和2),则该特定字节可能为10个字节。




1

Haskell101 99 97字节

该函数不l接受任何参数,并返回一个无限列表。不像@ovs 更直接的方法那样短(我显然偷走了他们回答的某些部分),但也许还能打高尔夫球吗?

感谢@ H.PWiz -2个字节!

import Data.List
p m=mod(product[1..m-1])m>0
l=2:[until(p.(+sum a))(+1)$last a+1|a<-tail$inits l]

在线尝试!


1

Python 2中82 80个字节

s=p=2
i=input()
P=n=1
while i:
 P*=n;n+=1
 if P%n>0<n-s-p:p=n-s;s=n;i-=1
print p

在线尝试!

这将输出序列的第n个数字(从0开始)。通过print在循环中移动in,可以对其进行修改以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.