คำนวณจำนวนตัวหารรุ่น


11

แรงบันดาลใจจากคำถามนี้เกี่ยวกับคณิตศาสตร์

ให้ตัวประกอบที่สำคัญของตัวเลขnจะแสดงเป็นP (n) = 2 x 3 x 5 x ...
(ใช้xเป็นสัญลักษณ์การคูณ.)
แล้วจำนวนหารของnสามารถแสดงเป็นD (n) = (A + 1) x (B + 1) x (C + 1) ...
ดังนั้นเราจึงสามารถกล่าวว่าจำนวนของตัวหารของ2nเป็นD (2n) = (A + 2) x (B + 1) x (C + 1) ... ,
จำนวนหารของ3nเป็นD (3n ) = (A + 1) x (B + 2) x (C + 1) ... ,
และอื่น ๆ

ท้าทาย:

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้คุณสมบัติเหล่านี้ในการคำนวณnรับอินพุตตัวหารบางตัว

การป้อนข้อมูล:

ชุดจำนวนเต็มลองเรียกมันว่าw, x, y, zโดยมีคำจำกัดความต่อไปนี้ทั้งหมด:

  • อินพุตทั้งหมดมากกว่า 1 - w, x, y, z > 1
  • xและzชัดเจน -x<>z
  • xและZเป็นนายก - P(x)=x, D(x)=2และP(z)=z,D(z)=2
  • wคือจำนวนตัวหารของxn -D(xn)=w
  • yคือจำนวนตัวหารของzn -D(zn)=y

(28, 2, 30, 3)สำหรับปัญหาที่ได้รับในคำถามที่เชื่อมโยงตัวอย่างการป้อนข้อมูลที่อาจจะ การแปลนี้ไปD(2n)=28และมีD(3n)=30n=864

เอาท์พุท:

เลขจำนวนเต็มเดี่ยว, n , ซึ่งเป็นไปตามข้อกำหนดข้างต้นและข้อ จำกัด การป้อนข้อมูล หากตัวเลขหลายตัวตรงกับคำจำกัดความ หากไม่มีจำนวนเต็มเช่นนั้นให้ส่งออกค่าเท็จ

ตัวอย่าง:

(w, x, y, z) => output

(28, 2, 30, 3) => 864
(4, 2, 4, 5) => 3
(12, 5, 12, 23) => 12
(14, 3, 20, 7) => 0 (or some other falsey value)
(45, 13, 60, 11) => 1872
(45, 29, 60, 53) => 4176

กฎ:

  • กฎของรหัสกอล์ฟมาตรฐานและข้อ จำกัด ทางหนีใช้
  • ใช้กฎอินพุต / เอาต์พุตมาตรฐาน
  • หมายเลขที่ป้อนสามารถอยู่ในลำดับใดก็ได้ - โปรดระบุคำตอบที่คุณใช้
  • หมายเลขอินพุตสามารถอยู่ในรูปแบบที่เหมาะสม: คั่นด้วยช่องว่าง, อาร์เรย์, ฟังก์ชั่นที่แยกต่างหากหรืออาร์กิวเมนต์บรรทัดคำสั่ง ฯลฯ - ตัวเลือกของคุณ
  • ในทำนองเดียวกันถ้าเอาท์พุทไปยัง STDOUT, ช่องว่างโดยรอบ, ขึ้นบรรทัดใหม่, ฯลฯ เป็นตัวเลือกทั้งหมด
  • การแยกวิเคราะห์อินพุตและการจัดรูปแบบผลลัพธ์ไม่ใช่คุณสมบัติที่น่าสนใจของความท้าทายนี้
  • ในความสนใจของความซับซ้อนที่มีสติและล้นจำนวนเต็มจำนวนความท้าทายที่nจะมีข้อ จำกัด เช่น1 < n < 100000- คุณไม่ต้องกังวลเกี่ยวกับคำตอบที่เป็นไปได้นอกช่วงนี้

ที่เกี่ยวข้อง


ดังนั้นหากทางออกที่เล็กที่สุดมีขนาดใหญ่กว่า 100,000 ฉันสามารถเลือกคืนโซลูชันหรือศูนย์ได้หรือไม่?
Dennis

@Dennis ถ้ามันทำให้โค้ดของคุณสั้นลง อาจเป็นที่ยอมรับได้
AdmBorkBork

คำตอบ:


3

เยลลี่ , 17 16 ไบต์

×€ȷ5R¤ÆDL€€Z=Ḅi3

นี่คือวิธีการแก้ปัญหากำลังดุร้ายที่พยายามค่าที่เป็นไปได้ทั้งหมดถึง 100,000 ลองออนไลน์!

รุ่นที่ไม่ใช่การแข่งขัน

รุ่นล่าสุดของเจลลี่มีแก้ไขข้อผิดพลาดที่ช่วยให้การกอล์ฟลงรหัสข้างต้นเพื่อไบต์ 15

ȷ5R×€³ÆDL€€=Ḅi3

ลองออนไลน์!

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

×€ȷ5R¤ÆDL€€Z=Ḅi3  Main link. Left input: x,z. Right input: w,y

     ¤            Combine the two atoms to the left into a niladic chain.
  ȷ5              Yield 100,000 (1e5).
    R             Apply range. Yields [1, ..., 100,000].
x€                Multiply each r in the range by x and z.
                  This yields [[x, ..., 100,000x], [z, ..., 100,000z]].
      ÆD          Compute the divisors of each resulting integer.
        L€€       Apply length to each list of divisors.
                  This counts the divisors of each integer in the 2D array.
           Z      Zip; group the divisors of kx and kz in pairs.
            =     Compare each [divisors(kx), divisors(kz)] with [w, y].
                  This yields a pair of Booleans.
             Ḅ    Convert each Boolean pair from binary to integer.
              i3  Find the first index of 3. Yields 0 for not found.

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