สร้างตัวเลขคร่าวๆ


15

พื้นหลัง

จำนวนnสามารถอธิบายเป็นB-rough ถ้าทั้งหมดของปัจจัยที่สำคัญของการอย่างเคร่งครัดเกินnB

ความท้าทาย

รับจำนวนเต็มบวกสองตัวBและkเอาท์พุทk Bตัวเลขผ่านครั้งแรก

ตัวอย่าง

อนุญาตf(B, k)เป็นฟังก์ชั่นที่ส่งกลับชุดที่มีk Bตัวเลขที่ผ่านครั้งแรก

> f(1, 10)
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

> f(2, 5)
1, 3, 5, 7, 9

> f(10, 14)
1, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59

2
คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับความท้าทายได้หรือไม่? ฉันไม่เข้าใจ อาจอธิบายตัวอย่างหรือไม่
db

ฉันไม่เข้าใจว่าทำไมคุณรวม 1 ในคำตอบทั้งหมดของคุณเมื่อมันไม่เคยยิ่งใหญ่กว่าB?
kamoroso94

1
1 ไม่มีปัจจัยเฉพาะดังนั้นทุกปัจจัยสำคัญของ 1 จะใหญ่กว่า B และ 1 ควรปรากฏในผลลัพธ์ที่เป็นอิสระจาก B
Hood

@ db แยกตัวประกอบnเป็นช่วงเวลา หากจำนวนเฉพาะทั้งหมดมากกว่าB, n คือBผ่าน
Addison Crump

@AddisonCrump ดังนั้นเช่นเนื่องจากจำนวนเฉพาะสำหรับ 35 คือ 5 และ 7, 35 เป็น 4 คร่าวๆ นี่เป็นคำศัพท์ทั่วไปที่รู้จักหรือไม่? ไม่เคยได้ยินมาก่อน ฉันยังไม่ได้อยู่ภายใต้ตัวอย่างโดยเฉพาะอย่างยิ่งไม่ใช่คนสุดท้าย 14 ตัวเลข แต่ 10 คืออะไร?
db

คำตอบ:


5

Haskell , 53 44 ไบต์

b%k=take k[n|n<-[1..],all((>0).mod n)[2..b]]

ลองออนไลน์!

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

b%k=                       -- given inputs b and k
 take k                    -- take the first k elements from 
  [n|n<-[1..]              -- the infinite list of all n > 0
   ,all            [2..b]] -- where all numbers from 2 to b (inclusive)
      ((>0).mod n)         -- do not divide n.

สิ่งนี้สามารถทำให้ง่ายขึ้นบ้าง
H.PWiz

@ H.PWiz ถูกต้องอย่างใดฉันเพียงคิดเกี่ยวกับการใช้(>b)ส่วนที่อยู่ภายในความเข้าใจ (ซึ่งไม่ทำงาน) แต่ไม่ได้วิธีอื่น ๆ ขอบคุณ!
Laikoni

5

Python 3 , 80 , 75 ไบต์

lambda B,k:[i for i in range(1,-~B*k)if all(i%j for j in range(2,B+1))][:k]

ลองออนไลน์!

ขอบคุณshooqieสำหรับการบันทึก 5 ไบต์

Bk

ทางเลือกอื่น:

Python 2 , 78 ไบต์

B,k=input()
i=1
while k:
 if all(i%j for j in range(2,B+1)):print i;k-=1
 i+=1

ลองออนไลน์!

วิธีนี้ไม่ได้แก้ปัญหาข้างต้น และมีประสิทธิภาพมากขึ้น


3
อืมสมมุติฐานนั้นน่าจะพิสูจน์ได้ แต่ก็เป็นปัญหาที่น่าสนใจ ฉันจะจ่ายเงินเพื่อพิสูจน์
Addison Crump

1
ทำไมไม่lambda B,k:[i for i in range(1,-~B*k)if all(i%j for j in range(2,B+1))][:k]?
shooqie

1
@BlackOwlKai นั่นฟังดูเท่ ดูเพิ่มเติมmath.stackexchange.com/questions/2983364/…
Anush

@ อันน่าเศร้าหลักฐานของฉันไม่ได้ผลเพราะฉันทำผิดพลาด
Black Owl Kai


3

Perl 6 , 35 32 ไบต์

-3 ไบต์ต้องขอบคุณอย่างมาก!

{grep(*%all(2..$^b),1..*)[^$^k]}

ลองออนไลน์!

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

คำอธิบาย

