列表本身的n次的笛卡尔积


10

当给定一个值列表和一个正整数时n,您的代码应输出该列表的笛卡尔乘积及其n时间。

例如,使用伪代码,您的函数可能类似于:

for x1 in list:
    for x2 in list:
        for x3 in list:
            ...
            for xn in list:
                print x1, x2, x3, ... , xn

例:

repeated_cart([1,2,3], 3)

1 1 1  
1 1 2  
1 1 3  
1 2 1  
1 2 2  
1 2 3  
1 3 1  
1 3 2  
1 3 3  
2 1 1  
2 1 2  
2 1 3  
2 2 1  
2 2 2  
2 2 3  
2 3 1  
2 3 2  
2 3 3  
3 1 1  
3 1 2  
3 1 3  
3 2 1  
3 2 2  
3 2 3  
3 3 1  
3 3 2  
3 3 3

不允许使用计算笛卡尔乘积(或幂)的内置函数(或来自导入库的函数),因为生成的代码有些无聊。

输入和输出应定界,但可以采用任何合理的方法。

给定输出的顺序无关紧要,但不允许重复。

这是我第一次发布问题,因此,如果我做任何可怕的错误,请告诉我。


5
欢迎来到PPCG!没什么大不了的,但是花点时间看一下这个meta帖子和答案。编写挑战
时应

4
并遵循@JayCe的观点,您可以(应该)在“沙盒”中发布以获取反馈,然后再发布问题:-)
朱塞佩

@Giuseppe好吧,我从现在开始,谢谢:)
JoshM


1
@Jakob套应该很好
JoshM '18年

Answers:



6

普通Lisp,146字节

(defun f(l n)(if(< n 2)(loop for x in l collect(list x))(loop for a in l nconc(loop for b in(f l(1- n))collect(cons a b)))))(princ(f(read)(read)))

在线尝试!

不打高尔夫球

(defun nloops (lst n)
  (if (< n 1)
      '(())
      (if (< n 2)
          (loop for x in lst collect (list x))
          (loop for a in lst
                nconc (loop for b in (nloops lst (1- n))
                            collect (cons a b))))))

2
通常,我们建议您等待其他提交,然后再发布自己的一个:-)
朱塞佩(Giuseppe)

1
@Giuseppe好,谢谢您的建议:)
JoshM '18

1
您无需在提交中包含打印语句,因为允许使用功能
ASCII

1
因此:96
仅使用ASCII码


6

R,41个字节

function(l,n)unique(t(combn(rep(l,n),n)))

在线尝试!

combn绝对不是内置的笛卡尔积,因为它计算n输入的所有组合。

R,40个字节

function(l,n)expand.grid(rep(list(l),n))

在线尝试!

expand.grid 可能是内置的笛卡尔积。


看起来主提交中的排列顺序是错误的。
Kirill L.

@KirillL。订单重要有特定原因吗?我认为输出规范足够灵活,可以按任何顺序进行输出。
朱塞佩

OP的注释为“确保输出顺序正确”,我认为“正确”的含义与示例相同。
Kirill L.

@KirillL。啊。没看到 它不是问题的主体,所以我不知道它的存在!我要求将它放在那里进行澄清。
朱塞佩


3

K(ngn / k),10个字节

