ค้นหาปัจจัยย่อย


14

ลองจินตนาการว่าเรามีจำนวนเต็มบวกจำนวน จำกัด ชุดนี้สามารถแสดงเป็นเส้นของจุดที่แต่ละจำนวนเต็มปัจจุบันในชุดที่เต็มไปเช่น Scantron หรือหมัดบัตร ตัวอย่างเช่นชุด{1,3,4,6}สามารถแสดงเป็น:

*.**.*

*แสดงถึงสมาชิกของชุดของเราและ.แสดงถึงจำนวนเต็มที่ไม่ได้เป็นสมาชิกของเขาตั้ง

ชุดเหล่านี้มี "ปัจจัย" Loosely x เป็นปัจจัยของ y หาก y สามารถสร้างจากสำเนาของ x ได้ คำจำกัดความของปัจจัยของเรามีความเข้มงวดมากขึ้น

  • x เป็นปัจจัยของ y ถ้าหาก y เป็นสหภาพของจำนวนชุดที่แยกจากกันทั้งหมดนี้เป็น x ที่มีออฟเซ็ต

เราจะเรียกปัจจัยของเพราะทำค่อนข้างชัดเจนขึ้นจากสองสำเนาของใส่จนจบ*.**.**.**.*

*.**.*
------
*.*...
...*.*

ปัจจัยไม่จำเป็นต้องจบสิ้นเราก็จะบอกว่า*.*เป็นปัจจัย*.*.*.*

*.*.*.*
-------
*.*....
....*.*

ปัจจัยยังสามารถทับซ้อนกัน วิธีการ*.*นี้ยังเป็นปัจจัย****

****
----
*.*.
.*.*

อย่างไรก็ตามตัวเลขไม่สามารถครอบคลุมได้มากกว่าหนึ่งครั้ง ตัวอย่าง*.*คือไม่ได้*.*.*ปัจจัยของ


นี่คือตัวอย่างที่ซับซ้อนมากขึ้น:

 *..*.**..***.*.*

นี่*..*.*เป็นปัจจัย *..*.*คุณจะเห็นว่าด้านล่างที่ผมได้เรียงรายขึ้นสามกรณีของ

*..*.**..***.*.*
----------------
*..*.*..........
......*..*.*....
..........*..*.*

งาน

รับชุดโดยการแสดงผลลัพธ์ที่สมเหตุสมผลทุกชุดที่เป็นปัจจัยของอินพุต

คุณสามารถจัดทำดัชนีตามค่าใด ๆ (นั่นคือคุณอาจเลือกจำนวนที่น้อยที่สุดที่สามารถมีอยู่ในอินพุต) คุณอาจสมมติว่าชุดอินพุตจะมีค่าน้อยที่สุดเสมอ

นี่เป็นคำถามเกี่ยวกับการเขียนดังนั้นคุณควรตั้งเป้าหมายให้สั้นที่สุดเท่าที่จะเป็นไปได้

กรณีทดสอบ

กรณีทดสอบเหล่านี้ทำด้วยมืออาจมีข้อผิดพลาดหรือสองกรณีในกรณีที่มีขนาดใหญ่กว่า

*                -> *
*.*.*            -> *, *.*.*
*.*.*.*          -> *, *.*, *...*, *.*.*.*
******           -> *, **, *..*, ***, *.*.*, ******
*..*.**..***.*.* -> *, *..*.*, *.....*...*, *..*.**..***.*.*
*...*****.**.**  -> *, *...**.**, *.....*, *...*****.**.**

ถ้าเราใช้ชุดเป็นรายการของตัวเลข (เช่น [1,3,5,7]สำหรับ*.*.*.*) เราจะถือว่ามันเรียงได้หรือไม่?
Martin Ender

1
นี่เทียบเท่ากับการค้นหาตัวหารของพหุนามซึ่งมีค่าสัมประสิทธิ์ถูก จำกัด ที่ 0 และ 1 หรือไม่?
xnor

1
@ xnor ฉันไม่แน่ใจ ถ้า*.*.*= x+x^2+x^4แล้ว1+x+x^2= ***จะเป็นตัวหารใช่ไหม x+x^2+x^4 = (1-x+x^2)(1+x+x^2)
mbomb007

1
@JonathanAllan สำหรับตัวอย่างของคุณ*ถูกระบุว่าเป็นปัจจัยที่หมายถึงเซตเช่นเดียวกับหรือ*.*..
Martin Ender

1
@JonathanAllan มันบอกว่าเอาท์พุททุกชุดไม่ได้ส่งออกเป็นตัวแทน ASCII ทั้งหมดของชุดที่ถูกต้อง
Martin Ender

คำตอบ:


3

Mathematica, 71 68 ไบต์

#&@@@Cases[(s=Subsets)@s@#,x_/;Sort[Join@@x]==#&&Equal@@(#&@@@x-x)]&

การป้อนข้อมูลเป็น{1,3,5,7}(เรียงลำดับ) {{1, 3, 5, 7}, {1, 3}, {1, 5}, {1}}และออกเป็น ฟังก์ชั่นนี้จะส่งข้อความจำนวนมาก

นี่คือO (2 2 Nope ) (โดยที่Nคือความยาวของอินพุตและo = p = e = 1 ... ) มันสร้างชุดย่อยของชุดย่อยทั้งหมดจากนั้นเลือกชุดย่อยที่ส่งผลให้เกิดการป้อนข้อมูลเมื่อรวมเข้าด้วยกัน (ตรวจสอบให้แน่ใจว่าเรากำลังพิจารณาเฉพาะพาร์ทิชัน) และองค์ประกอบทั้งหมดจะเหมือนกันหากเราลบค่าที่น้อยที่สุดของแต่ละชุดย่อย)


2

วุ้น 12 ไบต์

;÷@DỊȦ
ÆDçÐf

การใช้อินพุทและเอาท์พุท1และ0แทนและ*.

ลองออนไลน์!

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

ÆDçÐf   Main link. Argument: n (integer with decimal digits 1 and 0)

ÆD      Compute all divisors of n.
  çÐf   Filter; call the helper link with left argument d and right argument n for
        all divisors d of n. Return the array of d's for which the helper link
        returns a truthy value.


;÷@DỊȦ  Helper link. Left argument: d. Right argument: n

 ÷@     Divide n by d.
;       Concatenate, yielding [d, n÷d].
   D    Decimal; convert both integers in the pair to base 10.
    Ị   Insignificant; map 1 and 0 to 1, all other positive integers to 0.
     Ȧ  All; return 1 iff the result contains no zeroes.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.