เกมตัวประกอบ


13

อินพุต

จำนวนเต็มเดียว{15}1x1015

เอาท์พุต

จำนวนสูงสุดของจำนวนเต็มบวกที่แตกต่างกันที่มีสินค้าxx

ตัวอย่าง

อินพุต: 1099511627776 เอาต์พุต: 9. หนึ่งในปัจจัยที่เหมาะสมที่สุดที่เป็นไปได้คือ: (1, 2, 4, 8, 16, 32, 64, 128, 4096)

อินพุต: 127381. เอาท์พุท 4. หนึ่งในปัจจัยที่เหมาะสมที่สุดที่เป็นไปได้คือ: (1, 17, 59, 127)

เกี่ยวข้องกับคำถามเก่านี้


9
คุณสามารถเพิ่มกรณีทดสอบอีกสองสามข้อได้ไหม (ขนาดที่เหมาะสมโดยเฉพาะอย่างยิ่ง)
Arnauld

8
ให้ความคิดเห็นของคุณเกี่ยวกับคำตอบส่วนใหญ่: หากคุณกำลังมองหารหัสที่มีประสิทธิภาพแทนสิ่งนี้ไม่ควรติดแท็กเป็นcode-golfอย่างแน่นอน คุณอาจจะต้องพิจารณาอย่างใดอย่างหนึ่งfastest-codeหรือfastest-algorithmสำหรับความท้าทายที่จะเกิดขึ้น หากคุณต้องการคำตอบทั้งหมดสำหรับการทำงานในระยะเวลาที่ จำกัด ภายในช่วงที่กำหนดควรได้รับการกล่าวถึงอย่างชัดเจน (และฉันอยากจะแนะนำช่วงที่เล็กลงเพื่อไม่ให้ขัดแย้งกับมันcode-golfทั้งหมด)
Arnauld

@Annauld ไม่ฉันระมัดระวังที่จะทำให้มันเป็นรหัสกอล์ฟและไม่มีใครตัดสินได้ มันจะเจ๋งถ้ารหัสสามารถเรียกใช้สำหรับช่วงอินพุตที่ระบุ
Anush

5
เธซเธฑ XNOR: หากยังไม่ได้รับคำสั่งคำตอบจะไม่ทำมัน
Arnauld

1
สำหรับx=1, 2, ...ฉันได้รับf(x)=1, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, 2, 3, 3, 3, 2, 4, 2, 3, 3, 3, 2, 4, 2, 3, 3, 3, 3, 4, 2, 3ซึ่งฉันไม่พบใน OEIS xมันก็เพียงพอที่ชัดเจนว่าบันทึกจะปรากฏหมายเลขแฟกทอ ตัวอย่างที่มีขนาดเล็กxดังกล่าวว่าจะเป็นf(x)=13 13!ฉันเดาว่าfขึ้นอยู่กับเลขชี้กำลังของการแยกตัวประกอบเฉพาะ ดังนั้นเพื่อหาสิ่งที่เราอาจจะลดความซับซ้อนของการf(13^4*19^7*29^2) f(2^7*3^4*5^2)
Jeppe Stig Nielsen

คำตอบ:


5

ภาษา Wolfram (Mathematica) , 52 ไบต์