{x@+!y##x}

在线尝试!

{ }是参数的函数xy

#x 的长度 x

y##xx重复y次数的长度

!y##x 所有0,1,...,length(x)-1以上的length-y元组作为转置矩阵

+ 转置

x@x这些索引的元素


3

APL(Dyalog Classic)18 12字节

{⍺[↑,⍳⍵⍴≢⍺]}

在线尝试!

-6个字节,感谢@ngn!


可以将其与向量参数一起使用以生成索引,然后⍺[ ]获取相应的值
ngn

RANK ERROR当我尝试这样做时,我得到了。
扎卡里


唯一的捕获是⍵= 1,在这种情况下,⍳返回一个纯向量,而不是一个嵌套的长度为1的向量。这是出于向后兼容的原因而从未修复的bug之一
ngn,



3

红宝石,53个字节

f=->l,n{n<2?l:l.flat_map{|i|f[l,n-1].map{|j|[i,*j]}}}

在线尝试!

递归方法,虽然不那么短,但是可以保证没有任何内置函数。

使用置换方法很诱人,但这可能不算在内,尽管实际上似乎可行,但文档实际上并未保证顺序正确性的保证:

红宝石,35字节

->l,n{[*l.repeated_permutation(n)]}

在线尝试!



2

球拍,92字节

(define(f l n)(if(> n 0)(apply append(map(λ(r)(map(λ(e)(cons e r))l))(f l(- n 1))))'(())))

在线试用

不打高尔夫球

(define (f l n)
    (if (> n 0)
        (apply append
            (map
                (λ (r)
                    (map (λ (e) (cons e r)) l)
                )
                (f l (- n 1))
            )
        )
        '(())
    )
)

2

果冻11 9 7个字节

³;þẎƊ’¡

在线尝试!

说明

³;þẎƊ’¡
³;þẎ    **Implements** the cartesian product of a value with the input
    Ɗ   Groups those together
     ’¡ Repeat (n-1) times

看OP的评论:对
扎卡里

我对此提出的评论是:“我还假设整个挑战的内建函数也被禁用,”所以我只是认为这是可以的。
扎卡里

好吧,让我们等待OP然后
扎卡里

@Zacharý对不起,不允许使用笛卡尔幂函数
JoshM

3
我不知道,两个嵌套的for循环基本上就是笛卡尔积的定义。我并不是说您应该更改它,我只是想知道在此挑战中禁止内置功能尚不清楚。
迪南2018年

2

Bash(无外部实用程序),57

printf -vn %0$1d
a=${n//0/{$2\}}
eval echo ${a//\}{/\},{}

输入作为命令行参数给出;第一个是n,第二个是逗号分隔的列表。

printf -vn %0$1d         ;# Create a string of n "0"s in the variable v
a=${n//0/{$2\}}          ;# Replace each "0" with "{a,b,...m}"
eval echo ${a//\}{/\},{} ;# Replace each "}{" with "},{" and evaluate the resulting brace expansion

在线尝试!


2

Java 10、19 + 135 = 154字节

import java.util.*;

List<List>f(Set l,int n){var o=new Stack();if(n<1)o.add(new Stack());else for(var t:l)for(var i:f(l,n-1)){i.add(t);o.add(i);}return o;}

在线试用

不打高尔夫球

List<List> f(Set l, int n) {
    var o = new Stack();
    if (n < 1)
        o.add(new Stack());
    else
        for (var t : l)
            for (var i : f(l, n - 1)) {
                i.add(t);
                o.add(i);
            }
    return o;
}

致谢

  • 凯文·克鲁伊森(Kevin Cruijssen)移植到Java 10

如果您使用Java 10而不是8,你可以改变Object,并List在换每个循环来var为-4个字节。此外,您可以更改Set<List>fList<List>fSet o=new HashSet();var o=new Stack();额外-1字节。在线尝试。
凯文·克鲁伊森

嗯 遗漏了lambda的类型,这些类型不再有效
ASCII码,仅ASCII

仅限@ASCII,否,允许使用无类型的lambda。我无法在此处使用lambda,因为该解决方案使用了递归。
雅各布

@Jakob啊,没错> _>
ASCII

2

Oracle SQL,177字节

创建一个收集类型(31个字节):

CREATE TYPE t IS TABLE OF INT;

然后使用查询(146个字节):

WITH n(a,b,c)AS(SELECT a,b,t()FROM i UNION ALL SELECT a,b-1,c MULTISET UNION t(COLUMN_VALUE)FROM n,TABLE(n.a)WHERE b>=0)SELECT c FROM n WHERE b=0

假设输入参数在表中i包含列ab

CREATE TABLE i (a t,b INT) NESTED TABLE a STORE AS t_a;
INSERT INTO i VALUES ( t(1,2,3), 3 );

SQL小提琴

结果

|     C |
|-------|
| 1,1,1 |
| 1,1,2 |
| 1,1,3 |
| 1,2,1 |
| 1,2,2 |
| 1,2,3 |
| 1,3,1 |
| 1,3,2 |
| 1,3,3 |
| 2,1,1 |
| 2,1,2 |
| 2,1,3 |
| 2,2,1 |
| 2,2,2 |
| 2,2,3 |
| 2,3,1 |
| 2,3,2 |
| 2,3,3 |
| 3,1,1 |
| 3,1,2 |
| 3,1,3 |
| 3,2,1 |
| 3,2,2 |
| 3,2,3 |
| 3,3,1 |
| 3,3,2 |
| 3,3,3 |

1

重击,61字节

N=$1
shift
IFS=,
printf echo\\t%${N}s ""|sed "s/ /{$*},/g"|sh

在线尝试!我发现在bash中很难重复字符串和用逗号加入列表。


1

Javascript(节点),75字节

c=(m,n,a,i)=>a.length-n?m.map((_,j)=>c(m,n,[...a,m[j]],i+1)):console.log(a)

将列表输出到控制台的递归函数。这里a是一个空数组,并且i为0(不确定是否仍然合格):

c([1,2,3], 3, [], 0);

在线尝试!


1
我认为您必须这样做(m,n,a=[],i=0)=>
Artyer


1

J,17个字节

]{~(##)#:#@]i.@^[

怎么运行的?

n用列表的长度枚举数字系统中的所有-digit数字。

            i.         - creates a list from zero to (not including)
         #@]           - the length of the list 
              @^       - to the power of
                [      - n (left argument)
   (##)                - creates a list of n times the length of the list (for the bases)
       #:              - converts all the numbers into lists of digits in the new base
]{~                    - use the digits as indices into the list

在线尝试!




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.