Toplam kümelerini bulun


15

Bu siteyi okumaktan keyif aldım; bu benim ilk sorum. Düzenlemeler kabul edilir.

Pozitif tamsayılar Verilen n ve m , her sipariş bölümleri hesaplamak m tam içine n parçalar pozitif tamsayı parçaları, ve onları virgül ve satırbaşıyla sınırlandırılmış yazdırın. Herhangi bir sipariş iyidir, ancak her bölüm tam olarak bir kez görünmelidir.

Örneğin, m = 6 ve n = 2 verildiğinde, olası bölümler 6'ya karşılık gelen pozitif tamsayı çiftleridir:

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

[1,5] ve [5,1] 'in farklı sıralı bölümler olduğuna dikkat edin. Çıktı, isteğe bağlı olarak izleyen satırsonu ile birlikte tam olarak yukarıdaki biçimde olmalıdır. (DÜZENLEME: Bölümlerin kesin sırası önemli değildir). Giriş / çıkış standart kod golf I / O üzerinden yapılır .

M = 7, n = 3 için başka bir örnek çıktı:

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 hafta sonra bayt cinsinden en küçük kod kazanır.

Yine gerekirse lütfen düzenleyin.

Zeyilname:

@TimmyD, programın hangi boyutta tamsayı girdisini desteklemesi gerektiğini sordu. Örneklerin ötesinde zor bir minimum yoktur; aslında, çıktı boyutu katlanarak artar, kabaca şu şekilde modellenir: 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

Cevapların keyfi olarak büyük tam sayıları desteklemesi mi gerekiyor, yoksa 2 ^ 31-1 gibi makul bir üst sınır uygun mu?
AdmBorkBork

4
"Setler" terimi kafa karıştırıcıdır çünkü düzen önemlidir. Bence aradığınız terim sıralı bölümler.
xnor

2
Değişmek gerekli olmasa da, genellikle bundan daha gevşek bir çıktı formatımız vardır.
lirtosiast

İşlev argümanları, istemler ve genellikle kabul edilebilir olduğunu düşündüğümüz diğer G / Ç yöntemleri aracılığıyla G / Ç'ye izin vermek için ifadenizi değiştirdim.
lirtosiast

@TimmyD, çıktının boyutu oldukça patlayıcı bir şekilde büyür, böylece m ve n'yi birkaç yüz geçmeden, 2 ^ 31-1'i denemek pratik değildir .
cuniculus

Yanıtlar:


7

Pyth, 14 bayt

V^SQEIqsNQj\,N

Çevrimiçi deneyin: Gösteri veya Test Paketi

Açıklama:

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

Ayrıca 14 farklı bir yaklaşım bayt: jjL\,fqsTQ^SQE.
PurkkaKoodari

6

Python 3, 77 bayt

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

Her çıkış dizesini oluşturan ve onu bastıran özyinelemeli işlev. Karşılık gelen azalan toplamı nve bir daha az toplamı mve bir dize önekini içeren bir çözüm bulmak için tekrarlayan her olası ilk sayıyı deners bu sayıya sahip . Hem gerekli toplam hem de terim sayısı 0 ise, işareti vurduk, bu nedenle sonucu yazdırırız ve ilk virgülü keseriz. Bu olarak kontrol edilirm|n 0 (Falsey) .

Python 2'de 79 karakter:

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 bayt

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

CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

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 bayt

@Dennis tarafından -2 bayt!

jjL\,fqQlT{s.pM./E

Bu n, ilk girdi satırı ve mikinci girdi olarak alır.

Burada deneyin .


3

Haskell, 68 bayt

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

Kullanım örneği:

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

Nasıl çalışır: çizilmiş sequence $ replicate n listtüm neleman kombinasyonlarını oluşturur list. Hepimiz böyle almak xiçinde [1..m]nerede sumeşittir m. unlinesve init$tail$showgerekli çıktı biçimini üretin.


3

Dyalog APL , 33 bayt

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

Alır m, sol argüman olarak nsağ argüman olarak.

Neredeyse yarısı ( {ve arasında ) gerekli biçimlendirme içindir.


2

Mathematica, 65 bayt

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

IntegerPartitionsgörevi yapar. Gerisi sadece tuples sipariş ve sonucu biçimlendirmektir.


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)

Bir süredir 1 astar yönetemedim. :)


1

Piton 2.7, 174 170 152 bayt

Şişman cevap. En azından okunabilir :)

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(" ","")

Virgülün çevresindeki >, sonrasında replaceve sonrasındaki boşlukları kaldırabilirsiniz .
Alex A.

1

Julia, 105 bayt

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

Bu, iki tamsayı bağımsız değişkenini okuyan ve sonuçları tek bir sondaki satır beslemesiyle STDOUT'a yazan bir işlevdir.

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 bayt

Çıktı bir liste listesi olabilirse

{[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;

Şu anda ifade edilen şekilde lambda'ya bir tane eklemek zorundayım 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.