พิมพ์จำนวนเฉพาะที่ขาดหายไป


18

งาน

เขียนโปรแกรมหรือฟังก์ชั่นที่เมื่อผ่านการป้อนข้อมูลตัวเลขxพิมพ์หรือผลตอบแทนเฉพาะใต้รากที่สองของx1xที่ไม่ได้เป็นปัจจัย

ตัวอย่าง

อนุญาตf(x)เป็นฟังก์ชันที่เรียกว่า:

>>> f(4)
[]

>>> f(5)
[2]

>>> f(20)
[3]

>>> f(60)
[7]

>>> f(100)
[3, 7]

>>> f(10000)
[3, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

กฎโบนัส

  • คุณสามารถใช้บิลด์อินที่ภาษาของคุณมีให้
  • โปรแกรมของคุณต้องรองรับxอินพุตที่สูงที่สุดเท่าที่ขอบเขตสูงสุดที่กำหนดโดยภาษาของคุณ

1xใช้รากที่เป็นช่วงเวลาเพียงด้านล่างรากที่จริงสามารถมีส่วนร่วมภายในปัจจัยของ หากไม่มีข้อ จำกัด นี้จำนวนที่มากขึ้นจะมีจำนวนพิมพ์เกินจำนวนมาก


3
"เฉพาะช่วงล่างใต้สแควร์รูทเท่านั้นที่สามารถมีส่วนร่วมภายในปัจจัยของx" ไม่เป็นความจริง: ตัวเลขสามารถมีตัวประกอบสำคัญหนึ่งตัวที่ใหญ่กว่าสแควร์รูทได้ อันที่จริงสองตัวอย่างแรกของคุณ (5 และ 20) มีคุณสมบัตินี้เช่นเดียวกับช่วงเวลาที่ทุกครั้งที่สองทุกช่วงเวลาที่แปลก ....
เกร็กมาร์ติน

1
@GregMartin ใช่พวกเขาสามารถ - แต่พวกเขาไม่สามารถพบได้ในครึ่งแรกของปัจจัย มันสมเหตุสมผลที่จะไม่รวม 7 เข้าไปในช่วงเวลาที่ขาดหายไปของ 48 เมื่อ 7 ^ 2 มากกว่า 48 (เหตุผลของฉันอยู่ที่นั่น)
Addison Crump

คำตอบ:


8

เยลลี่ขนาด 6 ไบต์ในเพจรหัสของเจลลี่

½ÆRḟÆf

ลองออนไลน์!

คำอธิบาย:

½ÆRḟÆf
 ÆR    All primes less than or equal to
½      the square root of the input
   ḟ   but with the following removed:
    Æf All prime factors of {the input, by default}

5
คำตอบของเยลลี่มักจะอธิบายถึงความท้าทายอย่างแท้จริง: P
ETHproductions



5

MATLAB, 57 54 ไบต์

function h(p);a=primes(p^.5);a(~ismember(a,factor(p)))

ค่อนข้างตรงไปตรงมารับช่วงเวลาที่มีค่าสูงสุดถึง sqrt (p) จากนั้นลบค่าใด ๆ ที่มีค่า p ด้วย พิมพ์เอาต์พุตของบรรทัดสุดท้ายโดยดีฟอลต์เนื่องจากเซมิโคลอนถูกปิด


1
ฉันไม่เคยลอง MATLAB แต่จากสิ่งที่ฉันอ่านเกี่ยวกับมัน sqrt (p) สามารถเขียนเป็น p ^ 0.5 หรืออาจจะเป็น p ^ .5 ถึงแม้ว่าฉันไม่แน่ใจเกี่ยวกับคำแนะนำที่สอง
t-clausen.dk

ดี! :) ฉันโพสต์ข้อเสนอ Octaveโดยใช้วิธีการเดียวกัน
Stewie Griffin

4

Pyth, 10 ไบต์

fP_T-S@Q2P

โปรแกรมที่รับอินพุตของตัวเลขและพิมพ์รายการ

ชุดทดสอบ

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

fP_T-S@Q2P   Program. Input: Q
fP_T-S@Q2PQ  Implicit input fill
f            Filter
     S@Q2    the 1-indexed range up to floor(sqrt(Q))
    -    PQ  with the prime factors of Q removed
 P_T         by primality
             Implicitly print



2

Mathematica ขนาด 46 ไบต์

