คำนวณขั้นต่ำเช่นที่เป็นค่าเฉพาะ (OEIS A051935)


12

พื้นหลัง

พิจารณาลำดับต่อไปนี้ ( A051935ใน OEIS):

  • เริ่มต้นด้วยคำว่า22
  • ค้นหาจำนวนเต็มต่ำสุดมากกว่าเพื่อให้เป็นจำนวนเฉพาะ2 2 + nn22+n
  • ค้นหาจำนวนเต็มต่ำสุดมากกว่าเช่นที่เป็นต้น n 2 + n + n nn2+n+n

คำจำกัดความที่เป็นทางการมากขึ้น:

an={2if n=0min{xNx>an1 and (x+i=0n1ai) is prime}otherwise

ข้อกำหนดสองสามข้อแรกของลำดับคือ (โปรดอ้างถึงสิ่งเหล่านี้เป็นกรณีทดสอบ):

2, 3, 6, 8, 10, 12, 18, 20, 22, 26, 30, 34, 36, 42, 44, 46, 50, 52, 60, 66, 72, 74, ...

งาน

งานของคุณคือการสร้างลำดับนี้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้:

  • เอาท์พุทเงื่อนไขของมันไปเรื่อย ๆ
  • รับn , เอาต์พุตan ( nthคำ, 0หรือ1ดัชนี)
  • ได้รับn , เอาท์พุท{a1,a2,,an} (ตอนแรกnเงื่อนไข)

คุณสามารถแข่งขันในภาษาการเขียนโปรแกรมใด ๆและสามารถรับอินพุตและให้เอาต์พุตผ่านวิธีการมาตรฐานใด ๆในขณะที่รับทราบว่าช่องโหว่เหล่านี้ถูกห้ามโดยค่าเริ่มต้น นี่คือดังนั้นการส่งสั้นที่สุด (เป็นไบต์) สำหรับทุกภาษาที่ชนะ


4
เคล็ดลับในการหลีกเลี่ยงในขณะที่เขียนความท้าทาย: ตัวเลขที่สำคัญ คุณสามารถใช้อย่างอื่นนอกเหนือจากดั่งเดิม
Okx

3
@Okx ฉันมีเหตุผลสองสามข้อในใจเมื่อฉันเลือก primality ในเวลานี้: 1) มีอัลกอริทึมที่ชาญฉลาดที่เฉพาะเจาะจงกับลำดับนี้มากเช่นเดียวกับDennis ที่นำไปใช้ 2) มีรายการ OEIS สำหรับเรื่องนี้แล้ว
นาย Xcoder

คำตอบ:


4

Brachylogขนาด 13 ไบต์

~l.<₁a₀ᵇ+ᵐṗᵐ∧

ลองออนไลน์!

เอาท์พุทเป็นรายการของnคำแรกของลำดับ

?~l.<₁a₀ᵇ+ᵐṗᵐ∧    Full code (? at beginning is implicit)

?~l.              Output is a list whose length is the input
    <₁            Output is an increasing list
      a₀ᵇ+ᵐ       And the cumulative sum of the output
           ṗᵐ     Consists only of prime numbers
             ∧    No further constraints on output

Explanation for a₀ᵇ+ᵐ:
a₀ᵇ               Get the list of all prefixes of the list
                  Is returned in increasing order of length
                  For eg. [2, 3, 6, 8] -> [[2], [2, 3], [2, 3, 6], [2, 3, 6, 8]]
   +ᵐ             Sum each inner list  -> [2, 5, 11, 19]


4

เยลลี่ , 11 9 ไบต์

0Ḥ_ÆnɗСI

นี้เป็นโปรแกรมเต็มรูปแบบที่จะใช้เวลาnเป็นอาร์กิวเมนต์และพิมพ์ครั้งแรกnแง่ของลำดับ

ลองออนไลน์!

มันทำงานอย่างไร

0Ḥ_ÆnɗСI  Main link. Argument: n

0          Set the return value to 0.
      С   Accumulating iterate. When acting on a dyadic link d and called with
           arguments x and y, the resulting quicklink executes
           "x, y = d(x, y), x" n times, returning all intermediate values of x.
           Initially, x = 0 and  y = n.
     ɗ       Drei; combine the three links to the left into a dyadic chain.
 Ḥ             Unhalve; double the left argument.
  _            Subtract the right argument.
   Æn          Compute the next prime.
           This computes the partial sums of the sequence a, starting with 0.
        I  Increments; compute the forward differences.

3

05AB1E v2 , 10 ไบต์

2λλOD₁+ÅNα

ลองออนไลน์!

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

มันทำงานอย่างไร

