ตัวประกอบบางส่วนของจำนวนเต็มบวก


23

คอลเลกชันของจำนวนเต็มบวกd_1 d_2 ... d_kคือการแยกตัวประกอบของจำนวนเต็มบวกnถ้า

d_1 * d_2 * ... * d_k = n

เลขจำนวนเต็มบวกแต่ละตัวมีการแยกตัวประกอบเฉพาะที่สำคัญแต่โดยทั่วไปแล้วพวกมันยังมีตัวประกอบที่ซึ่งคำบางคำประกอบกัน เช่น

12 = 6 * 2 = 4 * 3 = 3 * 2 * 2

เขียนโปรแกรมฟังก์ชั่นคำกริยาหรือสิ่งที่คล้ายกันซึ่งรับอินพุตเป็นจำนวนเต็มบวกเดียวและส่งคืนหรือพิมพ์รายการทั้งหมดของตัวประกอบที่แตกต่างกัน ตัวประกอบอาจถูกสร้างขึ้นในลำดับใด ๆ และเงื่อนไขอาจอยู่ในลำดับใดก็ได้ แต่ไม่ควรมีการเรียงสับเปลี่ยนกัน Factorisations อาจยังไม่รวม1กับสองข้อยกเว้น: สำหรับการป้อนข้อมูลnที่คุณอาจจะให้ factorisation n*1แทนn; และสำหรับการป้อนข้อมูล1คุณอาจให้การแยกตัวประกอบ1แทนรายการว่างเปล่า

คุณอาจคิดว่าอินพุตจะอยู่ในช่วงของจำนวนเต็ม 32- บิตที่ลงชื่อแล้ว ถ้าผลการเป็นสตริงควรจะมีความแตกต่างที่ชัดเจนระหว่างการปักปันเขตของตัวเลขภายใน factorisation และการปักปันเขตของ factorisations ที่ แต่ก็ไม่จำเป็น (ตัวอย่าง) *สำหรับปัจจัยที่จะเข้าร่วมกับ

รหัสของคุณควรสามารถจัดการอินพุตที่ถูกต้องภายใน 10 นาทีบนเครื่องเดสก์ท็อปที่เหมาะสม

ตัวอย่าง

1                  [[]]
                or [[1]]
                or [[1 1]]

7                  [[7]]
                or [[7 1]]
                or [[1 7]]

12                 [[12] [6 2] [4 3] [2 3 2]]
                or variants

16                 [[2 2 2 2] [2 2 4] [2 8] [4 4] [16]]
                or variants

901800900          a list of 198091 factorisations

1338557220         a list of 246218 factorisations

คุณสามารถโพสต์รายการตัวประกอบของ901800900และที่1338557220อื่นที่เราสามารถตรวจสอบได้หรือไม่? รหัสของฉันให้ฉัน 2048 และ 1024 factorizations สำหรับตัวเลขเหล่านั้นตามลำดับและฉันไม่แน่ใจว่าทำไม
Sherlock9

@ Sherlock9 จะทำเช่นนั้นเมื่อฉันกลับถึงบ้าน สิ่งที่ฉันสามารถทำอะไรกับเครื่องกำเนิดไฟฟ้าออนไลน์คือเพื่อให้คุณเอาท์พุทที่ถูกต้องสำหรับ 5336100
Peter Taylor

3
สิ่งนี้ทำให้ฉันนึกถึงความท้าทายของ ProjectEuler (โชคไม่ดีที่ฉันจำไม่ได้) แต่ที่นั่นคุณต้องนับจำนวนแฟคทอเรียลแทนการแสดงรายการ
ข้อบกพร่อง

OEIS ที่เกี่ยวข้อง: A001055
Sherlock9

คำตอบ:


12

Haskell, 56 ไบต์

_!1=[[]]
i!n=[j:f|j<-[i..n],mod n j<1,f<-j!div n j]
(2!)

(2!)(1338557220::Int)ghc -O3พิมพ์ในห้านาทีแล็ปท็อปของฉันเมื่อรวบรวมกับ

