힐버트 프라임 골프


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

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

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

언어 이름을 링크로 만들면 스 니펫에 표시됩니다.

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


나는 당신이 "상대적으로 소수"대신에 "나눌 수 없음"을 의미한다고 생각합니다. 21과 9는 3의 공통 요소를 공유합니다.
xnor

답변:


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

하스켈, 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,...하여 목록에서 오른쪽으로 각 배수를 제거하는 것입니다. 이것은 힐버트 프라임의 무한 목록을 생성합니다. 그리고, !!얻어 n번째 요소.

나는 (\a b->a:[x|x<-b,mod x a>0])포인트 프리를 만들 려고했지만 더 짧은 길을 찾지 못했습니다.


3
켜기 foldr다른 지능형리스트에 두 가지 부전승을 저장합니다([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입니다. 그의 제안 솔루션에서 핵심 아이디어는 두 개의 중첩 루프를 사용하여 조건을 만족하는 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.14 , 46 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 루프는 각 Hilbert 수를 계산하고 일부 부기를 수행합니다. 내부 while 루프는 각 힐버트 수에서 우선 순위를 확인합니다. 힐버트 숫자가 힐버트 소수 가 아닌 경우, 외부 while 루프가 적어도 한 번 더 반복되어 힐버트 합성물을 효과적으로 건너 뛸 수 있도록 목표가 증가합니다.


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

자바 스크립트 (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

9 바이트를 제거해 준 Tom Carpenter에게 감사합니다!

사용 예 :

>> H(20)
ans =
   101

@TomCarpenter 감사합니다! 이제이 답변은 내 것보다 더 당신입니다 :-)
Luis Mendo

천만에요 :). 그것은 여전히 ​​당신의 논리이며, 방금 배운 몇 가지 트릭을 적용했습니다.
Tom Carpenter

0

줄리아, 73 바이트

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

11 바이트를 절약 해 준 Alex A.에게 감사합니다! 이것은 Matlab 및 Ruby 답변과 동일한 알고리즘을 사용합니다. Julia 배열은 하나의 인덱스이기 때문에로 시작합니다 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)
Alex A.

1
endof대신 lengthx%k대신을 사용하여 더 절약 할 수 있습니다 mod(x,k).
Alex A.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.