กำหนดลำดับอนันต์ recursive กับกรณีฐาน2โครงสร้างเป็นหนึ่งในคุณสมบัติที่มากเย็นใหม่ 05AB1E ของ พูดสั้น ๆ ก็จะใช้เวลาฟังก์ชั่น , การตั้งค่าอาร์กิวเมนต์จำนวนเต็มได้รับในกรณีนี้2a ( n ) a ( 0 ) 22λa(n)a(0)2

λO

ในส่วนของรหัสนี้λบทบาทของมันแตกต่างกัน มีอยู่แล้วภายในสภาพแวดล้อมแบบเรียกซ้ำมันสร้าง , รายการผลลัพธ์ก่อนหน้านี้ทั้งหมด จากนั้นสรุปพวกเขา[a(0),a(1),,a(n1)]O

D₁+

ทำซ้ำผลรวมเพื่อใช้ในภายหลังและเพิ่มลงในสำเนาที่สองa(n1)

ÅN

สร้างไพรม์ต่ำสุดที่เข้มงวดมากกว่าผลรวมด้านบน

α

ในที่สุดให้ดึงความแตกต่างที่แน่นอนระหว่างค่าที่คำนวณได้ด้านบนและสำเนาแรกของผลรวมที่คำนวณก่อนหน้านี้ (ผลรวมของการทำซ้ำก่อนหน้านี้ทั้งหมด)

กระแสข้อมูลจะถูกพิมพ์ไปยัง STDOUT โดยปริยาย


2

Perl 6 , 45 ไบต์

2,{first (*+@_.sum).is-prime,@_[*-1]^..*}...*

ลองออนไลน์!

ส่งคืนรายการสันหลังยาวที่สร้างลำดับโดยไม่มีจุดสิ้นสุด

คำอธิบาย:

ใช้ตัวดำเนินการลำดับ...ที่กำหนดลำดับดังนี้:

2,  # The first element is 2
  {  # The next element is:
    first  # The first value that:
          (*+@_.sum).is-prime,  # When added to the sum is a prime
          @_[*-1]^..*  # And is larger than the previous element
  }
...*  # And continue the sequence indefinitely



2

Pyth ,12 11 ไบต์

.f&P-;Z=-;Z

ลองออนไลน์!

บันทึก 1 ไบต์ขอบคุณ isaacg

สร้างnตัวเลขดังกล่าวเป็นครั้งแรกโดยใช้ดัชนีตาม 1

.fค้นหาkจำนวนเต็มแรกที่ตอบสนองเกณฑ์เฉพาะเริ่มต้นจากศูนย์ ที่นี่เกณฑ์เป็นว่านายกคนก่อนหน้านี้ที่เราคำนวณ;รวมกับหมายเลขปัจจุบันZคือตัวหลัก ( P) ถ้าเป็นเช่นนั้นเราจะอัพเดทนายกที่คำนวณล่าสุดโดยใช้พฤติกรรมการลัดวงจรของตรรกะและฟังก์ชั่น ( &) น่าเสียดายที่.fตัวแปรเริ่มต้นนั้นมีZค่าใช้จ่ายไบต์ในการอัปเดต

เคล็ดลับที่เป็นไปได้คือการจัดเก็บการปฏิเสธของนายกที่ผ่านมาและทดสอบกับที่ลบมูลค่าปัจจุบัน สิ่งนี้จะสั้นลงใน Pythms เนื่องจากการตรวจสอบแบบดั้งเดิมนั้นมากเกินไป: บนจำนวนบวกจะพบการแยกตัวประกอบเฉพาะขณะที่จำนวนลบจะเป็นตัวกำหนดว่าค่าบวกของตัวเลขนั้นเป็นจำนวนเฉพาะหรือไม่

สิ่งนี้มากหรือน้อยแปลเป็น:

to_find = input()
last_prime = 0
current = 0
results = []
while to_find > 0:
    if is_prime( current + last_prime ):
        results.append( current )
        to_find -= 1
        last_prime += current
    current += 1
print results

แทนที่_+ด้วย-และ+ด้วย--1 ไบต์
isaacg

@isaacg มันค่อนข้างฉลาด! ฉันจะแก้ไขสิ่งต่อไปนี้
FryAmTheEggman

2

MATL , 21 ไบต์

O2hGq:"t0)yd0)+_Yqh]d

ลองออนไลน์!

เอาต์พุตเป็นคำศัพท์nลำดับแรกของลำดับ

คำอธิบาย:

สร้างรายการช่วงเวลา (ด้วยค่าเริ่มต้น 0) และท้ายที่สุดจะพบว่าส่งคืนความแตกต่างระหว่างช่วงเวลาต่อเนื่องในรายการ

              % Implicit input, say n
