希尔伯特·普里姆斯高尔夫


18

希尔伯特数被定义为形式的正整数4n + 1n >= 0。希尔伯特的前几个数字是:

1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97

希尔伯特数序列由OEIS序列A016813给出

相关的数字序列,希尔伯特质数,被定义为H > 1不能被任何希尔伯特数(k例如)整除的希尔伯特数1 < k < H。希尔伯特素数的前几个是:

5, 9, 13, 17, 21, 29, 33, 37, 41, 49, 53, 57, 61, 69, 73, 77, 89, 93, 97, 101, 109, 113, 121, 129, 133, 137, 141, 149, 157, 161, 173, 177, 181, 193, 197

自然,OEIS也具有此顺序

给定一个整数n,使得0 <= n <= 2^16作为输入,输出n第希尔伯特素数。

这是,因此适用标准规则,以字节为单位的最短代码为准。

排行榜

这篇文章底部的堆栈摘录从答案a)生成排行榜,答案是每种语言的最短解决方案列表,b)则是总体排行榜。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

## Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以将旧分数保留在标题中,方法是将它们打掉。例如:

## Ruby, <s>104</s> <s>101</s> 96 bytes

如果您想在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

## Perl, 43 + 2 (-p flag) = 45 bytes

您还可以将语言名称设置为链接,然后该链接将显示在代码段中:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


我认为您的意思是“不能被”整除,而不是“相对于”。21和9份额3.一个共同的因素
XNOR

Answers:


3

Pyth,21个字节

Lh*4bye.fqZf!%yZyT1hQ

在线尝试:演示测试套件

说明:

Lh*4bye.fqZf!%yZyT1Q    implicit: Q = input number
L                       define a function y(b), which returns
 h*4b                      4*b + 1
                        this converts a index to its Hilbert number
       .f          hQ   find the first (Q+1) numbers Z >= 1, which satisfy:
           f      1        find the first number T >= 1, which satisfies:
            !%yZyT            y(Z) mod y(T) == 0
         qZ                test if the result is equal to Z 

                        this gives a list of indices of the first Q Hilbert Primes
      e                 take the last index
     y                  apply y and print

11

Haskell,46个字节

(foldr(\a b->a:[x|x<-b,mod x a>0])[][5,9..]!!)

匿名函数。

核心是foldr(\a b->a:[x|x<-b,mod x a>0])[][5,9..],它会通过算术级数进行迭代5,9,13,...,从列表右侧删除每个列表的倍数。这产生了希尔伯特素数的无限列表。然后,!!nth元素。

我曾尝试过使(\a b->a:[x|x<-b,mod x a>0])pointpoint 变得免费,但没有找到更短的方法。


3
foldr变成另一个列表理解可以节省两个拜拜:([x|x<-[5,9..],all((>0).mod x)[5,9..x-1]]!!)
nimi

@nimi不错的解决方案。您应该发布,这是另一种方法。我很遗憾,它更短,因为它对定义更直接,而且列表的重复性也不太好。
xnor 2015年

4

果酱,36 33 32 23字节

5ri{_L+:L;{4+_Lf%0&}g}*

在线尝试

实际上,最新版本比@MartinBüttner的要多得多。他建议的解决方案中的关键思想是使用两个嵌套循环来找到满足条件的第n个值。我以为我在原来的解决方案中只使用了一个循环就很聪明,但是事实证明,增加的逻辑开销比不使用第二个循环节省的更多。

说明

5       Push first Hilbert prime.
ri      Get input n and convert to integer.
{       Loop n times.
  _       Push a copy of current Hilbert prime.
  L       Push list of Hilbert primes found so far (L defaults to empty list).
  +       Prepend current Hilbert prime to list.
  :L      Store new list of Hilbert primes in variable L.
  ;       Pop list off stack.
  {       Start while loop for finding next Hilbert prime.
    4+      Add 4 to get next Hilbert number.
    _       Copy candidate Hilbert number.
    L       Push list of Hilbert primes found so far.
    f%      Element wise modulo of Hilbert number with smaller Hilbert primes.
    0&      Check for 0 in list of modulo values.
  }g      End while loop.
}*      End loop n times.

2

Minkolang 0.1446 37 32字节

我没有意识到gosub完全没有必要...> _>

n$z(xxi4*5+d(4-$d%)1=,z+$ziz-)N.

这里试试看,并在这里查看所有测试用例

说明

n$z                                 Take number from input and store it in the register
   (                                Open while loop
    xx                              Dump the stack
      i4*5+                         Loop counter times 4 plus 5 (Hilbert number)
           d                        Duplicate
            (                       Open while loop
             4-                     Subtract 4
               $d                   Duplicate stack
                 %                  Modulo
                  )                 Exit while loop when top of stack is 0
                   1=,              0 if 1, 1 otherwise
                      z             Push register value
                       +            Add
                        $z          Pop and store in register
                          iz-       Subtract z from loop counter
                             )      Exit while loop when top of stack is 0
                              N.    Output as number and stop.

该寄存器用于存储目标索引。外部while循环计算每个希尔伯特数并进行簿记。内部while循环检查每个希尔伯特数的素性。如果希尔伯特数不是希尔伯特素数,则增加目标,以使外部while循环必须重复(至少)一次,至少有效地跳过了希尔伯特合成。


2

Mathematica,65个字节

Select[4Range[4^9]+1,Divisors[#][[2;;-2]]~Mod~4~FreeQ~1&][[#+1]]&

生成整个列表并从中选择元素。


1

Ruby,60个字节

h=->i{n=[];x=5;n.any?{|r|x%r<1}?x+=4: n<<x until e=n[i-1];e}

仅检查希尔伯特素数。


0

JavaScript(ES6),73个字节

n=>{for(i=0,t=2;i<=n;)i+=!/^(.(....)+)\1+$/.test(Array(t+=4));return t-1}

只需一一检查希尔伯特的数字,直到我们达到希尔伯特的第n个素数。希尔伯特数的可除性由正则表达式处理。


0

Matlab,74 83字节

function t=H(n)
x=5;t=x;while nnz(x)<n
t=t+4;x=[x t(1:+all(mod(t,x)))];end

感谢Tom Carpenter删除了9个字节!

使用示例:

>> H(20)
ans =
   101

@TomCarpenter谢谢!现在,这个答案比我的答案更多:-)
Luis Mendo 2015年

别客气 :)。仍然是您的逻辑,只是应用了我在此过程中学到的一些技巧。
汤姆·卡彭特

0

朱莉娅,73个字节

n->(a=[x=5];while length(a)<n;x+=4;all(k->mod(x,k)>0,a)&&push!(a,x)end;x)

感谢Alex A.保存11个字节!这使用与Matlab和Ruby答案相同的算法。由于Julia数组是单索引的,因此从开始f(1) == 5

我第一次尝试使用Lazy包是106 bytes。如果打算在REPL中运行此命令,请确保在行的末尾添加分号以禁止无限输出。Pkg.Add("Lazy")如果尚未安装,请致电。

using Lazy
r=range
h=r(1,Inf,4)
p=@>>r() filter(n->n!=1&&all(map(x->mod(h[n],h[x])<1,2:n-1)))
f=n->h[p[n]]

1
73个字节:n->(a=[x=5];while length(a)<n x+=4;all(k->mod(x,k)>0,a)&&push!(a,x)end;x)
Alex A.

1
您可以使用endof代替lengthx%k代替来节省更多mod(x,k)
Alex A.
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.