ค้นหาชุดผลรวม


15

ฉันสนุกกับการอ่านเว็บไซต์นี้; นี่เป็นคำถามแรกของฉัน ยินดีต้อนรับการแก้ไข

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

ตัวอย่างเช่นกำหนด m = 6 และ n = 2 พาร์ติชันที่เป็นไปได้คือคู่ของจำนวนเต็มบวกที่รวมกับ 6:

1,5
2,4
3,3
4,2
5,1

โปรดทราบว่า [1,5] และ [5,1] เป็นพาร์ติชั่นที่สั่งซื้อที่แตกต่างกัน เอาต์พุตควรอยู่ในรูปแบบข้างต้นโดยมีบรรทัดใหม่ต่อท้ายที่เป็นตัวเลือก (แก้ไข: ลำดับที่แน่นอนของพาร์ทิชันไม่สำคัญ) อินพุต / เอาต์พุตมีผ่านมาตรฐานรหัสกอล์ฟ I / O

อีกตัวอย่างของเอาต์พุตสำหรับ m = 7, n = 3:

1,1,5
1,2,4
2,1,4
1,3,3
2,2,3
3,1,3
1,4,2
2,3,2
3,2,2
4,1,2
1,5,1
2,4,1
3,3,1
4,2,1
5,1,1

รหัสที่เล็กที่สุดในหน่วยไบต์หลังจาก 1 สัปดาห์ที่ชนะ

โปรดแก้ไขอีกครั้งหากจำเป็น

ภาคผนวก:

@ TimmyD ถามขนาดของอินพุตจำนวนเต็มที่โปรแกรมสนับสนุน ไม่มีขั้นต่ำที่ยากเกินกว่าตัวอย่าง แท้จริงขนาดเอาต์พุตเพิ่มขึ้นแบบเอ็กซ์โพเนนเชียลโดยประมาณโดย: lines = e ^ (0.6282 n - 1.8273)

n | m | lines of output
2 | 1 | 1
4 | 2 | 2
6 | 3 | 6
8 | 4 | 20
10 | 5 | 70
12 | 6 | 252
14 | 7 | 924
16 | 8 | 3432
18 | 9 | 12870
20 | 10 | 48620
22 | 11 | 184756
24 | 12 | 705432

คำตอบจำเป็นต้องรองรับจำนวนเต็มขนาดใหญ่โดยพลการหรือคำตอบที่เหมาะสมเช่น 2 ^ 31-1 เหมาะสมหรือไม่?
AdmBorkBork

4
คำว่า "ชุด" มีความสับสนเนื่องจากคำสั่งซื้อมีความสำคัญ ฉันคิดว่าคำที่คุณต้องการคือพาร์ทิชันที่สั่ง
xnor

2
แม้ว่าจะไม่จำเป็นต้องเปลี่ยนเรามักจะมีรูปแบบเอาต์พุตที่หลวมกว่านี้
lirtosiast

ฉันได้เปลี่ยนถ้อยคำของคุณเพื่ออนุญาตให้ I / O ผ่านการขัดแย้งของฟังก์ชั่นข้อความแจ้งเตือนและวิธีการ I / O อื่น ๆ ที่เรามักจะยอมรับได้
lirtosiast

@ TimmyD ขนาดของเอาต์พุตค่อนข้างระเบิดได้ดังนั้นมันจึงไม่เป็นประโยชน์ที่จะลองmและnผ่านสองสามร้อยนับประสา 2 ^ 31-1
cuniculus

คำตอบ:


7

Pyth, 14 ไบต์

V^SQEIqsNQj\,N

ลองใช้ออนไลน์: การสาธิตหรือชุดทดสอบ

คำอธิบาย:

V^SQEIqsNQj\,N   implicit: Q = first input number
  SQ             create the list [1, 2, ..., Q]
    E            read another number
 ^               cartesian product of the list
                 this creates all tuples of length E using the numbers in SQ
V                for each N in ^:
     IqsNQ          if sum(N) == Q:
          j\,N         join N by "," and print

นอกจากนี้ยังมี 14 jjL\,fqsTQ^SQEไบต์วิธีการที่แตกต่างกัน
PurkkaKoodari

6

Python 3, 77 ไบต์

def f(n,m,s=''):[f(i,m-1,',%d'%(n-i)+s)for i in range(n)];m|n or print(s[1:])

ฟังก์ชั่นวนซ้ำที่สร้างสตริงเอาต์พุตแต่ละตัวและพิมพ์ออกมา พยายามทุกหมายเลขแรกที่เป็นไปได้เรียกซ้ำเพื่อหาคำตอบด้วยผลรวมที่ลดลงnและสรุปน้อยหนึ่งครั้งmและคำนำหน้าสตริงที่sมีหมายเลขนั้น หากทั้งผลรวมที่ต้องการและจำนวนคำเท่ากับ 0 เราได้กดเครื่องหมายเพื่อให้เราพิมพ์ผลลัพธ์โดยตัดเครื่องหมายจุลภาคเริ่มต้น สิ่งนี้ถูกตรวจสอบว่าm|nเป็น 0 (เท็จ)

