Hilbert Primes Golf


18

Số Hilbert được định nghĩa là số nguyên dương của biểu mẫu 4n + 1cho n >= 0. Một vài số Hilbert đầu tiên là:

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

Trình tự số Hilbert được đưa ra bởi trình tự OEIS A016813 .

Một dãy số liên quan, các số nguyên tố Hilbert, được định nghĩa là các số Hilbert H > 1không chia hết cho bất kỳ số Hilbert nào knhư vậy 1 < k < H. Một số nguyên tố Hilbert đầu tiên là:

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

Đương nhiên, OEIS cũng có trình tự này .

Cho một số nguyên nnhư vậy mà 0 <= n <= 2^16như là đầu vào, đầu ra các nthứ Hilbert thủ.

Đây là , vì vậy các quy tắc tiêu chuẩn được áp dụng và mã ngắn nhất tính theo byte sẽ thắng.

Bảng xếp hạng

Đoạn trích Stack ở cuối bài này tạo bảng xếp hạng từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

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


Tôi nghĩ bạn có nghĩa là "không chia hết cho" thay vì "tương đối nguyên tố". 21 và 9 chia sẻ hệ số chung là 3.
xnor 7/12/2015

Câu trả lời:


3

Bình thường, 21 byte

Lh*4bye.fqZf!%yZyT1hQ

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình:

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 byte

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

Một chức năng ẩn danh.

Cốt lõi là foldr(\a b->a:[x|x<-b,mod x a>0])[][5,9..], lặp đi lặp lại thông qua tiến trình số học 5,9,13,..., loại bỏ bội số của từng cái từ danh sách bên phải của nó. Điều này tạo ra danh sách vô hạn các số nguyên tố Hilbert. Sau đó, !!lấy nphần tử thứ.

Tôi đã cố gắng tạo ra (\a b->a:[x|x<-b,mod x a>0])pointfree nhưng không tìm thấy cách nào ngắn hơn.


3
Biến việc foldrhiểu thành danh sách khác giúp tiết kiệm hai tạm biệt:([x|x<-[5,9..],all((>0).mod x)[5,9..x-1]]!!)
nimi

@nimi Giải pháp đẹp. Bạn nên đăng nó, đó là một phương pháp khác. Tôi buồn vì nó ngắn hơn vì nó trực tiếp hơn với định nghĩa và sự lặp lại của danh sách là ít đẹp hơn.
xnor

4

CJam, 36 33 32 23 byte

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

Dùng thử trực tuyến

Phiên bản mới nhất thực sự nhiều hơn @ MartinBüttner so với của tôi. Ý tưởng chính trong giải pháp được đề xuất của ông là sử dụng hai vòng lặp lồng nhau để tìm giá trị thứ n đáp ứng điều kiện. Tôi nghĩ rằng tôi đã thông minh bằng cách chỉ sử dụng một vòng lặp duy nhất trong giải pháp ban đầu của mình, nhưng hóa ra logic bổ sung có giá cao hơn tôi đã tiết kiệm bằng cách không sử dụng vòng lặp thứ hai.

Giải trình

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

Chồn 0,14 , 46 37 32 byte

Tôi đã không nhận ra rằng gosub là hoàn toàn không cần thiết ...> _>

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

Hãy thử nó ở đâykiểm tra tất cả các trường hợp thử nghiệm ở đây .

Giải trình

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.

Thanh ghi được sử dụng để lưu trữ chỉ mục đích. Vòng lặp while bên ngoài tính toán từng số Hilbert và thực hiện một số sổ sách kế toán. Vòng lặp while bên trong kiểm tra từng số Hilbert về tính nguyên thủy. Nếu số Hilbert không phải là số nguyên tố Hilbert, thì mục tiêu được tăng lên để vòng lặp ngoài phải lặp lại (ít nhất) một lần nữa, bỏ qua các vật liệu tổng hợp Hilbert một cách hiệu quả.


2

Toán học, 65 byte

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

Tạo toàn bộ danh sách và chọn thành phần từ nó.


1

Ruby, 60 byte

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

Chỉ kiểm tra các yếu tố nguyên tố Hilbert.


0

JavaScript (ES6), 73 byte

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

Chỉ cần kiểm tra từng số Hilbert cho đến khi chúng ta đạt đến số nguyên tố Hilbert thứ n. Tính phân chia theo số Hilbert được xử lý bằng regex.


0

Matlab, 74 83 byte

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

Cảm ơn Tom Carpenter đã xóa 9 byte!

Ví dụ sử dụng:

>> H(20)
ans =
   101

@TomCarpenter Cảm ơn! Bây giờ câu trả lời này là của bạn nhiều hơn của tôi :-)
Luis Mendo

Không có gì :). Đó vẫn là logic của bạn, chỉ cần áp dụng một vài thủ thuật mà tôi đã học trên đường đi.
Tom Carpenter

0

Julia, 73 byte

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

Cảm ơn Alex A. vì đã tiết kiệm 11 byte! Điều này sử dụng thuật toán tương tự như câu trả lời Matlab và Ruby. Vì mảng Julia là một chỉ mục, điều này bắt đầu bằngf(1) == 5 .

Nỗ lực đầu tiên của tôi, sử dụng gói Lazy, là 106 byte . Nếu bạn có kế hoạch chạy cái này trong REPL, hãy đảm bảo thêm dấu chấm phẩy vào cuối dòng để triệt tiêu đầu ra vô hạn. Và gọi Pkg.Add("Lazy")nếu bạn chưa cài đặt nó.

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 byte: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
Bạn có thể tiết kiệm thêm một số bằng cách sử dụng endofthay vì lengthx%kthay vì mod(x,k).
Alex A.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.