Select[Prime@Range@PrimePi@Sqrt[a=#],!#∣a&]&

ฟังก์ชั่นไม่ระบุชื่อ รับตัวเลขเป็นอินพุตและส่งคืนรายการตัวเลขเป็นเอาต์พุต อักขระ Unicode เป็น U + 2223 \[Divides]แบ่งสำหรับ


2

Ruby, 55 ไบต์

require'prime'
->x{Prime.to_a(x**0.5).select{|n|x%n>0}}

คำตอบที่ค่อนข้างขี้เกียจโดยใช้ตัวแจงนับเฉพาะในตัว


2

สงสัย 14 ไบต์

@(_> > ^#0.5)P

การใช้งาน:

(@(_> > ^#0.5)P)10

รับไอเท็มจากรายการช่วงเวลาที่ไม่มีที่สิ้นสุดในขณะที่ไอเท็มนั้นน้อยกว่ารากที่สองของการโต้แย้ง



2

PowerShell v2 +, 71 ไบต์

param($n)1..[math]::Sqrt($n)|?{$n%$_-and'1'*$_-match'^(?!(..+)\1+$)..'}

โซลูชั่นซ้ำ รับอินพุต$nและสร้างช่วงจาก1ไปที่Sqrt($n)(โปรดทราบว่าตัวดำเนินการช่วงจะส่งสัญญาณโดยส่วนใหญ่ไปยังส่วน[int]ที่จะทำการปัดเศษของธนาคารโดยค่าเริ่มต้น) แล้วใช้|?{...}(คนWhere-Objectผู้ประกอบการซึ่งทำหน้าที่เหมือนตัวกรอง) ที่จะดึงออกตัวเลขเหล่านั้นที่$n%$_เป็นที่ไม่ใช่ศูนย์ (เช่นที่เหลือใด ๆ กับโมดูโลหมายความว่ามันไม่ได้เป็นปัจจัยและใด ๆ ที่ไม่ใช่ศูนย์เป็น truthy) ทดสอบที่สำคัญ regex ปกติคือ. สิ่งเหล่านี้จะถูกทิ้งไว้บนไปป์ไลน์และผลลัพธ์ก็เป็นนัย-and$true

ตัวอย่าง

(พร้อมการจัดรูปแบบพิเศษบางอย่างเพื่อเพิ่มเอาต์พุต)

PS C:\Tools\Scripts\golfing> 5,20,60,100,10000|%{"f($_)";(.\print-the-missing-primes.ps1 $_)-join', ';""}
f(5)
2

f(20)
3

f(60)
7

f(100)
3, 7

f(10000)
3, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97

หมายเหตุ - สิ่งนี้จะล้มเหลวในเวอร์ชั่นก่อนหน้าหากอินพุตมีขนาดใหญ่กว่า2500000000เพราะ..ผู้ให้บริการช่วงสามารถรองรับได้สูงสุด 50,000 รายการเท่านั้น แต่เนื่องจากมีขนาดใหญ่กว่าค่า[int]สูงสุดของประเภทข้อมูลเริ่มต้น2147483647ฉันจึงสันนิษฐานว่าเป็นได้ บนเครื่องของฉัน PSv4 Win8.1 แต่ฉันสามารถสูงขึ้นได้ แต่ฉันไม่สามารถค้นหาเอกสารอธิบายความแตกต่างได้


2

JavaScript (ES6), 79 76 ไบต์

f=(q,n=2,x=n)=>n*n<q?[...--x<2&&q%n?[n]:[],...x>1&&n%x?f(q,n,x):f(q,n+1)]:[]

อยู่บนพื้นฐานของฉันฟังก์ชั่นการทดสอบ recursive primality ฉันรู้สึกว่าควรจะมีวิธีการที่จะทำให้สิ่งนี้ง่ายขึ้น แต่ฉันไม่สามารถหาวิธี ...

ตัวอย่างการทดสอบ

f=(q,n=2,x=n)=>n*n<q?[...--x<2&&q%n?[n]:[],...x>1&&n%x?f(q,n,x):f(q,n+1)]:[]
<input type="number" step=1 min=4 value=4 oninput="O.innerHTML='['+f(this.value)+']'"><br>
<pre id=O>[]</pre>


2

อ็อกเทฟ 44 ไบต์

คำตอบนี้ได้รับแรงบันดาลใจจากคำตอบ MATLABของ MattWH แต่ฉันเล่นกอล์ฟโดยใช้คุณสมบัติเฉพาะของอ็อกเทฟ

@(x)(y=primes(x^.5))(~ismember(y,factor(x)))

xนี้เป็นฟังก์ชั่นที่ไม่ระบุชื่อที่ใช้เวลาการป้อนข้อมูล อ็อกเทฟมีการกำหนดตัวแปรแบบอินไลน์และการจัดทำดัชนีอนุญาตให้yสร้างขึ้นครั้งแรกในฟังก์ชั่น (เป็นไปไม่ได้ใน MATLAB) จากนั้นใช้เป็นส่วนหนึ่งของหน้ากากตรรกะที่สร้างขึ้นโดยismember(อีกครั้งไม่สามารถทำได้ด้วยวิธีนี้ใน MATLAB)


ดีมากจะต้องดูเป็นคู่ คุณสมบัติเหล่านั้นจะเป็นประโยชน์สำหรับการเล่นกอล์ฟ!
MattWH

1

Perl 6 , 37 ไบต์

{grep {$^a.is-prime&$_%$a},2.. .sqrt}

ขยาย:

{   # bare block lambda with implicit parameter 「$_」

  grep
  {
    $^a.is-prime  # check if it is prime
    &             # and junction
    $_ % $a       # check if the input is not evenly divisible by it
  },
  2.. .sqrt          # Range of values up-to and including squareroot
}

1

TSQL, 130 ไบต์

DECLARE @v int=10000

,@ INT=2SELECT 2p INTO #
g:INSERT # SELECT @ FROM # HAVING isnull(min(@%p),1)>0SET @+=1IF @*@<@v GOTO g
SELECT*FROM # WHERE @v%p>0

สิ่งนี้จะดำเนินการเพียงครั้งเดียวจากนั้นคุณจะต้องวางตารางชั่วคราวเพื่อเรียกใช้งานอีกครั้งในโปรแกรมแก้ไขเดียวกัน

DROP TABLE #

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

ลองออนไลน์


1

R, 58 63 ไบต์

for(i in 2:sqrt(x<-scan()))if(x%%i&numbers::isPrime(i))print(i)

วนซ้ำค่าทั้งหมดตั้งแต่ 2 ถึงsqrt(x)และตรวจสอบว่าเป็นค่าเฉพาะกับnumbersแพ็คเกจหรือไม่ x%%iคำนวณx mod iซึ่งเป็น0 -> Falseถ้าiเป็นตัวหารของxและ>0 -> Trueถ้าiไม่ได้เป็น

+5 ไบต์เพราะnumbers::Primes(n)ฟังก์ชั่นไม่อนุญาตให้ใช้ทศนิยมในขณะที่2:sqrt(x)ใช้งานได้ให้เพิ่มการตรวจสอบแบบไพรม์ลงในifคำสั่ง


1

Haskell, 55 54 ไบต์

f x=[y|y<-[2..x],y*y<x,[z|z<-[1..y],gcd(z*x)y>1]==[y]]

รายการความเข้าใจที่ซ้อนกันตรงไปตรงมาส่วนใหญ่ GCD ดำเนินการสองบทบาทโดยทดสอบว่าตัวเลขด้านล่าง y เป็นปัจจัยของ y หรือไม่และทดสอบว่า y เป็นปัจจัยของ x หรือไม่

เว้นระยะเล็กน้อย:

f x = [ y|y<-[2..x],     y*y<x,     [z|z<-[1..y], gcd (z*x) y > 1] == [y] ]

gcd(z*x)y>1บันทึกไบต์ด้วย
Zgarb

ฉันได้ใส่ y * y <x ตรวจสอบก่อนเพื่อให้เร็วขึ้นเล็กน้อย
James Hollis

0

เรติน่า69 69ไบต์

.+
$*
(11\1|^1)+
$#1$*1:$&
M!&`(?!(11+)\1+:)(1+):(?!\2+$)
M%`1
^0

พิมพ์จำนวนเฉพาะในบรรทัดแยกจากที่ใหญ่ที่สุดไปหาน้อยที่สุด

ลองออนไลน์! (ใช้เวลาประมาณ 10 วินาทีเนื่องจากสองกรณีทดสอบล่าสุดหัวกระดาษและท้ายกระดาษเปิดใช้งานชุดทดสอบแยก linefeed และแปลงเอาต์พุตเป็นเครื่องหมายจุลภาคเพื่อให้สามารถอ่านได้)

คำอธิบาย

.+
$*

แปลงอินพุตเป็น unary

(11\1|^1)+
$#1$*1:$&

นี้ prepends :รากที่สองของการป้อนข้อมูลแยกจากกันโดย สแควร์รูทคำนวณจากข้อเท็จจริงที่ว่าสแควร์ของnยังเป็นผลรวมของnจำนวนเต็มคี่แรก (11\1|^1)เราสามารถตรงกับเลขคี่ติดต่อกันในการอ้างอิงไปข้างหน้า ในกระบวนการกลุ่มจะถูกใช้อย่างถูกต้องnครั้งซึ่งnเป็นจำนวนมากที่สุดที่มีสแควร์เหมาะกับการป้อนข้อมูล

เราแทรกตัวเลขที่ไม่เป็นเอกภาพของตัวเลขนี้ด้วย$#1$*1ตามด้วยเครื่องหมายจุดคู่และการแข่งขัน

M!&`(?!(11+)\1+:)(1+):(?!\2+$)

สิ่งนี้ตรงกับช่วงเวลาที่หายไปทั้งหมดที่พอดีกับรากที่สอง การตรวจจับเฉพาะนั้นขึ้นอยู่กับการตรวจสอบเฉพาะนายกมาตรฐานจากนั้นเราก็ตรวจสอบให้แน่ใจว่านายกที่เราเพิ่งจับภาพไม่ได้แบ่งการป้อนข้อมูลด้วย lookahead ที่สอง เมื่อใช้&ตัวเลือกนี้เราจะได้รับการจับคู่ที่ทับซ้อนกันเพื่อให้แน่ใจว่าเราจะได้รับช่วงเวลาทั้งหมด

M%`1

วิธีนี้จะแปลงแต่ละบรรทัด (เช่นแต่ละตำแหน่งที่ขาดหายไป) กลับเป็นทศนิยมโดยการจับคู่จำนวน1s ปัญหาเดียวคือว่านี้แทรกเป็นศูนย์ถ้าไม่พบสิ่งที่ขาดหายไปเลย

^0

ดังนั้นสเตจนี้จะลบศูนย์ถ้ามันถูกเพิ่มเข้าไป

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