คำนวณพาร์ติชันของ N


22

ความท้าทายของคุณเป็นเรื่องง่าย: รับจำนวนเต็มN , ouput รายการของจำนวนเต็มบวกทุกคนที่จำนวนเงินที่จะไม่มี ตัวอย่างเช่นถ้าอินพุตเป็น 5 คุณควรส่งออก

[1, 1, 1, 1, 1]
[1, 1, 1, 2]
[1, 1, 3]
[1, 2, 2]
[1, 4]
[2, 3]
[5]

รายการเหล่านี้ไม่จำเป็นต้องส่งออกตามลำดับใด ๆ หรือตัวเลขภายในแต่ละรายการ ตัวอย่างเช่นนี่จะเป็นผลลัพธ์ที่ยอมรับได้สำหรับ '5':

[1, 1, 1, 2]
[5]
[3, 1, 1]
[2, 1, 2]
[4, 1]
[1, 1, 1, 1, 1]
[2, 3]

คุณสามารถสันนิษฐานได้ว่าการป้อนข้อมูลจะเป็นจำนวนเต็มบวกและคุณสามารถใช้ตัวเลขนี้ในรูปแบบที่เหมาะสม

คุณไม่สามารถใช้ฟังก์ชัน builtin ใด ๆ ที่ทำสิ่งนี้

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

ช่องโหว่มาตรฐานใช้และคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ!

ทดสอบ IO

1:
[[1]]

2:
[[1, 1], [2]]

3:
[[1, 1, 1], [1, 2], [3]]

4:
[[1, 1, 1, 1], [1, 1, 2], [1, 3], [2, 2], [4]]

5:
[[1, 1, 1, 1, 1], [1, 1, 1, 2], [1, 1, 3], [1, 2, 2], [1, 4], [2, 3], [5]]

7:
[[1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 2], [1, 1, 1, 1, 3], [1, 1, 1, 2, 2], [1, 1, 1, 4], [1, 1, 2, 3], [1, 1, 5], [1, 2, 2, 2], [1, 2, 4], [1, 3, 3], [1, 6], [2, 2, 3], [2, 5], [3, 4], [7]]

10:
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 2], [1, 1, 1, 1, 1, 1, 1, 3], [1, 1, 1, 1, 1, 1, 2, 2], [1, 1, 1, 1, 1, 1, 4], [1, 1, 1, 1, 1, 2, 3], [1, 1, 1, 1, 1, 5], [1, 1, 1, 1, 2, 2, 2], [1, 1, 1, 1, 2, 4], [1, 1, 1, 1, 3, 3], [1, 1, 1, 1, 6], [1, 1, 1, 2, 2, 3], [1, 1, 1, 2, 5], [1, 1, 1, 3, 4], [1, 1, 1, 7], [1, 1, 2, 2, 2, 2], [1, 1, 2, 2, 4], [1, 1, 2, 3, 3], [1, 1, 2, 6], [1, 1, 3, 5], [1, 1, 4, 4], [1, 1, 8], [1, 2, 2, 2, 3], [1, 2, 2, 5], [1, 2, 3, 4], [1, 2, 7], [1, 3, 3, 3], [1, 3, 6], [1, 4, 5], [1, 9], [2, 2, 2, 2, 2], [2, 2, 2, 4], [2, 2, 3, 3], [2, 2, 6], [2, 3, 5], [2, 4, 4], [2, 8], [3, 3, 4], [3, 7], [4, 6], [5, 5], [10]]

กรณีทดสอบที่มีขนาดใหญ่มาก: 15 ควรให้ผลลัพธ์นี้

