Знайдіть множини сум


15

Мені подобалося читати цей сайт; це моє перше питання. Правки вітаються.

З огляду на додатні цілі числа n та m , обчисліть усі впорядковані розділи m на рівно n частин додатних цілих частин та роздрукуйте їх, розділених комами та новими рядками. Будь-яке замовлення добре, але кожен розділ повинен з’являтися рівно один раз.

Наприклад, задані m = 6 і n = 2, можливі розділи - пари натуральних чисел, які дорівнюють 6:

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

Зауважимо, що [1,5] та [5,1] - це різні упорядковані розділи. Вихід повинен бути точно у форматі, наведеному вище, з необов'язковим новим рядком. (EDIT: Точний порядок розділів не має значення). Введення / вихід здійснюється через стандартний код-гольф вводу / виводу .

Інший приклад виведення для 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 запитав, який розмір цілого вводу має підтримувати програма. Не існує жорсткого мінімуму, окрім прикладів; Дійсно, розмір виходу збільшується експоненціально, приблизно моделюючи: рядки = 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

Я змінив ваше формулювання, щоб дозволити введення-виведення через аргументи функцій, підказки та інші методи вводу-виводу, які зазвичай вважаємо прийнятними.
lirtosiast

@TimmyD, розмір виходу зростає досить вибухово, так що не практично намагатися пробувати m і n минуле кілька сотень, не кажучи вже про 2 ^ 31-1.
cuniculus

Відповіді:


7

Піт, 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|n0 (Фальсі).

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

Хаскелл, 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одно m. unlinesі init$tail$showстворити необхідний вихідний формат.


3

Діялог APL , 33 байти

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

Бере m як лівий аргумент, nяк правий аргумент.

Майже половина (між {і ) призначена для необхідного форматування.


2

Математика, 65 байт

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

IntegerPartitionsвиконує завдання. Решта - лише замовити кортежі та відформатувати результат.


2

Пітон 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 лайнером протягом певного часу. :)


1

Пітон 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та після коми.
Олексій А.

1

Джулія, 105 байт

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

Це функція, яка зчитує два цілі аргументи і записує результати в STDOUT за допомогою одного каналу кінцевих рядків.

Безголівки:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.