{                              }  # Anonymous code block
 grep(             ,1..*)        # Filter from the positive integers
      *              # Is the number
       %             # Not divisible by
        all(      )  # All of the numbers
            2..$^b   # From 2 to b
                         [^$^k]   # And take the first k numbers

อะไรallทำอย่างไร
Addison Crump

1
@AddisonCrump allตรวจสอบว่าองค์ประกอบทั้งหมดในรายการเป็นจริงหรือไม่ ฉันจะเพิ่มคำอธิบายสำหรับทุกสิ่งในไม่ช้า
โจคิง

@nwellnhof ว้าว! ดังนั้นนี่คือสิ่งที่ทางแยกมีประโยชน์สำหรับ!
Jo King

ใช่ทราบว่าคุณยังสามารถใช้แทน[&] all
nwellnhof

@AddisonCrump ฉันเดาallว่าไม่ได้มีการใช้งานในลักษณะนั้นอีกต่อไปดังนั้นฉันควรอัปเดตคำตอบของฉัน allสร้าง Junction ของค่าในช่วง2..bและการดำเนินการใด ๆ ที่ดำเนินการกับ Junction จะได้รับการดำเนินการกับค่าทั้งหมดแบบทันที เมื่อมันถูกประเมินในบริบทบูลีนโดยสิ่งgrepนี้จะยุบลงไปว่าค่าทั้งหมดในจังก์ชั่นนั้นเป็นความจริงหรือไม่เช่นไม่ใช่ศูนย์
โจคิง


2

ถ่าน 33 ไบต์

NθNη≔⁰ζW‹Lυη«≦⊕ζ¿¬Φθ∧κ¬﹪ζ⊕κ⊞υζ»Iυ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

NθNη

การป้อนข้อมูลและBk

≔⁰ζ

ตั้งค่าzเป็น 0

W‹Lυη«

ทำซ้ำจนกว่าเราจะมีkค่า

≦⊕ζ

zการเพิ่มขึ้น

¿¬Φθ∧κ¬﹪ζ⊕κ

หารzด้วยตัวเลขทั้งหมดจาก2ถึงBและดูว่าส่วนที่เหลือเป็นศูนย์หรือไม่

⊞υζ»

ถ้าไม่เช่นนั้นให้กดzรายการว่างที่กำหนดไว้ล่วงหน้า

Iυ

ส่งรายการไปยังสตริงและส่งออกโดยปริยาย


2

JavaScript (ES6), 68 ไบต์

(b)(k)จะเข้าเป็น

b=>k=>(o=[],n=1,g=d=>(d<2?o.push(n)==k:n%d&&g(d-1))||g(b,n++))(b)&&o

ลองออนไลน์!

แสดงความคิดเห็น

b => k => (             // input = b and k
  o = [],               // o[] = output array
  n = 1,                // n = value to test
  g = d => (            // g = recursive function, taking the divisor d
    d < 2 ?             // if d = 1:
      o.push(n) == k    //   push n into o[] and test whether o[] contains k elements
    :                   // else:
      n % d && g(d - 1) //   if d is not a divisor of n, do a recursive call with d - 1
    ) ||                // if the final result of g() is falsy,
    g(b, n++)           // do a recursive call with d = b and n + 1
)(b)                    // initial call to g() with d = b
&& o                    // return o[]



1

APL (NARS), 52 ตัวอักษร, 104 ไบต์

r←a f w;i
r←,i←1⋄→3
i+←1⋄→3×⍳∨/a≥πi⋄r←r,i
→2×⍳w>↑⍴r

ด้านบนดูเหมือนว่าแถวหลังจาก 'r ← afw; i' มีชื่อ 1 2 3 ทดสอบ:

  o←⎕fmt
  o 1 h 2
┌2───┐
│ 1 2│
└~───┘
  o 1 h 1
┌1─┐
│ 1│
└~─┘
  o 10 h 14
┌14───────────────────────────────────────┐
│ 1 11 13 17 19 23 29 31 37 41 43 47 53 59│
└~────────────────────────────────────────┘

1

05AB1E , 9 ไบต์

∞ʒÒ¹›P}²£

ลองออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมดตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

          # Infinite list starting at 1: [1,...]
 ʒ    }    # Filter it by:
  Ò        #  Get all prime factors of the current number
   ¹›      #  Check for each if they are larger than the first input
     P     #  And check if it's truthy for all of them
       ²£  # Leave only the leading amount of items equal to the second input
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.