O2h           % Push P = [0, 2] on the stack 
Gq:"          % for loop: 1 to n-1
  t0)           % Take the last element of P
                %  Stack: [[0, 2], [2]] (in first iteration)
  yd0)          % Take the difference between the last
                %   two elements of P
                %  Stack: [[0, 2], [2], [2]]
  +             % Add those up
                %  Stack: [[0, 2], [4]]
  _Yq           % Get the next prime higher than that sum
                %  Stack: [[0, 2], [5]]
  h             % Concatenate that to the list P
                %  Stack: [[0, 2, 5]]
]             % End for loop
d             % Get the differences between successive elements of
              %   the final list P

2

Haskell , 67 ไบต์

(1#1)2 2
(p#n)s k|p`mod`n>0,n-s>k=k:(p#n)n(n-s)|w<-p*n=(w#(n+1))s k

ลองออนไลน์!

(1#1)2 2เป็นฟังก์ชั่นที่ไม่มีอินพุตและเอาต์พุตรายการไม่สิ้นสุด


คำตอบเก่า:

Haskell , 88 83 78 76 ไบต์

การทดสอบแบบดั้งเดิมนั้นมาจากคำตอบนี้และได้รับการปรับปรุงโดยChristian Sievers (-2 bytes)

-5 ไบต์ขอบคุณที่WW

2#2
(p#s)n|n<1=p|w<-until(\m->mod(product[1..m-1])m>0)(+1)$s+p+1=(w-s)#w$n-1

ลองออนไลน์!


^2คุณสามารถทำได้โดยไม่ต้อง ที่จะเปลี่ยนภาคแสดงผลจากการทดสอบเป็นสำคัญเพื่อการทดสอบเป็นสำคัญหรือ 4ซึ่งไม่สำคัญในโปรแกรมนี้
Christian Sievers

2

05AB1E (ดั้งเดิม) 12 ไบต์

0U[XN+DpiN,U

ลองออนไลน์!

คำอธิบาย

0U              # initialize X as 0
  [             # start an infinite loop
   XN+          # add X to N (the current iteration number)
      Dpi       # if the sum is prime:
         N,     #   print N
           U    #   and store the sum in X

มีวิธีแก้ปัญหา 12 ไบต์ที่ต่างกันสองวิธี
อันนี้น่าจะเป็น 10 ไบต์ถ้าเรามีตัวแปรที่ใช้งานได้เริ่มต้นเป็น 0 (แทน 1 และ 2)


1

Python 2 , 119 ไบต์

f=lambda n,k=1,m=1:m%k*k>n or-~f(n,k+1,m*k*k)
def g(i):
 r=[2]
 for j in range(i):r+=[f(sum(r)+r[-1])-sum(r)]
 return r

ลองออนไลน์!

ฟังก์ชั่น Prime ถัดไป f () นำมาจากคำตอบนี้

ฟังก์ชั่น g () รับจำนวนเต็มไม่ใช่ค่าลบ i และส่งกลับรายการของรายการทั้งหมดในลำดับจนถึงดัชนีนั้น


-7 ไบต์
Mr. Xcoder

1

Python 2 , 99 98 ไบต์

def f(n,s=2,v=2):
 k=s-~v
 while any(k%i<1for i in range(2,k)):k+=1
 return n and f(n-1,k,k-s)or v

ลองออนไลน์!

1 ไบต์ขอบคุณไปยังนาย Xcoder


1
ฉันรู้ ... ฉันรู้ว่า ... ฉันและบิตเทคนิคของฉันคุยโวโอ้อวด :) k=s-~vแต่คุณสามารถบันทึกไบต์ด้วย
Mr. Xcoder

@นาย. Xcoder: คาถาศาสตร์เวทระดับบิตที่ไม่บริสุทธิ์ของคุณจะเป็นจุดสิ้นสุดของคุณ! :)
Chas Brown

1

Haskell , 101 99 97 ไบต์

ฟังก์ชั่นlจะไม่มีข้อโต้แย้งและส่งกลับรายการที่ไม่มีที่สิ้นสุด ไม่ได้เป็นสั้นโดยตรงมากขึ้นวิธีการโดย @ovs (และฉันเห็นได้ชัดว่าขโมยบางส่วนในรูปแบบคำตอบของพวกเขา) แต่อาจจะยังคง golfable?

ขอบคุณ @ H.PWiz สำหรับ -2 ไบต์!

import Data.List
p m=mod(product[1..m-1])m>0
l=2:[until(p.(+sum a))(+1)$last a+1|a<-tail$inits l]

ลองออนไลน์!


1

Python 2 , 82 80 ไบต์

s=p=2
i=input()
P=n=1
while i:
 P*=n;n+=1
 if P%n>0<n-s-p:p=n-s;s=n;i-=1
print p

ลองออนไลน์!

เอาต์พุตนี้มีหมายเลขที่ n ของลำดับ (อิงตาม 0) โดยการย้ายprintในวงนี้สามารถแก้ไขได้เพื่อส่งออกnรายการแรกที่ bytecount เดียวกัน: ลองออนไลน์!



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.