Max[Length/@Cases[Subsets@Divisors@#,{a__}/;1a==#]]&

ลองออนไลน์!

บันทึกขนาด 4 ไบต์ด้วย @attinat

นี่เป็นรุ่น153 ไบต์ที่คำนวณ1099511627776และ10^15

Max[Length/@Table[s=RandomSample@Flatten[Table@@@FactorInteger[#]];Last@Select[Times@@@TakeList[s,#]&/@IntegerPartitions@Length@s,DuplicateFreeQ],5!]]+1&      

ลองออนไลน์!

ผลลัพธ์ที่ได้10^15คือ12

{1, 2, 4, 5, 10, 16, 25, 40, 50, 100, 125, 250}


เกิดปัญหากับ 1099511627776
Anush

7
@Anush มันไม่ได้ผิดพลาด แค่ต้องการความจำ คุณไม่ได้พูดอะไรเกี่ยวกับข้อ จำกัด ของหน่วยความจำ นี่คือรหัสกอล์ฟ
J42161217

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

6
@Anush นี่คือรหัสกอล์ฟ ไม่ใช่คำตอบที่ดี โปรดระบุเกณฑ์ของคุณ คำตอบนั้นถูกต้องหรือไม่ ฉันคิดว่าปัญหานี่คือคำถาม ... บางทีคุณควรเปลี่ยนเป็น "อัลกอริทึมที่เพียงพอ"
J42161217

3
@Anush ฉันทำการแก้ไขในคำตอบของฉันและเพิ่มอีกหนึ่งเวอร์ชันซึ่งรวดเร็วและมีประสิทธิภาพจริงๆในกรณีที่คุณต้องการตรวจสอบ
J42161217


3

05AB1E , 9 ไบต์

ไม่มีประสิทธิภาพมาก จะหมดเวลากับ TIO สำหรับตัวเลขที่มีตัวหารจำนวนมาก

ÑæʒPQ}€gZ

ลองออนไลน์!

คำอธิบาย

Ñ          # push a list of divisors of the input
 æ         # push the powerset of that list
  ʒPQ}     # filter, keep only the lists whose product is the input
      €g   # get the length of each
        Z  # take the maximum

รหัส TIO ของคุณดูเหมือนจะเอาท์พุท 3 แทนที่จะเป็น 9
Anush

@Anush: มันเป็นตัวเลขที่แตกต่างจากตัวอย่างของคุณ (นับตั้งแต่นั้นออกมาหนึ่งครั้งเนื่องจากปัจจัยหลายอย่าง) ฉันอาจใช้ตัวอย่างที่ชัดเจนกว่านี้
Emigna

€gZมีประสิทธิภาพมากกว่าบิตéθgเดียวกันเล็กน้อย
Grimmy

@Grimy: จริง มันจะไม่แตกต่างกันมากนักเพราะมันเป็นตัวกรองที่เป็นตัวร้ายตัวใหญ่ที่นี่ แต่มันก็ไม่ได้เจ็บที่จะมีประสิทธิภาพมากขึ้น :)
38411

2

Perl 6 , 38 ไบต์

{$!=$_;+grep {$!%%$_&&($!/=$_)},1..$_}

ลองออนไลน์!

ใช้วิธีการโลภเพื่อเลือกตัวหาร


ไม่สิ้นสุดด้วย 1099511627776
Anush

6
@Anush ดีก็สิ้นสุดลงในที่สุด โดยทั่วไปคำตอบนั้นถูกต้องหากอัลกอริทึมของโปรแกรมจะทำงานกับอินพุตใด ๆ หากได้รับหน่วยความจำและเวลาเท่าที่ต้องการ เนื่องจากนี่คือรหัสกอล์ฟฉันจึงปรับให้เหมาะกับความยาวของรหัสไม่ใช่ความซับซ้อนของอัลกอริทึม
Jo King

2

Javascript (ES6), 39 ไบต์

f=(n,i=0)=>n%++i?n>i&&f(n,i):1+f(n/i,i)

อาจมีไม่กี่ไบต์ที่สามารถบันทึกได้ที่นี่และที่นั่น เพียงแค่ใช้อัลกอริทึมโลภสำหรับปัจจัยต่างๆ


2

เยลลี่ขนาด 9 ไบต์

ŒPP=³ƊƇẈṀ

ลองออนไลน์!

-1 ไบต์ขอบคุณใครบางคน

-2 ไบต์ขอบคุณ ErikTheOutgolfer


ขณะที่การเตรียมการป้อนข้อมูลสำหรับ superseeker OEIS ผมสร้าง 11 ไบต์โปรแกรม Jelly แนวโน้ม golfable (ที่ใช้วิธีการที่แตกต่างกัน) และฉันไม่น่าจะโพสต์คำตอบ Jelly ดังนั้นฉันจะแกล้งฉันแข็งแรงเล่นกอล์ฟไบต์จากการแก้ปัญหาของคุณ: ÆE×8‘½’:2S‘(มัน ทำงานร่วมกับพลังของส่วน "สูตร" ของ OEIS สำหรับ A003056) คำเตือน: มันอาจจะผิด แต่มันใช้งานได้ในกรณีทดสอบ
สรรพนามของฉันคือ monicareinstate

ดูเหมือนว่าจะไม่ยุติกับ 1099511627776
Anush

@someone ใช้ไม่ได้กับ 36 แต่ขอบคุณ
HyperNeutrino

@Anush ใช่มันช้ามากเพราะฉันเขียนโค้ดกอล์ฟไม่เหมาะสำหรับประสิทธิภาพ
HyperNeutrino

1
ÆDx21


2

Brachylogขนาด 8 ไบต์

f;?⟨⊇×⟩l

ลองออนไลน์!

(วิธีการที่ไร้เดียงสา{~×≠l}ᶠ⌉สร้างจำนวนอนันต์ที่มี 1s พิเศษก่อนที่จะกำจัดพวกเขาด้วยและทำให้ล้มเหลวในการยุติจริง ๆ แล้วมันไม่ใช่ปัญหา แต่เนื่องจากเป็นจำนวนไบต์เดียวกัน!)

รับอินพุตผ่านตัวแปรอินพุตและเอาต์พุตผ่านตัวแปรเอาต์พุต ส่วนหัวบน TIO มีสำเนาของรหัสส่วนใหญ่เพื่อแสดงให้คุณเห็นว่ารายการปัจจัยคืออะไร แต่สิ่งนี้ทำงานได้อย่างสมบูรณ์แบบหากไม่มีมัน เนื่องจากให้รายการย่อยที่ใหญ่กว่าก่อนส่วนคำกริยานี้ทำสิ่งเดียวกันกับคำตอบอื่น ๆ ส่วนใหญ่ แต่ไม่มีการสร้างและกรอง powerset ที่สมบูรณ์ของปัจจัยโดยชัดเจนขอบคุณการย้อนรอย

            The output
       l    is the length of
    ⊇       a sublist (the largest satisfying these constraints)
f           of the factors of
            the input
 ; ⟨  ⟩     which
     ×      with its elements multiplied together
  ?         is the input.


1

Gaiaขนาด10 9 ไบต์

Π=
dz↑⁇(l

ลองออนไลน์!

ทำตาม "อัลกอริทึม" แบบเดียวกับที่เห็นที่อื่น - กรองชุดตัวหารสำหรับส่วนที่ยาวที่สุดกับผลิตภัณฑ์เท่ากับจำนวนและส่งคืนความยาว

	| helper function
Π=	| is prod(list)==n (implicit)?
	|
	| main function; implicitly takes n
dz	| divisor powerset (in decreasing order of size)
  ↑⁇	| filter by helper function
    (l	| take the first element and take the length (implicitly output)

0

หอย 15 ไบต์

p}_`nq#:;qQ@s~Q

ลิงค์ TIO เร็ว ๆ นี้ (เมื่อเดนนิสดึง)

โดยทั่วไปจะเป็นพอร์ตของโซลูชัน 05AB1E ของ @ Emigna

คำอธิบาย

                - Implicit Q = first input
p               - Print...
 }              - The last element of...
  _             - Sorted...
   `nq          - Lengths of... (map q => q.len)
           @s   - Items in powerset of
             ~Q - Proper divisors of Q
      #         - Where... (filter)
        ;q      - Product of subset
       :        - Equals...
          Q     - Q

0

C # (Visual C # Interactive Compiler) , 54 ไบต์

int f(int n,int i=0)=>n%++i<1?1+f(n/i,i):n>i?f(n,i):0;

ใช้วิธีการเดียวกันกับคำตอบของ @ vrugtehagel และ @ JoKing

ลองออนไลน์!


สมมติว่าฉันใช้ตรรกะของคุณอย่างถูกต้องเป็นโซลูชั่นขนาด 53 ไบต์ (ที่ฉันไม่สามารถกำจัดคำหลัก "ส่งคืน"): ลองออนไลน์!
สรรพนามของฉันคือ monicareinstate

1
@someone ขอบคุณ แต่ตาม meta, ฟังก์ชั่นได้จะต้องนำมาใช้ใหม่ นอกจากนี้ฉันไม่ทราบว่าเป็นที่ยอมรับว่ามีการประกาศภายนอกฟังก์ชั่นทิ้งเครื่องหมายอัฒภาคต่อท้ายอาจทำให้เมตาโพสต์ในนั้น
ศูนย์รวมแห่งความไม่รู้

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