79 ตัวอักษรใน Python 2:

def f(n,m,s=''):
 if m|n==0:print s[1:]
 for i in range(n):f(i,m-1,','+`n-i`+s)

4

CJam, 22 ไบต์

q~:I,:)m*{:+I=},',f*N*

ลองออนไลน์ใน ล่าม CJam

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

q~                      Read and evaluate all input. Pushes n and m.
  :I                    Save m in I.
    ,:)                 Turn it into [1 ... I].
       m*               Push all vectors of {1 ... I}^n.
         {    },        Filter; for each vector:
          :+I=            Check if the sum of its elements equals I.
                        Keep the vector if it does.
                ',f*    Join all vectors, separating by commas.
                    N*  Join the array of vectors, separating by linefeeds.

3

Pyth, 20 18 ไบต์

-2 ไบต์โดย @Dennis!

jjL\,fqQlT{s.pM./E

สิ่งนี้ใช้nเป็นบรรทัดแรกของอินพุตและmเป็นที่สอง

ลองมันนี่


3

Haskell, 68 ไบต์

n#m=unlines[init$tail$show x|x<-sequence$replicate n[1..m],sum x==m]

ตัวอย่างการใช้งาน:

*Main> putStr $ 2#6
1,5
2,4
3,3
4,2
5,1

วิธีการทำงาน: sequence $ replicate n listสร้างรวมกันทั้งหมดขององค์ประกอบวาดรูปแบบn listเราใช้เวลาทั้งหมดดังกล่าวxของ[1..m]ที่เท่าเทียมกันsum และสร้างรูปแบบผลลัพธ์ที่ต้องการmunlinesinit$tail$show


3

Dyalog APL 33 ไบต์

{↑1↓¨,/',',¨⍕¨↑⍺{⍵/⍨⍺=+/¨⍵},⍳⍵/⍺}

ใช้mอาร์กิวเมนต์ซ้ายnเป็นอาร์กิวเมนต์ขวา

เกือบครึ่ง (ระหว่าง{และ) สำหรับการจัดรูปแบบที่ต้องการ


2

Mathematica, 65 ไบต์

StringRiffle[Permutations/@#~IntegerPartitions~{#2},"
","
",","]&

IntegerPartitionsทำงาน ที่เหลือก็แค่สั่งทูเปิลและจัดรูปแบบผลลัพธ์


2

Python 3, 112

from itertools import*
lambda m,n:'\n'.join(','.join(map(str,x))for x in product(range(m),repeat=n)if sum(x)==m)

ฉันยังไม่ได้จัดการสายการบินหนึ่งครั้ง :)


1

Python 2.7, 174 170 152 ไบต์

คำตอบที่อ้วน อย่างน้อยก็สามารถอ่านได้ :)

import sys,itertools
m=int(sys.argv[1])
for k in itertools.product(range(1,m),repeat=int(sys.argv[2])):
    if sum(k)==m:print str(k)[1:-1].replace(" ","")

คุณสามารถลบช่องว่างรอบ ๆ>หลังreplaceและหลังเครื่องหมายจุลภาค
Alex A.

1

จูเลีย 105 ไบต์

f(m,n)=for u=∪(reduce(vcat,map(i->collect(permutations(i)),partitions(m,n)))) println("$u"[2:end-1])end

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

Ungolfed:

function f(m::Integer, n::Integer)
    # Get the integer partitions of m of length n
    p = partitions(m, n)

    # Construct an array of all permutations
    c = reduce(vcat, map(i -> collect(permutations(i)), p))

    # Loop over the unique elements
    for u in unique(c)
        # Print the array representation with no brackets
        println("$u"[2:end-1])
    end
end

0

Perl 6 , 54 ไบต์

หากผลลัพธ์อาจเป็นรายการของรายการ

{[X] (1..$^m)xx$^n .grep: $m==*.sum} # 36 bytes
my &code = {[X] (1..$^m)xx$^n .grep: $m==*.sum}
say .join(',') for code 7,3;

วิธีที่คำพูดปัจจุบันฉันต้องเพิ่มjoinลงในแลมบ์ดา

{say .join(',')for [X] (1..$^m)xx$^n .grep: $m==*.sum} # 54 bytes
{...}( 7,3 );
1,1,5
1,2,4
1,3,3
1,4,2
1,5,1
2,1,4
2,2,3
2,3,2
2,4,1
3,1,3
3,2,2
3,3,1
4,1,2
4,2,1
5,1,1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.