ヒルベルトプライムズゴルフ


18

ヒルベルト番号はフォームの正の整数として定義されている4n + 1ためn >= 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)全体的なリーダーボードとして、回答からリーダーボードを生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、スニペットに表示することもできます。

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


「比較的素数で」ではなく「で割り切れない」という意味だと思います。21と9は3の共通因子を共有しています。
xnor15年

回答:


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,...それぞれの倍数をその右側のリストから削除することです。これにより、ヒルベルト素数の無限リストが生成されます。次に、th要素を!!取りnます。

私は(\a b->a:[x|x<-b,mod x a>0])ポイントフリーを作成しようとしましたが、より短い方法を見つけませんでした。


3
ターニングfoldr:別のリストへの理解は2つの不戦勝節約([x|x<-[5,9..],all((>0).mod x)[5,9..x-1]]!!)
nimi

@nimi素敵なソリューション。あなたはそれを投稿するべきです、それは異なる方法です。それは定義により直接的であり、リストの繰り返しがあまりきれいではないので、それは短いですが悲しいです。
xnor

4

CJam、36 33 32 23バイト

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

オンラインで試す

実際、最新バージョンは私よりもはるかに@MartinBüttnerのものです。彼の提案するソリューションの重要なアイデアは、2つのネストされたループを使用して、条件を満たすn番目の値を見つけることです。元のソリューションでループを1つだけ使用することで賢いと思っていましたが、追加のロジックは2つ目のループを使用しないことで節約したコストよりも高いことがわかりました。

説明

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ループが(少なくとも)もう1回繰り返され、ヒルベルト合成を効果的にスキップするように、ターゲットがインクリメントされます。


2

Mathematica、65バイト

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

リスト全体を生成し、そこから要素を選択します。


1

ルビー、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番目のヒルベルト素数に達するまで、ヒルベルト数を1つずつ確認するだけです。ヒルベルト数による除算は正規表現によって処理されます。


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

9バイトを削除してくれたTom Carpenterに感謝します!

使用例:

>> H(20)
ans =
   101

@TomCarpenterありがとう!今、この答えは私のものよりあなたのものです:
ルイスメンドー

どういたしまして :)。それはまだあなたのロジックです。途中で私が学んだいくつかのトリックを適用しました。
トムカーペンター

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配列はインデックスが1つなので、これはで始まりf(1) == 5ます。

Lazyパッケージを使用した最初の試みは106バイトです。これを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)
アレックスA.

1
endof代わりにlengthとのx%k代わりに使用すると、さらに節約できますmod(x,k)
アレックスA.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.