Haskell ขนาด 62 ไบต์ แต่เร็วกว่ามาก

i!n|i*i>n=[[n]]|0<1=[i:f|mod n i<1,f<-i!div n i]++(i+1)!n
(2!)

(2!)(1338557220::Int)ghc -O3พิมพ์ในไตรมาสที่สองของแล็ปท็อปของฉันเมื่อรวบรวมกับ


ฉันจะทดสอบสิ่งนี้ได้อย่างไร ghcให้ฉันParse error: naked expression at top levelและghciมอบให้ฉันparse error on input `='
Peter Taylor

@PeterTaylor เปลี่ยนฟังก์ชั่น(2!)กับโปรแกรมmain = print ((2!) (1338557220::Int)), รวบรวมด้วยและวิ่งด้วยghc -O3 factor.hs ./factor
Anders Kaseorg

7

Pyth, 29 ไบต์

Msam+Ldgd/Hdf!%HT>S@H2tG]]Hg2

M                                def g(G, H):
                   @H2             square root of H
                  S                1-indexed range up to floor
                 >    tG           all but first G − 1 elements
            f                      filter for elements T such that:
              %HT                    H mod T
             !                       is false (0)
   m                               map for elements d:
       gd/Hd                         g(d, H/d)
    +Ld                              prepend d to each element
  a                     ]]H        append [[H]]
 s                                 concatenate
                           g2Q   print g(2, input)

ลองออนไลน์

ทำงานในยี่สิบวินาทีสำหรับ1338557220แล็ปท็อปของฉัน


@PeterTaylor วิธีปกติ: pyth factor.pyth(หรือpyth -c 'Msam+Ldgd/Hdf!%HT>S@H2tG]]Hg2') ให้บริการ16ใน stdin ตรวจสอบให้แน่ใจว่าคุณกำลังใช้ Pyth เวอร์ชันปัจจุบัน Qเพิ่มนัยในเดือนมีนาคม ฉันไม่สามารถจินตนาการได้ว่าคุณจะได้รับการหารด้วยศูนย์ได้อย่างไร
Anders Kaseorg

Arrrrgh ฉันใช้"แทน'และทุบตีขยาย!%ไปสู่สิ่งอื่น
Peter Taylor

6

Python , 252 313 312 311 145 141 137 135 103 84 83 ไบต์

นี้ส่วนใหญ่จะขึ้นอยู่กับเด Kaseorg คำตอบของ คำแนะนำการเล่นกอล์ฟใด ๆ ยินดีต้อนรับ ลองออนไลน์!

แก้ไข: 19 ไบต์ golfed ขอบคุณ Dennis แก้ไขการพิมพ์ผิดในรหัสและเพิ่มลิงค์ TIO

g=lambda n,m=2:[[n]]+[j+[d]for d in range(m,int(n**.5)+1)if n%d<1for j in g(n/d,d)]

Ungolfed:

def g(n, m=2):
    a = [[n]]
    s = int(n**.5) + 1
    for d in range(m, s):
        if n%d == 0:
            for j in g(n/d, d):
                a.append([d]+j)
    return a

1
**.5กำจัดการนำเข้า
Dennis

4

JavaScript (ES6), 83 ไบต์

f=(n,a=[],m=2,i=m)=>{for(;i*i<=n;i++)n%i<1&&f(n/i,[...a,i],i);console.log(...a,n)}

ยืมเพียงกลอุบายที่รากที่สองของ @ AndersKaseorg เท่านั้นเพราะมันช่วยฉันโดยรวมแล้วไบต์ พิมพ์1สำหรับอินพุต1มิฉะนั้นจะไม่พิมพ์1s


1

ทับทิม 1.9+, 87 89 87 ไบต์

คำตอบนี้จะขึ้นอยู่กับเด Kaseorg คำตอบของ รหัสนี้ใช้งานได้เฉพาะกับรุ่นหลังจาก Ruby 1.9 เท่านั้นเนื่องจาก lambdas ของ stabby ->ถูกนำมาใช้ใน 1.9 เท่านั้น คำแนะนำการเล่นกอล์ฟใด ๆ ยินดีต้อนรับ

g=->n,m=2{(m..Math.sqrt(n)).select{|i|n%i<1}.flat_map{|d|g[n/d,d].map{|j|[d]+j}}+[[n]]}

Ungolfed:

def g(n, m=2)
  a = [[n]]
  s = (m..Math.sqrt(n))
  t = s.select{|i|n%i<1}
  t.each do |d|
    g[n/d,d].each do |j|
      a.push([d]+j)
    end
  end
  return a
end

สิ่งนี้จำเป็นต้องใช้ Ruby รุ่นใดรุ่นหนึ่งหรือไม่ ด้วย 1.8.7 ฉันได้รับการร้องเรียนเกี่ยวกับg[n/d,d]:wrong number of arguments (0 for 1)
Peter Taylor

เห็นได้ชัดว่า lambdas stabby ->ถูกนำมาใช้ใน Ruby 1.9 ฉันจะแก้ไขคำตอบเพื่อแสดงหมายเลขเวอร์ชันที่ต้องการ
Sherlock9

โอเคขอบคุณ. g[n/d,d]ฉันยังคงอยากรู้เกี่ยวกับ g(n/d,d)เข้ากันได้มากกว่าย้อนหลัง
Peter Taylor

1
อาf[n]จำเป็นต้องเรียก lambdas stabby และ Ruby lambdas โดยทั่วไป f(n)และf nสายต้องและdef endข้อมูลเพิ่มเติมที่นี่และที่นี่
Sherlock9

1

J, 52 ไบต์

[:~.q:<@/:~@(*//.)"$~#@q:_&(;@]<@(,~"{~0,#\@~.)"1)}:

ไม่มีประสิทธิภาพเท่าที่ควรเนื่องจากอาจมีการทำซ้ำบางอย่างและต้องผ่านขั้นตอนสุดท้ายหลังจากคัดแยกแต่ละตัวประกอบแล้วยกเลิกการทำซ้ำ

ลองออนไลน์! (แต่พยายามรักษาค่าอินพุตให้เล็ก)

บนเดสก์ท็อปของฉันการกำหนดเวลาเป็น

   f =: [:~.q:<@/:~@(*//.)"$~#@q:_&(;@]<@(,~"{~0,#\@~.)"1)}:
   timex 'r =: f 1338557220'
3.14172
   # r
246218
   timex 'r =: f 901800900'
16.3849
   # r
198091

คำอธิบาย

วิธีนี้ต้องอาศัยการสร้างพาร์ทิชันชุดทั้งหมดสำหรับปัจจัยสำคัญของการป้อนข้อมูลจำนวนเต็มn ประสิทธิภาพที่ดีที่สุดคือเมื่อnไม่มีสี่เหลี่ยมจัตุรัสมิฉะนั้นจะทำการสร้างข้อมูลจำลองที่ซ้ำกัน

[:~.q:<@/:~@(*//.)"$~#@q:_&(;@]<@(,~"{~0,#\@~.)"1)}:  Input: integer n
                                                  }:  Curtail, forms an empty array
                       q:                             Prime factorization
                     #@                               Length, C = count prime factors
                         _&(                     )    Repeat that many times on x = []
                                 (            )"1       For each row
                                            ~.            Unique
                                         #\@              Enumerate starting at 1
                                       0,                 Prepend 0
                                  ,~"{~                   Append each of those to a
                                                          copy of the row
                               <@                         Box it
                            ;&]                         Set x as the raze of those boxes
                                                      These are now the restricted growth
                                                      strings of order C
    q:                                                Prime factorization
            (    )"$~                                 For each RGS
               /.                                       Partition it
             */                                         Get the product of each block
        /:~@                                            Sort it
      <@                                                Box it
[:~.                                                  Deduplicate
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.