[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5], [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2], [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4], [1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3], [1, 1, 1, 1, 1, 1, 1, 1, 1, 6], [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3], [1, 1, 1, 1, 1, 1, 1, 1, 2, 5], [1, 1, 1, 1, 1, 1, 1, 1, 3, 4], [1, 1, 1, 1, 1, 1, 1, 1, 7], [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2], [1, 1, 1, 1, 1, 1, 1, 2, 2, 4], [1, 1, 1, 1, 1, 1, 1, 2, 3, 3], [1, 1, 1, 1, 1, 1, 1, 2, 6], [1, 1, 1, 1, 1, 1, 1, 3, 5], [1, 1, 1, 1, 1, 1, 1, 4, 4], [1, 1, 1, 1, 1, 1, 1, 8], [1, 1, 1, 1, 1, 1, 2, 2, 2, 3], [1, 1, 1, 1, 1, 1, 2, 2, 5], [1, 1, 1, 1, 1, 1, 2, 3, 4], [1, 1, 1, 1, 1, 1, 2, 7], [1, 1, 1, 1, 1, 1, 3, 3, 3], [1, 1, 1, 1, 1, 1, 3, 6], [1, 1, 1, 1, 1, 1, 4, 5], [1, 1, 1, 1, 1, 1, 9], [1, 1, 1, 1, 1, 2, 2, 2, 2, 2], [1, 1, 1, 1, 1, 2, 2, 2, 4], [1, 1, 1, 1, 1, 2, 2, 3, 3], [1, 1, 1, 1, 1, 2, 2, 6], [1, 1, 1, 1, 1, 2, 3, 5], [1, 1, 1, 1, 1, 2, 4, 4], [1, 1, 1, 1, 1, 2, 8], [1, 1, 1, 1, 1, 3, 3, 4], [1, 1, 1, 1, 1, 3, 7], [1, 1, 1, 1, 1, 4, 6], [1, 1, 1, 1, 1, 5, 5], [1, 1, 1, 1, 1, 10], [1, 1, 1, 1, 2, 2, 2, 2, 3], [1, 1, 1, 1, 2, 2, 2, 5], [1, 1, 1, 1, 2, 2, 3, 4], [1, 1, 1, 1, 2, 2, 7], [1, 1, 1, 1, 2, 3, 3, 3], [1, 1, 1, 1, 2, 3, 6], [1, 1, 1, 1, 2, 4, 5], [1, 1, 1, 1, 2, 9], [1, 1, 1, 1, 3, 3, 5], [1, 1, 1, 1, 3, 4, 4], [1, 1, 1, 1, 3, 8], [1, 1, 1, 1, 4, 7], [1, 1, 1, 1, 5, 6], [1, 1, 1, 1, 11], [1, 1, 1, 2, 2, 2, 2, 2, 2], [1, 1, 1, 2, 2, 2, 2, 4], [1, 1, 1, 2, 2, 2, 3, 3], [1, 1, 1, 2, 2, 2, 6], [1, 1, 1, 2, 2, 3, 5], [1, 1, 1, 2, 2, 4, 4], [1, 1, 1, 2, 2, 8], [1, 1, 1, 2, 3, 3, 4], [1, 1, 1, 2, 3, 7], [1, 1, 1, 2, 4, 6], [1, 1, 1, 2, 5, 5], [1, 1, 1, 2, 10], [1, 1, 1, 3, 3, 3, 3], [1, 1, 1, 3, 3, 6], [1, 1, 1, 3, 4, 5], [1, 1, 1, 3, 9], [1, 1, 1, 4, 4, 4], [1, 1, 1, 4, 8], [1, 1, 1, 5, 7], [1, 1, 1, 6, 6], [1, 1, 1, 12], [1, 1, 2, 2, 2, 2, 2, 3], [1, 1, 2, 2, 2, 2, 5], [1, 1, 2, 2, 2, 3, 4], [1, 1, 2, 2, 2, 7], [1, 1, 2, 2, 3, 3, 3], [1, 1, 2, 2, 3, 6], [1, 1, 2, 2, 4, 5], [1, 1, 2, 2, 9], [1, 1, 2, 3, 3, 5], [1, 1, 2, 3, 4, 4], [1, 1, 2, 3, 8], [1, 1, 2, 4, 7], [1, 1, 2, 5, 6], [1, 1, 2, 11], [1, 1, 3, 3, 3, 4], [1, 1, 3, 3, 7], [1, 1, 3, 4, 6], [1, 1, 3, 5, 5], [1, 1, 3, 10], [1, 1, 4, 4, 5], [1, 1, 4, 9], [1, 1, 5, 8], [1, 1, 6, 7], [1, 1, 13], [1, 2, 2, 2, 2, 2, 2, 2], [1, 2, 2, 2, 2, 2, 4], [1, 2, 2, 2, 2, 3, 3], [1, 2, 2, 2, 2, 6], [1, 2, 2, 2, 3, 5], [1, 2, 2, 2, 4, 4], [1, 2, 2, 2, 8], [1, 2, 2, 3, 3, 4], [1, 2, 2, 3, 7], [1, 2, 2, 4, 6], [1, 2, 2, 5, 5], [1, 2, 2, 10], [1, 2, 3, 3, 3, 3], [1, 2, 3, 3, 6], [1, 2, 3, 4, 5], [1, 2, 3, 9], [1, 2, 4, 4, 4], [1, 2, 4, 8], [1, 2, 5, 7], [1, 2, 6, 6], [1, 2, 12], [1, 3, 3, 3, 5], [1, 3, 3, 4, 4], [1, 3, 3, 8], [1, 3, 4, 7], [1, 3, 5, 6], [1, 3, 11], [1, 4, 4, 6], [1, 4, 5, 5], [1, 4, 10], [1, 5, 9], [1, 6, 8], [1, 7, 7], [1, 14], [2, 2, 2, 2, 2, 2, 3], [2, 2, 2, 2, 2, 5], [2, 2, 2, 2, 3, 4], [2, 2, 2, 2, 7], [2, 2, 2, 3, 3, 3], [2, 2, 2, 3, 6], [2, 2, 2, 4, 5], [2, 2, 2, 9], [2, 2, 3, 3, 5], [2, 2, 3, 4, 4], [2, 2, 3, 8], [2, 2, 4, 7], [2, 2, 5, 6], [2, 2, 11], [2, 3, 3, 3, 4], [2, 3, 3, 7], [2, 3, 4, 6], [2, 3, 5, 5], [2, 3, 10], [2, 4, 4, 5], [2, 4, 9], [2, 5, 8], [2, 6, 7], [2, 13], [3, 3, 3, 3, 3], [3, 3, 3, 6], [3, 3, 4, 5], [3, 3, 9], [3, 4, 4, 4], [3, 4, 8], [3, 5, 7], [3, 6, 6], [3, 12], [4, 4, 7], [4, 5, 6], [4, 11], [5, 5, 5], [5, 10], [6, 9], [7, 8], [15]]

