การแยกตัวประกอบ 2 ปัจจัย


14

รับจำนวนธรรมชาติเขียนโปรแกรมหรือฟังก์ชั่นที่จะได้รับรายชื่อทั้งหมดที่เป็นไปคูณสองปัจจัยที่สามารถนำมาใช้เพื่อให้บรรลุn nเพื่อทำความเข้าใจสิ่งที่จะแกล้งทำเป็นว่าคุณสามารถไปที่http://factornumber.com/?page=16777216เพื่อดูว่าเมื่อnเป็น16777216ที่เราได้รับรายการต่อไปนี้:

   2 × 8388608  
   4 × 4194304  
   8 × 2097152  
  16 × 1048576  
  32 ×  524288  
  64 ×  262144  
 128 ×  131072  
 256 ×   65536  
 512 ×   32768  
1024 ×   16384
2048 ×    8192
4096 ×    4096

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

อย่าพิมพ์การคูณด้วย 1 รายการหรือทำซ้ำรายการด้วยปัจจัยแรกที่ส่งโดยสองเนื่องจากไม่มีประโยชน์

ไม่มีผู้ชนะ; มันจะเป็นรหัสพื้นฐานของภาษากอล์ฟ


2
คุณสามารถเพิ่มกรณีทดสอบขนาดเล็กลงได้30ไหม?
caird coinheringaahing

1
@cairdcoinheringaahing คุณสามารถใช้factornumber.comเพื่อสร้างกรณีทดสอบเพิ่มเติม
Jonathan Frech

1
ฉันเคยเห็นการแข่งขัน "ต่อภาษา" ครั้งนี้ ประเด็นคืออะไร? Qs ส่วนใหญ่ไม่ได้รับมากกว่า 1 หรือ 2 ตามภาษาและคุณยังสามารถเลือกเพียงหนึ่ง A ถูกต้อง
fede s

5
@fedes เป็นเพราะไม่มีจุดในการเปรียบเทียบระหว่างภาษา (เช่น Java กับ Jelly)
สิ้นเชิงมนุษย์

1
@tallyallyhuman ใช่ฉันรู้ คำตอบของฉันส่วนใหญ่อยู่ในปัจจัยหรือแม้แต่สมอลล์ทอล์ค ไม่มีโอกาสเทียบกับภาษากอล์ฟ อาจจะมีวิธีการจัดอันดับภาษาบางอย่างจากความฟุ้งซ่านและ
บ่อน้ำ

คำตอบ:


6

Java (OpenJDK 8) , 81 66 65 ไบต์

  • -15 ไบต์ขอบคุณ Olivier Grégoire
  • -1 Byte: ->++j<=i/jj++<i/j
i->{for(int j=1;j++<i/j;)if(i%j<1)System.out.println(j+" "+i/j);}

ลองออนไลน์!


อันเก่า (สำหรับการอ้างอิง)

Java (OpenJDK 8) , 126 ไบต์

i->{java.util.stream.IntStream.range(2,i).filter(d->d<=i/d&&i%d==0).forEach(e->System.out.println(""+e+"x"+i/e));return null;}

ลองออนไลน์!

การส่ง codegolf ครั้งแรกและการใช้แลมบ์ดาครั้งแรก ในอนาคตตัวเองโปรดยกโทษให้ฉันสำหรับรหัส


1
รายการแรกที่ดี! ยินดีต้อนรับสู่ PPCG! นี่มันลงไปถึง66 ไบต์โดยลบฟุ่มเฟือยทั้งหมด: ฉันไม่สามารถตีกอล์ฟอัลกอริทึมของคุณได้
Olivier Grégoire



5

Python 2 , 51 ไบต์

f=lambda n,k=2:n/k/k*[f]and[(k,n/k)][n%k:]+f(n,k+1)

ลองออนไลน์!


51 ไบต์ (ขอบคุณ Luis Mendo สำหรับไบต์)

lambda n:[(n/k,k)for k in range(1,n)if(k*k<=n)>n%k]

ลองออนไลน์!


51 ไบต์

lambda n:[(n/k,k)for k in range(1,n)if n/k/k>n%k*n]

ลองออนไลน์!


[f]ผมชอบการใช้งานของ
Jonathan Frech

1
คุณสามารถบันทึก 1 ไบต์ในรุ่นที่สองด้วยlambda n:[(n/k,k)for k in range(1,n)if(k*k<=n)>n%k]
Luis Mendo

MemoryError ในทุกวิธีสำหรับ 1512518520
sergiol




3

Brachylogขนาด 8 ไบต์

{~×≜Ċo}ᵘ

