Перечислите все комбинации с заменой (или комбинации с повторением) размера k из набора из n элементов.
Комбинация с заменой является неупорядоченным мультимножеством, что каждый элемент в нем также находится в наборе из n элементов. Обратите внимание, что:
- Это неупорядочено. Поэтому ранее напечатанный набор с другим порядком не должен быть напечатан снова.
- Это мультимножество. Один и тот же элемент может (но не обязательно) появляться более одного раза. Это единственная разница между комбинацией с заменой и нормальной комбинацией.
- Множество должно иметь ровно k элементов.
Альтернативно, это также подмножество размера k мультимножества, которое содержит каждый из n элементов k раз.
Входные данные должны быть либо n и k , где элементы - это первые n положительных или неотрицательных целых чисел, либо n элементов и k , где можно предположить, что все n элементов отличаются друг от друга.
Выходными данными должен быть список всех комбинаций с заменой размером k из заданного набора. Вы можете распечатать их и элементы в каждом из них в любом порядке.
Вы не можете использовать встроенные генерирующие комбинации с заменой. Но вы можете использовать встроенные функции для генерации нормальных комбинаций, перестановок, кортежей и т. Д.
Это код-гольф, самый короткий код выигрывает.
пример
Input: 4 2
Output: [0 0] [0 1] [0 2] [0 3] [1 1] [1 2] [1 3] [2 2] [2 3] [3 3]
источник
{}∪Sort/@Range@#~Tuples~#2&
MATL , 11 байт
(Существует 9-байтовое решение, основанное на декартовой мощности, но Питер Тейлор уже сделал это . Давайте попробуем что-то другое).
Комбинации с заменой могут быть сведены к комбинациям без замены следующим образом. Мы хотим , чтобы
n Cr k
, например , сn=3
,k=2
:Мы можем вычислить
n+k-1 C k
:а затем вычтите
0 1 ... k-1
из каждой строки:Объяснение:
Код работает в версии 13.1.0 языка / компилятора, который является более ранним, чем вызов.
Вы можете попробовать это онлайн! Обратите внимание, что онлайн-компилятор обновлен до версии 14.0.0, поэтому его
Xn
необходимо изменить наXN
.источник
JavaScript (Firefox 30-57), 71 байт
Я использую
keys()
на этот раз.источник
Рубин,
5655 байтДва решения, на удивление оба одинаковой длины:
Эй, ты же сказал, что мы можем использовать встроенные перестановки ...
Это просто генерирует все повторяющиеся перестановки (вторая генерирует повторяющиеся декартовы произведения) и удаляет те, которые не в отсортированном порядке.
Спасибо Мартину за сохранение байта с
0...n
->1..n
!источник
Pyth, 7 байт
Использует тот же алгоритм, что и ответ Питера.
источник
Python, 63 байта
Рекурсивный метод. Для того, чтобы мультимножество
k
элементов,1
кn
, мы выбираем либо:n
, и осталось сделать мультимножествоk-1
элементов из1
вn
n
, и осталось сделать мультимножествоk
элементов от1
кn-1
Мы выключили , когда либо
k
илиn
достигаем0
, и если онаk
достигнута0
, мы даем базовый случай пустого списка. Если нет, то у нас неверное количество элементов, и поэтому выдаем пустой список.источник
Питон 3,
8180Рекурсивное решение:
Функция
t(n, k, b)
возвращает список всехk
многоэлементных подмножеств диапазона в диапазоне отb
доn
. Этот список пуст, еслиk <= 0
. В противном случае мы разбиваем проблему на основе наименьшего элемента мульти-подмножества, который мы обозначаем черезi
.Для каждого
i
в диапазоне отb
доn
мы генерируем всеk
-multi-подмножества с наименьшим элементомi
, начиная с,[i]
а затем добавляя каждое(k-1)
-multi-подмножество диапазона отi
доn
, которое мы получаем рекурсивным вызовомt(n, k-1, i)
.источник
Дьялог АПЛ , 22 байта
Требуется
⎕IO←0
, что по умолчанию во многих системах APL. Принимает k в качестве левого аргумента, n в качестве правого аргумента.⍳⍺*⍵
0 1 2 ... kⁿ⍺⊥⍣¯1
преобразовать в базу k⍉
транспонировать↓
сделать матрицу в список списков{⍵[⍋⍵]}¨
отсортировать каждый ...∪
уникальныйисточник
J, 18 байт
Аналогичный подход используется в @ Адамов растворе .
Другой подход, использующий декартово произведение
{
для 24 байтов. Принимаетk
на LHS иn
на RHS.Применение
объяснение
источник
Clojure, 94 байта
Обратите внимание на измененный порядок параметров: 1-й - это,
k
а 2-й - этоn
. Это спасло 1 байт(f(dec k)n)
.источник
Mathematica, 36 байт
Пожалуйста, скажите мне, что есть бонус 1/6 за использование без [] s ... Или, может быть, за многократное использование ##?
источник