Tìm các bộ tiền


15

Tôi rất thích đọc trang web này; đây là câu hỏi đầu tiên của tôi Chỉnh sửa được chào đón.

Cho các số nguyên dương nm , tính toán tất cả các phân vùng có thứ tự của m thành chính xác n phần nguyên dương và in chúng được phân cách bằng dấu phẩy và dòng mới. Bất kỳ thứ tự là tốt, nhưng mỗi phân vùng phải xuất hiện chính xác một lần.

Ví dụ: đã cho m = 6 và n = 2, các phân vùng có thể là các cặp số nguyên dương có tổng bằng 6:

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

Lưu ý rằng [1,5] và [5,1] là các phân vùng được sắp xếp khác nhau. Đầu ra phải chính xác theo định dạng ở trên, với một dòng mới tùy chọn. (EDIT: Thứ tự chính xác của các phân vùng không quan trọng). Đầu vào / đầu ra được thông qua I / O mã golf tiêu chuẩn .

Một ví dụ đầu ra khác cho 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

Mã nhỏ nhất tính bằng byte sau 1 tuần sẽ thắng.

Một lần nữa, xin vui lòng chỉnh sửa nếu cần thiết.

Phụ lục:

@TimmyD hỏi kích thước của số nguyên đầu vào mà chương trình phải hỗ trợ. Không có tối thiểu cứng ngoài các ví dụ; thật vậy, kích thước đầu ra tăng theo cấp số nhân, được mô hình hóa gần bằng: 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

Các câu trả lời có cần hỗ trợ các số nguyên lớn tùy ý không, hoặc giới hạn trên hợp lý như 2 ^ 31-1 có phù hợp không?
admBorkBork

4
Thuật ngữ "bộ" là khó hiểu vì vấn đề trật tự. Tôi nghĩ rằng thuật ngữ bạn đang tìm kiếm được phân vùng theo thứ tự.
xnor

2
Mặc dù không cần thiết phải thay đổi, chúng ta thường có định dạng đầu ra lỏng hơn so với định dạng này.
lirtosiast

Tôi đã thay đổi từ ngữ của bạn để cho phép I / O thông qua các đối số chức năng, lời nhắc và các phương thức I / O khác mà chúng ta thường xem là chấp nhận được.
lirtosiast

@TimmyD, kích thước của đầu ra tăng khá bùng nổ do đó không thực tế khi thử mn qua vài trăm, chứ đừng nói đến 2 ^ 31-1.
cuniculus

Câu trả lời:


7

Bình thường, 14 byte

V^SQEIqsNQj\,N

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình:

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

Cũng 14 byte, cách tiếp cận khác nhau : jjL\,fqsTQ^SQE.
PurkkaKoodari

6

Python 3, 77 byte

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

Một hàm đệ quy xây dựng từng chuỗi đầu ra và in nó. Thử mọi số đầu tiên có thể, đệ quy xuống để tìm một giải pháp với tổng giảm tương ứng nvà một ít triệu hồim và một tiền tố chuỗi svới số đó. Nếu cả tổng số bắt buộc và số lượng thuật ngữ bằng 0, chúng tôi đã đạt được điểm, vì vậy chúng tôi sẽ in kết quả, cắt bỏ dấu phẩy ban đầu. Điều này được kiểm tra là m|n0 (Falsey).

79 ký tự trong 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 byte

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

Dùng thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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

Bình thường, 20 18 byte

-2 byte bởi @Dennis!

jjL\,fqQlT{s.pM./E

Điều này được ncoi là dòng đầu tiên, và mlà dòng thứ hai.

Hãy thử nó ở đây .


3

Haskell, 68 byte

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

Ví dụ sử dụng:

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

Cách thức hoạt động: sequence $ replicate n listtạo tất cả các kết hợp của ncác yếu tố được vẽ list. Chúng tôi lấy tất cả như vậy xtrong [1..m]đó sumbằng m. unlinesinit$tail$showsản xuất định dạng đầu ra cần thiết.


3

APL Dyalog , 33 byte

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

Đưa ra mnhư đối số trái, nnhư đối số phải.

Gần một nửa (giữa {) là dành cho định dạng cần thiết.


2

Toán học, 65 byte

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

IntegerPartitionslàm nhiệm vụ. Phần còn lại chỉ là để đặt các bộ dữ liệu và định dạng kết quả.


2

Trăn 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)

Tôi đã không quản lý một lớp lót trong một thời gian. :)


1

Con trăn 2.7, 174 170 152 byte

Câu trả lời béo. Ít nhất là nó có thể đọc được :)

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

Bạn có thể xóa các khoảng trắng xung quanh >, sau replacevà sau dấu phẩy.
Alex A.

1

Julia, 105 byte

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

Đây là một hàm đọc hai đối số nguyên và ghi kết quả vào STDOUT với một nguồn cấp dữ liệu duy nhất.

Ung dung:

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 byte

Nếu đầu ra có thể là một danh sách các danh sách

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

Cách mà nó hiện đang diễn ra tôi phải thêm một joinvào lambda.

{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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.