ลองออนไลน์!

คำอธิบาย

{~×≜Ċo}ᵘ
{     }ᵘ  List the unique outputs of this predicate.
 ~×       Pick a list of integers whose product is the input.
   ≜      Force concrete values for its elements.
    Ċ     Force its length to be 2.
     o    Sort it and output the result.

ส่วนหนึ่งไม่รวม 1s ในการส่งออกของตนเพื่อให้สำหรับการป้อนข้อมูลNมันจะช่วยให้[N]แทน[1, N]Ċซึ่งถูกคัดมาในภายหลังโดย ฉันไม่แน่ใจว่าทำไมถึงต้องการ ...


1
เป็นสิ่งจำเป็นเพราะมิฉะนั้นจะไม่มีจุดทางเลือกสำหรับ: ความยาว 2 รายการที่มีสินค้าเข้าเป็นคำตอบเดียวที่ถ้าคุณไม่จริงขอค่าของรายการ
Fatalize

2

Japt , 9 ไบต์

â¬Å£[XZo]

ทดสอบออนไลน์! ส่งคืนอาร์เรย์ของอาร์เรย์โดยมีค่า null บางค่าในตอนท้าย -Rเพิ่มค่าสถานะเพื่อแสดงผลลัพธ์ที่ชัดเจนยิ่งขึ้น


