สนามกอล์ฟ Hilbert Primes


18

หมายเลข Hilbertจะถูกกำหนดเป็นจำนวนเต็มบวกของแบบฟอร์มสำหรับ4n + 1 n >= 0หมายเลข Hilbert สองสามตัวแรกคือ:

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

ลำดับจำนวน Hilbert จะได้รับโดย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ค่านำเข้าส่งออกผลลัพธ์ของnHilbert prime

นี่คือดังนั้นจึงใช้กฎมาตรฐานและรหัสสั้นที่สุดเป็นไบต์ชนะ

ลีดเดอร์บอร์ด

สแต็คส่วนย่อยที่ด้านล่างของโพสต์นี้สร้างกระดานแต้มนำจากคำตอบ 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

คำตอบ:


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,...ลบหลายรายการของแต่ละรายการจากรายการไปทางขวา สิ่งนี้สร้างรายการอนันต์ของฮิลแบร์ตเฉพาะ จากนั้น!!ใช้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-th ที่ตรงตามเงื่อนไข ฉันคิดว่าฉันฉลาดกว่าเดิมโดยใช้ลูปเดียวในโซลูชันดั้งเดิมของฉัน แต่ปรากฎว่าตรรกะเพิ่มเติมที่เพิ่มขึ้นมากกว่าที่ฉันบันทึกไว้โดยไม่ใช้ลูปที่สอง

คำอธิบาย

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.

การลงทะเบียนใช้เพื่อจัดเก็บดัชนีเป้าหมาย ด้านนอกในขณะที่วนรอบคำนวณแต่ละหมายเลขฮิลแบร์ตและทำบัญชีบางส่วน วงด้านในขณะที่ตรวจสอบหมายเลขของฮิลแบร์ตแต่ละหมายเลข หากหมายเลขฮิลแบร์ตไม่ใช่หมายเลขฮิลแบร์ตเป้าหมายจะเพิ่มขึ้นเพื่อให้วงด้านนอกในขณะที่ต้องวนซ้ำอีกครั้งอย่างน้อยหนึ่งครั้ง


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}

ตรวจสอบปัจจัยสำคัญของ Hilbert เท่านั้น


0

JavaScript (ES6), 73 ไบต์

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

เพียงตรวจสอบหมายเลขของฮิลแบร์ตทีละคนจนกว่าเราจะไปถึงจุดที่สำคัญของฮิลแบร์ต การหารด้วยหมายเลข Hilbert นั้นจัดการโดย regex


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

ไม่เป็นไร :) มันยังคงเป็นตรรกะของคุณเพียงใช้เล่ห์เหลี่ยมบางอย่างที่ฉันได้เรียนรู้ไปพร้อมกัน
Tom Carpenter

0

Julia, 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 f(1) == 5ตั้งแต่อาร์เรย์จูเลียเป็นหนึ่งในการจัดทำดัชนีเริ่มต้นนี้กับ

ความพยายามครั้งแรกของฉันโดยใช้แพคเกจขี้เกียจเป็น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 bytes: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แทนlengthและแทนx%k mod(x,k)
Alex A.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.