แค็ตตาล็อก

สแต็คส่วนย่อยที่ด้านล่างของโพสต์นี้สร้างแคตตาล็อกจากคำตอบ a) เป็นรายการคำตอบสั้นที่สุดต่อภาษาและ b) เป็นลีดเดอร์บอร์ดโดยรวม

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

## Ruby, <s>104</s> <s>101</s> 96 bytes


1
ที่เกี่ยวข้อง: codegolf.stackexchange.com/questions/46991/…
DJMcMayhem

2
คุณช่วยอธิบายสิ่งที่คุณหมายถึงโดยการจัดการ ?
Dennis

@ flawr ฉันไม่เห็นด้วย - การค้นหาพาร์ติชันทั้งหมดแตกต่างจากการค้นหาพาร์ติชันที่เข้มงวดเพียงพอ อย่างไรก็ตามอันนี้อาจเป็นเป้าหมายล่อลวง
Mego

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

คุณสามารถอธิบายสิ่งที่คุณหมายถึงโดยbuitin ?
Leun Nun

คำตอบ:


6

Pyth, 10 9 ไบต์

{SMlMM./U

ไม่แน่ใจว่านี่ไม่ใช่การโกง แต่กฎบอกเพียงว่าไม่สามารถใช้พาร์ทิชันจำนวนเต็มได้ (มันไม่ได้ระบุไว้อย่างชัดเจนในคำถาม แต่ความเห็นโดย OP ในคำถามบอกว่าพาร์ทิชันจำนวนเต็ม) ฉันกำลังใช้รายการสตริง พาร์ทิชันซึ่งทำให้ชิ้นส่วนของรายการที่เชื่อมต่อกันถึงรายการ "แม่" ฉันเชื่อว่าฉันต้องขอบคุณ @Maltysen สำหรับความคิดในการใช้รายการมากกว่าสตริง

n = 15 ใช้เวลาน้อยกว่าหนึ่งวินาทีในเครื่องของฉัน

ใน pseudocode ดาต้าโฟลว์:

              input       // initial data
        U     range       // makes a list of length equal to input
      ./      partition   // partitions string
   lMM        length      // length of each substring in each way to partition
 SM           sort        // sort each way to partition
{             deduplicate // removes all duplicate after sorting
              print       // implicit, output final result

ลองออนไลน์ได้ที่นี่


{mSlMd./*Nบันทึกไบต์
Leaky Nun

คุณสามารถไป 7 ไบต์ถ้าคุณใช้การแบ่งพาร์ติชันรายการแทนการแบ่งพาร์ติชันสตริง: pyth.herokuapp.com/?code=sMM.%2Fm1&input=5&debug=0
Maltysen

@LeakyNun ดีจริง ๆ แล้วฉันพยายามและมันไม่ได้บันทึกไบต์ เมื่อฉันเห็นความคิดเห็นของคุณฉันพบว่าคำตอบของฉันคือ 10 ไบต์ดังนั้นฉันจึงผิดพลาดจริง ๆ (ลืมบล็อก gedit เริ่มต้นจาก 1)
busukxuan

@Maltysen คุณต้องเรียงลำดับรายการย่อยแต่ละรายการแล้วจึงขจัดข้อมูลซ้ำซ้อน
busukxuan

@Maltysen คุณพูดถูกการใช้รายการต่าง ๆ จะสั้นลง ฉันพยายามเพิ่มการเรียงลำดับและขจัดข้อมูลซ้ำซ้อนกับรหัสที่คุณเชื่อมโยงกับและมันก็ไม่ได้ช่วย แต่ทั้งหมดขอบคุณที่ฉันได้รับความคิดในการแทนที่ * N ด้วย U ขอบคุณ!
busukxuan

6

Pyth, 18 ไบต์

L?b{SM+R-bsdsyMb]Y

ลองออนไลน์! (ส่วนyท้ายจะใช้เรียกฟังก์ชัน)

นี่ค่อนข้างรวดเร็ว

สิ่งนี้ใช้การเรียกซ้ำ ถ้าอินพุตคือbเมธอดของฉันจะสร้างพาร์ติชันจาก0ถึงb-1แล้วสร้างพาร์ติชันที่ถูกต้องจากแต่ละพาร์ติชัน

ตัวอย่างเช่นเมื่อb=4:

  • b=0 จะช่วยให้ [[]]
  • b=1 จะช่วยให้ [[1]]
  • b=2 จะช่วยให้ [[2], [1, 1]]
  • b=3 จะช่วยให้ [[3], [1, 2], [1, 1, 1]]

จากนั้นในแต่ละพาร์ติชันb=0ให้เพิ่ม4(เพื่อสร้างผลรวม 4); ในแต่ละพาร์ติชันb=1ให้ผนวก3(เพื่อสร้างผลรวม4 ); เป็นต้น

นี่คือวิธีการทำงานเป็นหลัก

L?b{SM+R-bsdsyMb]Y

L                    define a function called "y" which takes an argument: "b"
 ?b                  test for truthiness of b (in this case, test if b>0).


   {SM+R-bsdsyMb     if truthy:

             yMb         call this function from 0 to b-1.
            s            unpack each list of partitions, generating only partitions.
      +R                 to each partition (d), append:
        -                    the difference of
         b                   b (the argument) and
          sd                 the sum of d (the partition).
    SM                   sort each partition.
   {                     remove duplicates.


                ]Y   if falsey:

                 Y       yield [].
                ]        yield [[]].

5

MATL , 20 ไบต์

:"0Gq:@XNG3$Yc!dS!Xu

ลองออนไลน์!

สำหรับการป้อนข้อมูล15จะใช้เวลาประมาณ 2 วินาทีในคอมไพเลอร์ออนไลน์

คำอธิบาย

งานนี้โดยการสร้างพาร์ทิชันที่จุดแล้วแปลงไปเป็นพาร์ทิชันยาว สิ่งที่ฉันหมายถึงคือสิ่งต่อไปนี้ รับอินพุตN = 5 พาร์ติชันที่เป็นไปได้คือ [2 2 1] นี่คือจุดแบ่งพาร์ติชัน [0 2 4 5] ดังนั้นความแตกต่างที่ต่อเนื่องกัน (หรือความยาว) ของจุดแบ่งพาร์ติชันทำให้พาร์ติชันผลลัพธ์ของหมายเลขอินพุต

อาร์เรย์ทุกจุดพาร์ทิชันเริ่มต้นด้วย 0 และจบด้วยN จำนวนkของคะแนนกลางจะแตกต่างกันตั้งแต่ 0 ถึงN -1 สำหรับNและKรับที่จุดกลางที่สามารถสร้างการรวมกันของตัวเลข [1, 2, ... เป็นN -1] นำkในเวลา

อาร์เรย์ของจุดพาร์ติชันหลายจุดอาจก่อให้เกิดผลลัพธ์เดียวกันในลำดับที่แตกต่างกัน ตัวอย่างเช่นคะแนนพาร์ติชัน [0 1 3 5] จะให้ความยาวของพาร์ติชัน [1 2 2] นั่นคือเหมือนกับ [2 2 1] ก่อนหน้านี้เท่านั้นในลำดับที่แตกต่างกัน นี้จะถูกนำเข้าบัญชีโดยการเรียงลำดับอาร์เรย์ของความยาวแต่ละพาร์ทิชันและลบที่ซ้ำกัน

:        % Implicitly input N. Push [1 2 ... N]. These are the possible values of k,
         % except with N instead of 0
"        % For each
  0      %   Push 0
  Gq:    %   Push [1 ... N-1]. These the possible intermediate points
  @XN    %   Push k and produce the combinations. Each k produces a 2D array with
         %   each combination on a row. The value k=N produces an empty array
  G      %   Push N
  3$Yc   %   Prepend a column of zeros and append a column of N to the array
  !d     %   Transpose. Consecutive differences of each column
  S!     %   Sort each column. Transpose
  Xu     %   Keep only unique rows
         % Implicitly end for and display all arrays in the stack

1
ดีแนวคิดของจุดแบ่งเป็นวิธีที่ฉลาดในการแก้ปัญหานี้
Nick

@Nick ขอบคุณ! และยินดีต้อนรับสู่ (กำลังใช้งานอยู่) เว็บไซต์นี้! :-)
Luis Mendo


5

J, 49 42 36 35 32 ไบต์

a:1&([:~.@,(,;}./:~@,(+{.))&>)~]

ตอนนี้มันเงียบ ๆ !

สร้างพาร์ทิชันจำนวนเต็มของnโดยการสร้างพาร์ทิชันจำนวนเต็มจาก 1 ถึงn คำนวณผลลัพธ์สำหรับn = 15 ในหน่วยมิลลิวินาที

เริ่มต้นด้วยพาร์ติชันจำนวนเต็มเริ่มต้น[[1]]ซึ่งสอดคล้องกับn = 1 สร้างพาร์ติชันจำนวนเต็มถัดไปโดยการรวมผลลัพธ์จากการดำเนินการสองอย่าง: ผนวก 1 กับแต่ละพาร์ติชัน การเพิ่มค่าที่เล็กที่สุด 1 ในแต่ละพาร์ติชัน แน่นอนพาร์ติชันที่ซ้ำกันจะถูกลบออก ในการรับค่าพาร์ติชั่นจำนวนเต็มn = 2 ขึ้นไป

Partition for n = 1
[[1]]

Partition for n = 2
[[1, 1]] join [[2]]
= [[1, 1], [2]]

Partition for n = 3
[[1, 2], [1, 1, 1]] join [[3], [1, 2]]
= [[3], [1, 2], [1, 1, 1]]

... and so on

การใช้

   f =: a:1&([:~.@,(,;}./:~@,(+{.))&>)~]
   f 1
┌─┐
│1│
└─┘
   f 2
┌───┬─┐
│1 1│2│
└───┴─┘
   f 3
┌─────┬───┬─┐
│1 1 1│1 2│3│
└─────┴───┴─┘
   f 5
┌─────────┬───────┬─────┬───┬─────┬───┬─┐
│1 1 1 1 1│1 1 1 2│1 2 2│2 3│1 1 3│1 4│5│
└─────────┴───────┴─────┴───┴─────┴───┴─┘
   # f 15
176

คำอธิบาย

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

a:1&([:~.@,(,;}./:~@,(+{.))&>)~]  Input: n
a:                                The empty box
                               ]  Get the input n
  1&(                        )~   Repeat n times with an initial array of one empty box
           (              )&>       Operate on each partition
                     (   )            Hook a partition
                       {.               Get its head (the smallest value)
  1                   +                 Add 1 to it
  1           }.                      Drop the first value in each partition
                    ,                 Join the previous two results
                /:~@                  Sort it
  1         ,                         Prepend a 1 to the initial partition
             ;                        Box the last two results and join them
     [:   ,                         Flatten the pairs of boxes
       ~.@                          Remove duplicates and return
                                  Return the final result where each box
                                  is a partition of n

4

Python ขนาด 65 ไบต์

Python 3

def f(n,i=1,l=[]):n or print(l);i>n or[f(n-i,i,[i]+l),f(n,i+1,l)]

ฟังก์ชั่นนี้จะสะสมพาร์ติชันและพิมพ์ผลลัพธ์แยกตัวเลือก มันตัดสินใจจำนวนของ 1 ที่จะใส่ในพาร์ติชันจำนวนของ 2 และอื่น ๆ สำหรับแต่ละค่าiมันอย่างใดอย่างหนึ่ง

  • เพิ่มส่วนหนึ่งของขนาด iและลดลงnเป็นn-iหรือ
  • ย้ายไปที่ i+1

ถ้า i>nไม่สามารถสร้างชิ้นส่วนเพิ่มเติมได้อีกจึงหยุด ถ้าnตกลงไป0พาร์ติชันจะสำเร็จและถูกพิมพ์

Python 2

f=lambda n,i=1:n/i and[l+[i]for l in f(n-i,i)]+f(n,i+1)or[[]][n:]

วิธีการเรียกซ้ำที่แสดงรายการของพาร์ติชัน เช่นเดียวกับรหัส Python 3 จะนับขนาดชิ้นส่วนiและตัดสินใจในแต่ละขั้นตอนว่าจะเพิ่มขนาดส่วนอื่นiหรือหยุด

ทั้งสองทำn=15เกือบจะในทันที


3

Javascript, 194 ไบต์

p=n=>{var a=[];for(var i=1;i<=n-i;i+=1){for(v of p(n-i)){v.push(i);a.push(v.sort())}}a.push([n]);return a};n=5;s=p(n).map(v=>JSON.stringify(v));s=s.filter((v,i)=>s.indexOf(v)==i);console.log(s);

Non-minified

การค้นหาสิ่งที่ไม่เหมือนใครด้วยการเรียงลำดับและเปรียบเทียบกับสตริงนั้นค่อนข้างจะเป็นการแฮ็ก

p = n => {
    var a = [];

    for (var i = 1; i <= n-i; i++)
    {
        for (v of p(n-i)) {
            v.push(i);
            a.push(v.sort());
        }
    }

    a.push([n]);

    return a;
}

n = 5;
s = p(n).map(v =>  JSON.stringify(v));
s = s.filter((v,i) => s.indexOf(v) == i);
console.log(s);

4
Quite a hack but saves spaceนั่นคือสิ่งที่เกี่ยวกับเว็บไซต์นี้ : D
DJMcMayhem

2

Python 3.5, 82 72 ไบต์

f=lambda n:{(*sorted([*p,i]),)for i in range(1,n)for p in f(n-i)}|{(n,)}

ส่งคืนชุดของ tuples n = 15เสร็จสิ้นทันที

ทดสอบบนrepl.it


2

Haskell, 44 ไบต์

0%m=[[]]
n%m=[j:r|j<-[m..n],r<-(n-j)%j]
(%1)

ฟังก์ชั่นเสริมn%mให้พาร์ทิชันของnเป็นส่วนที่มีฟังก์ชั่นหลักที่ใช้≥m m=1มันสาขาของแต่ละรายการแรกjที่มีm≤j≤n, recursing ในพาร์ทิชันที่เหลืออยู่ของเป็นส่วนที่มีอย่างน้อยn-j jกรณีฐานn==0ให้เพียงพาร์ทิชันที่ว่างเปล่า




1

J, 39 ไบต์

[:~.i.<@\:~@(#;.1~"1 0)1,@{@;(<1 0)#~<:

นี่คือคำกริยา monadic ที่ใช้จำนวนเต็มและส่งกลับอาร์เรย์ของอาร์เรย์ชนิดบรรจุกล่อง ลองที่นี่ การใช้งาน:

   p =: [:~.i.<@\:~@(#;.1~"1 0)1,@{@;(<1 0)#~<:
   p 3
+-----+---+-+
|1 1 1|2 1|3|
+-----+---+-+

ในอินพุต 15 มันทำงานเป็นเวลาประมาณหนึ่งวินาทีบนเครื่องของฉัน

คำอธิบาย

ความท้าทายนี้ดูเหมือนจะเป็นงานสำหรับ Catalog ( {) และ Cut ( ;.) ทันที โครงร่างของอัลกอริทึมคือ:

  • ผลิตความยาว 0-1 อาร์เรย์nทั้งหมด
  • สำหรับแต่ละชิ้นให้ตัดnความยาวของหุ่นจำลองตาม 1s และทำรายการความยาวของแต่ละส่วน
  • จัดเรียงความยาวและลบอาร์เรย์ที่ซ้ำกันออกจากผลลัพธ์

เห็นได้ชัดว่า Luis Mendo ก็มีความคิดเดียวกันเช่นกัน

คำอธิบายของรหัส:

[:~.i.<@\:~@(#;.1~"1 0)1,@{@;(<1 0)#~<:   Input is n.
                                     <:   n-1
                                   #~     copies of
                             (<1 0)       the boxed array [1 0].
                       1    ;             Prepend the boxed array [1].
                          {@              Catalog: produces all combinations of taking one
                                          item from each box, in a high-dimensional matrix.
                        ,@                Flatten the matrix. This results in a list of all
                                          boxed 0-1 arrays of length n that begin with a 1.
    i.                                    The array A =: 0, 1, ..., n-1.
            (     "1 0)                   For each of the boxed arrays B:
              ;.1~                          cut A along the occurrences of 1s in B,
             #                              take the length of each part,
        \:~@                                sort the lengths,
      <@                                    and put the result in a box.
[:~.                                      Remove duplicate boxes.

ใช้ดีมากของการตัด;.อีกครั้ง
ไมล์

1

Brachylog 33 ไบต์ (ไม่แข่งขัน)

:1f:oad.
:1eI,.##lI,.:{.>0}a+?,.=

นี่ไม่ใช่การแข่งขันเนื่องจากการแก้ไขข้อบกพร่อง

ใช้เวลาประมาณ 1 วินาที15ในเครื่องของฉัน สำหรับ20ข้อผิดพลาดนี้มากขึ้นและมีOut of global stackข้อยกเว้น

คำอธิบาย

สิ่งนี้ไม่มีการแบ่งพาร์ติชันในตัวทุกชนิดและใช้ข้อเท็จจริงที่+ทำงานทั้งสองวิธีผ่านการเผยแพร่ข้อ จำกัด

  • ภาคแสดงหลัก:

    :1f                       Find the list of all valid outputs of predicate 1
       :oa                    Sort each element of that list
          d.                  Output is that list of sorted lists minus all duplicates
    
  • คำกริยาที่ 1:

    :1eI                      I is an integer between Input and 1
        .##lI,                Output is a list of length I
              .:{.>0}a        Elements of Output are integers greater than 0
                      +?,     The sum of the elements of Output is Input
                         .=   Assign values to the elements of Output
    

1

มาติกา 62 54 ไบต์

Inner[#2~Table~#&,FrobeniusSolve[r=Range@#,#],r,Join]&

พาร์ทิชันของจำนวนเต็มnสามารถพบได้โดยการแก้สำหรับn -tuples ของจำนวนเต็มไม่เป็นลบ ( 1 , 2 , ... , n ) เช่นที่1 + 2 2 + ... + n n = n FrobeniusSolveสามารถที่จะหาทางแก้ไขปัญหาทั้งหมดให้กับสมการนี้ซึ่งจะใช้ในการสร้างที่หลายสำเนาของค่าของตนเพื่อหาพาร์ทิชันจำนวนเต็มทั้งหมดของn


... และนี่คือสิ่งที่ไม่ได้มีในตัว?
Leun Nun

@LeakyNun FrobeniusSolveไม่พบพาร์ทิชันจำนวนเต็มพบการแก้ปัญหาทั้งหมดของจำนวนเต็มไม่เป็นลบ x1 ... xNสมการของแบบฟอร์มa1 x1 + a2 x2 + ... aN xN = bที่กำหนดและa1 ... aN b
ไมล์

0

JavaScript (Firefox 30-57) 79 ES6, 65 ไบต์

f=(n,m=1,a=[])=>n?m>n?[]:[...f(n-m,m,[...a,m]),...f(n,m+1,a)]:[a]

พอร์ตของโซลูชัน Python ของ @ xnor (ถ้าเพียง แต่ฉันสังเกตเห็นว่าคุณสามารถชดเชยmเช่นเดียวกับn... )

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