1
ดังนั้นฉันคิดว่า `-R 'ควรได้รับการพิจารณาสำหรับการนับไบต์ ...
sergiol

3
@sergiol ไม่ในกรณีนี้มันเป็นเพียงการฟอร์แมตเอาต์พุตเพื่อให้อ่านง่ายขึ้น
Shaggy

วิธีการแก้ปัญหาที่ฉันมียกเว้นว่าฉันกรองnullออกในตอนท้าย
Shaggy

2

เยลลี่ 8 ไบต์

½ḊpP⁼¥Ðf

ลิงก์ monadic ที่ใช้ตัวเลขและส่งคืนรายการของรายการ (คู่) ของตัวเลข

ลองออนไลน์! (หมดเวลากับ TIO สำหรับ16777216ตัวอย่างเพราะมันจะสร้างรายการ 68.7 พันล้านคู่และกรองลงไปยังผู้ที่มีผลิตภัณฑ์ที่ถูกต้อง!)

อย่างไร?

½ḊpP⁼¥Ðf - Link: number, n     e.g. 144
½        - square root of n          12
 Ḋ       - dequeue*                 [2,3,4,5,6,7,8,9,10,11,12]
  p      - Cartesian product**      [[2,1],[2,2],...[2,144],[3,1],...,[3,144],...,[12,144]
      Ðf - filter keep if:
     ¥   -   last two links as a dyad (n is on the right):
   P     -     product
    ⁼    -     equals
         -                          [[2,72],[3,48],[4,36],[6,24],[8,18],[9,16],[12,12]]

* , dequeue, โดยปริยายทำให้ช่วงของอินพุตที่เป็นตัวเลขก่อนที่จะทำการแสดง, และฟังก์ชั่นพิสัยจะทำการเพิ่มอินพุตโดยปริยายดังนั้น, ด้วย, พูด, n=24ผลลัพธ์ของ½คือ4.898...; ช่วงกลายเป็น[1,2,3,4]; และผลลัพธ์ที่ถูกตัดออกคือ[2,3,4]

** เช่นเดียวกับข้างต้นpผลิตภัณฑ์คาร์ทีเซียนทำช่วงสำหรับการป้อนตัวเลข - ที่นี่อาร์กิวเมนต์ที่ถูกต้องnจึงอาร์กิวเมนต์ที่ถูกต้องจะกลายเป็น[1,2,3,...,n]ก่อนที่ผลิตภัณฑ์คาร์ทีเซียนที่เกิดขึ้นจริง


2

Husk , 8 ไบต์

tüOSze↔Ḋ

ลองออนไลน์!

คำอธิบาย

tüOSze↔Ḋ  Implicit input, say n=30.
       Ḋ  List of divisors: [1,2,3,5,6,10,15,30]
      ↔   Reverse: [30,15,10,6,5,3,2,1]
   Sze    Zip with original: [[1,30],[2,15],[3,10],[5,6],[6,5],[10,3],[15,2],[30,1]]
 üO       Deduplicate by sort: [[1,30],[2,15],[3,10],[5,6]]
t         Drop first pair: [[2,15],[3,10],[5,6]]

2

JavaScript (ES6), 55 ไบต์

n=>eval('for(k=1,a=[];k*++k<n;n%k||a.push([k,n/k]));a')

การสาธิต

ลองออนไลน์!


เป็นฉันหรือสิ่งนี้ล้มเหลว6ใช่หรือไม่
Neil

@ Neil "เราสามารถแก้ไขได้" (ขอบคุณสำหรับการรายงาน!)
Arnauld

ฉันจะให้หมายเลขเพื่อทดสอบได้อย่างไร
sergiol


1

Python 2 , 59 ไบต์

lambda N:{(n,N/n,n)[n>N/n:][:2]for n in range(2,N)if N%n<1}

ลองออนไลน์!


tio.run/##FcnRCoMgFAbgVzk3AwVh84AQsu0RfIHqwig3YfsNk2BEz27r7oNv/ … - ข้อผิดพลาดของหน่วยความจำ?
sergiol

@sergiol ใช่ MemoryError เนื่องจาก Python พยายามประเมินrange(2,N)และเก็บไว้เป็นรายการ แต่หน่วยความจำที่จัดสรรไม่เพียงพอ เราสามารถลองแทนที่rangeด้วยxrange(ตัวสร้างช่วงของ Python 2) แม้ว่าจะเกินเวลารันไทม์สูงสุดของ TIO หนึ่งนาที บนเครื่องที่มีหน่วยความจำและเวลาเพียงพอโปรแกรมนี้ควรยุติและส่งคืนคำตอบที่ถูกต้อง
Jonathan Frech



1

PHP, 70 bytes

ในฐานะที่เป็นสตริง (70 ไบต์):

$i++;while($i++<sqrt($a=$argv[1])){echo !($a%$i)?" {$i}x".($a/$i):'';}

เป็นการถ่ายโอนข้อมูลอาร์เรย์ (71 ไบต์):

$i++;while($i++<sqrt($a=$argv[1]))!($a%$i)?$b[$i]=$a/$i:'';print_r($b);

(ฉันไม่แน่ใจว่าฉันสามารถใช้ return $ b แทน print_r ได้หรือไม่เพราะมันไม่ได้ส่งออก array อีกต่อไปมิฉะนั้นฉันสามารถบันทึก 2 ไบต์ได้ที่นี่)

อาร์เรย์ให้ผลลัพธ์ดังนี้:

Array
(
    [2] => 8388608
    [4] => 4194304
    [8] => 2097152
    [16] => 1048576

"ถ้าคุณเลือกที่จะส่งคืนรายการ / อาร์เรย์" สำหรับฉันหมายความว่าคุณสามารถพิมพ์หรือส่งคืนได้ตามที่เห็นสมควร
fede s

ในความคิดที่สองการส่งคืนควรถูกต้องสำหรับฟังก์ชั่นและการพิมพ์สำหรับโปรแกรม คุณดูเหมือนจะมีตัวอย่าง / โปรแกรมไม่ใช่ฟังก์ชั่นดังนั้นฉันจะบอกว่าในกรณีนี้คุณควรจะพิมพ์
fede s

1

เยลลี่ 12 ไบต์

ÆDµżUḣLHĊ$$Ḋ

ลองออนไลน์!

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

ÆDµżUḣLHĊ$$Ḋ - Main monadic link;
             - Argument: n (integer) e.g. 30
ÆD           - Divisors                   [1, 2, 3, 5, 6, 10, 15, 30]
    U        - Reverse                    [30, 15, 10, 6, 5, 3, 2, 1]
   ż         - Interleave                 [[1, 30], [2, 15], [3, 10], [5, 6], [6, 5], [10, 3], [15, 2], [30, 1]]
         $$  - Last 3 links as a monad
      L      -   Length                   8
       H     -   Halve                    4
        Ċ    -   Ceiling                  4
     ḣ       - Take first elements        [[1, 30], [2, 15], [3, 10], [5, 6]]
           Ḋ - Dequeue                    [[2, 15], [3, 10], [5, 6]]


1

Factor, 58

Well, there has to be some Factor in this question!

[ divisors dup reverse zip dup length 1 + 2 /i head rest ]

It's a quotation. call it with the number on the stack, leaves an assoc (an array of pairs) on the stack.

I'm never sure if all the imports count or not, as they're part of the language. This one uses:

USING: math.prime.factors sequences assocs math ;

(If they count, I should look for a longer solution with shorter imports, which is kind of silly)

As a word:

: 2-factors ( x -- a ) divisors dup reverse zip dup length 1 + 2 /i head rest ;

50 2-factors .
 --> { { 2 25 } { 5 10 } }

1

Ruby, 43 bytes

->n{(2..n**0.5).map{|x|[[x,n/x]][n%x]}-[p]}

Try it online!

How it works:

For every number up to sqrt(n), generate the pair [[x, n/x]], then take the n%xth element of this array. If n%x==0 this is [x, n/x], otherwise it's nil. when done, remove all nil from the list.



0

Husk, 14 12 bytes

tumoOSe`/⁰Ḋ⁰

