生成替换组合


10

列出所有的与大小的替换(或它们的组合与重复)的组合ķ从一组Ñ元件。

带替换的组合是一个无序的多集,其中的每个元素也都在n个元素的集合中。注意:

  • 它是无序的。因此,不应再打印先前打印的具有不同顺序的集。
  • 这是一个多集。同一元素可以(但不是必须)出现多次。这是替换组合与普通组合之间的唯一区别。
  • 该集合应恰好具有k个元素。

替代地,它也是包含kn个元素中的每一个的多集的大小为k的子集。

输入应该是nk,其中元素是前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]

Answers:


8

果冻,4个字节

感谢Sp3000节省2个字节。

ṗṢ€Q

输入is nk作为命令行参数。使用元素1n

在线尝试!

说明

ṗ     # Get k-th Cartesion power of n.
 Ṣ€   # Sort each tuple.
   Q  # Remove duplicates.

8

CJam(8字节)

{m*:$_&}

在线演示

解剖

{    e# Declare block (anonymous function); parameters are n k
  m* e# Cartesian product, which implicitly lifts n to [0 1 ... n-1]
  :$ e# Sort each element of the Cartesian product, to give them canonical forms
  _& e# Deduplicate
}

3

Mathematica,31个 29字节

感谢A Simmons节省2个字节。

{}⋃Sort/@Range@#~Tuples~#2&

一个未命名的函数,该函数按顺序将nk作为整数参数,并返回列表列表。该元素将1n。原理与Peter的CJam答案相同。


@ jimmy23013我认识的人都不多。
Martin Ender'3

我想你可以节省两个字节用{}∪Sort/@Range@#~Tuples~#2&
西蒙斯

@ASimmons好主意,谢谢!
马丁·恩德

3

MATL,11个字节

(有一个基于笛卡尔幂的9字节解决方案,但是Peter Taylor 已经做到了。让我们尝试一些不同的东西)。

可以将具有替换的组合减少为无需替换的组合,如下所示。我们希望n Cr k,例如用n=3k=2

0 0
0 1
0 2
1 1
1 2
2 2

我们可以计算n+k-1 C k

0 1
0 2
0 3
1 2
1 3
2 3

然后0 1 ... k-1从每一行中减去:

+q:2GXn2G:-

说明:

+q     % take two inputs n, k and compute n+k-1
:      % range [1,2...,n+k-1]
2G     % push second input, k
Xn     % combinations without replacement
2G:    % range [1,2,...,k]
-      % subtract with broadcast. Display

该代码可在语言/编译器的13.1.0版中使用,它早于挑战。

您可以在线尝试!请注意,在线编译器已更新至版本14.0.0,因此Xn需要更改为XN


3

JavaScript(Firefox 30-57),71个字节

f=(n,k)=>k?[for(m of Array(n).keys())for(a of f(m+1,k-1))[...a,m]]:[[]]

我可以使用keys()一次。


2

Ruby,56 55字节

两个解决方案,长度都令人惊讶地相同:

->n,k{[*1..n].repeated_permutation(k).map(&:sort).uniq}
->n,k{(a=[*1..n]).product(*[a]*(k-1)).map(&:sort).uniq}

嘿,您确实说过我们可以使用置换内置函数...

这只会生成所有重复的排列(第二个生成重复的笛卡尔积),并删除未排序的排列。

感谢Martin用0...n-> 节省了一个字节1..n


1

Pyth,7个字节

{SM^UQE

使用与彼得的答案相同的算法。

    UQ   range(input())
      E  input()
   ^     repeated Cartesian product of ^^, ^ times
 SM      map(sort)
{        uniq

1

Python,63个字节

f=lambda n,k:n*k and[l+[n]for l in f(n,k-1)]+f(n-1,k)or[[]][k:]

递归方法。为了使一个多重k元素,1n,我们选择是:

  • 包含的另一个实例n,它仍然会k-1构成从1到的多个元素集n
  • 不包括的另一个实例n,它仍然做出的一个多重k元素从到1n-1

我们在kn到达时终止0,如果k到达0,则给出空列表的基本情况。如果不是,则我们的元素数量错误,因此请提供空白列表。


1

Python 3、81 80

递归解决方案:

t=lambda n,k,b=0:[[]]if k<=0 else [[i]+l for i in range(b,n)for l in t(n,k-1,i)]

该函数t(n, k, b)返回k范围从b到的全元素多子集的列表n。这个列表是空的,如果k <= 0。否则,我们将根据多子集的最小元素分解问题,用表示i

对于每一个i在从所述范围bn,我们生成所有的k-多亚群的最小元素i通过与开始[i],然后追加各(k-1)范围的-多子集从in,我们通过递归调用获得t(n, k-1, i)


欢迎来到编程难题和代码高尔夫球!这是一个不错的第一答案。您能否解释一下代码的工作原理?
Alex A.

看起来很棒。不错的解决方案!
Alex A.

1

Dyalog APL,22字节

{∪{⍵[⍋⍵]}¨↓⍉⍺⊥⍣¯1⍳⍺*⍵}

Requires ⎕IO←0,这是许多APL系统中的默认设置。以k为左参数,n为右参数。

⍳⍺*⍵0 1 2 ...kⁿ
⍺⊥⍣¯1转换为基数k
转置
矩阵,使矩阵成列表,
{⍵[⍋⍵]}¨对每个列表进行排序...
唯一


1

J,18个字节

[:~.#~<@/:~@#:i.@^

@Adám 解决方案中使用的类似方法。

使用笛卡尔积的另一种方法{为24字节。承担kLHS和nRHS。

~.@:(/:~&.>)@,@{@(#<@i.)

用法

   f =: [:~.#~<@/:~@#:i.@^
   4 f 2
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│0 0│0 1│0 2│0 3│1 1│1 2│1 3│2 2│2 3│3 3│
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘

说明

[:~.#~<@/:~@#:i.@^ Input: n on LHS and k on RHS
                 ^ Compute n^k
              i.@  Create a range [0, 1, ... n^k-1]
    #~             Create k copies on n
            #:     On each value in the range above, convert each digit to base-n
                   and take the last k digits of it
        /:~@       For each array of digits, sort it in ascending order
      <@           Box each array of digits
[:~.               Take the distinct values in the array of boxes and return it

1

Clojure,94个字节

(defn f[k n](if(= 1 k)(for[i(range n)][i])(sort(set(for[i(f(dec k)n)j(range n)](conj i j))))))

注意更改后的参数顺序:1st是k和2nd是n。节省了1个字节(f(dec k)n)


0

Mathematica,36个字节

{##}&~Array~Table@##~Flatten~(#2-1)&

告诉我,不使用[]会得到1/6的奖金...或者可能是##的许多用途?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.