Try it online!

Explanation

tum(OSe`/⁰)Ḋ⁰  -- input ⁰, eg. 30
           Ḋ⁰  -- divisors [1..⁰]: [1,2,3,5,6,10,15,30]
  m(      )    -- map the following function (example on 10):
     Se        --   create list with 10 and ..
       `/⁰     --   .. flipped division by ⁰ (30/10): [10,3]
    O          --   sort: [3,10]
               -- [[1,30],[2,15],[3,10],[5,6],[5,6],[3,10],[2,15],[1,30]]
 u             -- remove duplicates: [[1,30],[2,15],[3,10],[5,6]]
t              -- tail: [[2,15],[3,10],[5,6]]

0

APL+WIN, 32 bytes

m,[.1]n÷m←(0=m|n)/m←1↓⍳⌊(n←⎕)*.5

Explanation:

(n←⎕) Prompts for screen input

m←(0=m|n)/m←1↓⍳⌊(n←⎕)*.5 Calculates the factors dropping the first

m,[.1]n÷ Identifies the pairs and concatenates into a list.

0

Add++, 18 15 bytes

L,F@pB]dBRBcE#S

Try it online!

How it works

L,   - Create a lambda function
     - Example argument:     30
  F  - Factors;     STACK = [1 2 3 5 6 10 15]
  @  - Reverse;     STACK = [15 10 6 5 3 2 1]
  p  - Pop;         STACK = [15 10 6 5 3 2]
  B] - Wrap;        STACK = [[15 10 6 5 3 2]]
  d  - Duplicate;   STACK = [[15 10 6 5 3 2] [15 10 6 5 3 2]]
  BR - Reverse;     STACK = [[15 10 6 5 3 2] [2 3 5 6 10 15]]
  Bc - Zip;         STACK = [[15 2] [10 3] [6 5] [5 6] [3 10] [2 15]]
  E# - Sort each;   STACK = [[2 15] [3 10] [5 6] [5 6] [3 10] [2 15]]
  S  - Deduplicate; STACK = [[[2 15] [3 10] [5 6]]]



0

Julia 0.6, 41 bytes

~x=[(y,div(x,y))for y=2:x if x%y<1>y^2-x]

Try it online!

Redefines the inbuild unary operator ~ and uses an array comprehension to build the output.

  • div(x,y) is neccessary for integer division. x/y saves 5 bytes but the output is ~4=(2,2.0).
  • Julia allows chaining the comparisons, saving one byte.
  • Looping all the way to x avoids Int(floor(√x)).

0

APL NARS 99 chars

r←f w;i;h
r←⍬⋄i←1⋄→0×⍳0≠⍴⍴w⋄→0×⍳''≡0↑w⋄→0×⍳w≠⌊w⋄→0×⍳w≠+w
A:i+←1⋄→A×⍳∼0=i∣w⋄→0×⍳i>h←w÷i⋄r←r,⊂i h⋄→A

9+46+41+3=99 Test: (where not print nothing, it return something it return ⍬ the list null one has to consider as "no solution")

  f 101    

  f 1 2 3

  f '1'

  f '123'

  f 33 1.23

  f 1.23

  ⎕←⊃f 16777216      
   2 8388608
   4 4194304
   8 2097152
  16 1048576
  32  524288
  64  262144
 128  131072
 256   65536
 512   32768
1024   16384
2048    8192
4096    4096
  f 123
3 41 

0

Pyt, 67 65 bytes

←ĐðĐ0↔/⅟ƖŽĐŁ₂20`ŕ3ȘĐ05Ș↔ŕ↔Đ4Ș⇹3Ș⦋ƥ⇹⁺Ɩ3ȘĐ05Ș↔ŕ↔Đ4Ș⇹3Ș⦋ƤĐ3Ș⁺ƖĐ3Ș<łĉ

I'm pretty sure this can be golfed.

Basically, the algorithm generates a list of all of the divisors of the input (let's call it n), makes the same list, but flipped, interleaves the two (e.g., if n=24, then, at this point, it has [1,24,2,12,3,8,4,6,6,4,8,3,12,2,24,1]), and prints out the elements from index 2 until half the array length, printing each number on a new line, and with an extra new line in between every pair.

Most of the work is done in actually managing the stack.


Saved 2 bytes by using increment function.


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