两个列表的笛卡尔积


14

任务

给定两个字符列表,输出其笛卡尔积,即,第一个列表中每个字母与第二个列表中每个字母的配对列表。

"123456""abcd"给出:

[["1","a"],["1","b"],["1","c"],["1","d"],["2","a"],["2","b"],["2","c"],["2","d"],["3","a"],["3","b"],["3","c"],["3","d"],["4","a"],["4","b"],["4","c"],["4","d"],["5","a"],["5","b"],["5","c"],["5","d"],["6","a"],["6","b"],["6","c"],["6","d"]]

输入值

两个字符或字符串列表。所使用的字符将是字母数字字符,a-z, A-Z, 0-9并且一个字符可以出现两次,并且可以同时出现在两个输入中。

输出量

输入列表的笛卡尔积。即,列出来自第一列表的字符和来自第二列表的字符的每个可能有序对的列表。每对都是两个字符或两个长度为一的字符串的列表或字符串或类似内容。输出的长度将等于输入长度的乘积。

对必须按顺序列出;首先列出第一个列表的第一个字符与第二个列表的第一个,然后是第一个列表的第一个字符的所有配对。最后一对由第一个列表的最后一个字符和第二个列表的最后一个字符组成。

输出必须是对的平面列表;不是2D矩阵,其中按对的第一个或第二个元素进行分组。

测试用例

inputs               output

"123456", "abcd"     [["1","a"],["1","b"],["1","c"],["1","d"],["2","a"],["2","b"],["2","c"],["2","d"],["3","a"],["3","b"],["3","c"],["3","d"],["4","a"],["4","b"],["4","c"],["4","d"],["5","a"],["5","b"],["5","c"],["5","d"],["6","a"],["6","b"],["6","c"],["6","d"]]
"abc", "123"         [["a","1"],["a","2"],["a","3"],["b","1"],["b","2"],["b","3"],["c","1"],["c","2"],["c","3"]]
"aa", "aba"          [["a","a"],["a","b"],["a","a"],["a","a"],["a","b"],["a","a"]]

@Adám已更改。我在措辞上有麻烦,尽管说输入字符串中的重复字符会并且应该在输出中导致重复对(假设这就是它的解释方式)。
xnor

如果对的顺序固定,@xnor可能会更容易?
亚当

为什么标题说“列表”,而正文说“字符列表”?
Leaky Nun

只需确保:["1a", "1b", "1c", "2a", "2b", "2c", "3a", "3b", "3c"]有效的输出格式?
毛茸茸的

1
您将此标签为“ code-golf最短答案”。在平局的情况下,第一个回答达到这一分数通常是赢家(目前这一个)。不过,至少要再等几天,然后再接受答案,如果有的话。并在此处查看有关回答自己的问题的指南。
毛茸茸的

Answers:




7

Mathematica,12个字节

Tuples@{##}&

将两个字符列表作为输入。


1
相同长度:Tuples@*List或者,如果允许任意头:Tuples@*f
CalculatorFeline

5

APL(Dyalog),4个字节

,∘.,

在线尝试!

, 展平

∘. 笛卡尔

, 级联


我认为flatten这里不是一个很好的描述,因为展平会产生错误的结果,我认为“收紧”或“降低等级”或类似的方法应该起作用。(平移的[1,2] x [1,2]为[1,1,1,2,2,1,2,2])
Zacharý17年

4

红宝石30 18字节

约旦的-12个字节使我想起了使用该规范对我有利的一种方式!

将字符列表作为输入。

->a,b{a.product b}

在线尝试!


1
规范说输入是“两个字符或字符串列表”,所以我认为您不需要.chars
约旦

1
浏览器不讲红宝石,这是一种耻辱。如此友好的语言..
alexandros84

4

Perl 6、4个字节

&[X]

这只是对内置交叉产品运算符的参考X。它适用于任何类型的列表,而不仅仅是字符。




3

Tcl,60个字节

proc p x\ y {lmap X $x {lmap Y $y {lappend l $X\ $Y}};set l}

用:

% p {1 2 3} {a 2 2}
{1 a} {1 2} {1 2} {2 a} {2 2} {2 2} {3 a} {3 2} {3 2}

3

JavaScript(ES6),45 36 34 33字节

需要Firefox。将两个输入都当作字符串或单个字符的数组。

a=>b=>[for(x of a)for(y of b)x+y]

尝试一下

f=
a=>b=>[for(x of a)for(y of b)x+y]
oninput=_=>console.clear()&console.log(f(i.value)(j.value))
console.log(f(i.value="123456")(j.value="abcd"))
<input id=i><input id=j>


销毁也适用于字符串。
尼尔

谢谢,@ Neil; 更改我使用的方法后,忘记更新该信息。
毛茸茸的

x+y有效的输出格式吗?
尼尔

@Neil:那就是我本来打算做的,但是从测试用例来看,这似乎是无效的;但是,在重新读取输出要求后,它们似乎表明确实如此。我要求澄清以确保。
毛茸茸的

1
@ alexandros84:是的,ES6(+)对于要在高尔夫比赛中获得极小的竞争机会的人来说至关重要-在您键入时function,您已经迷路了!稍后,我将针对您的答案提出一些建议,但与此同时,请看一下编辑历史记录中的原始数组映射解决方案;您应该能够轻松解决此问题,然后将箭头功能替换为“真实”功能。
毛茸茸的



2

QBIC,29个字节

[_l;||[_l;||?_sA,a,1|+_sB,b,1

这会打印2字符的字符串,所有组合都在一行上。

说明

   ;      Read in string A$
 _l |     Get its length as b
[    |    and kick off a FOR-loop from 1 to that
[_l;||    Do the same for B$
          Note that, while the FOR-loop may pass this code several times, the
          'read-from cmd line' is done only once.
?_sA,a,1| PRINT the character from A$ at the position of the 'a' loop counter
+_sB,a,1   concatenated with the char from B$ at the pos of the 'b' loop counter


2

MATL,2个字节

Z*

*是产品的通用运算符,前缀Z使它成为笛卡尔乘积,并且可以接受两个字符串作为参数。

在线尝试!








1

Python 2,39个字节

lambda x,y:[[i,j]for i in x for j in y]

在线尝试!

替代解决方案,34 30字节

-4个字节感谢Anders Kaseorg。

有一个内置的...

from itertools import*
product

30个字节:from itertools import*;product
Anders Kaseorg



1

视网膜,49字节

.(?=.*¶(.+))
$1$&¶
¶¶.+
¶
.(?=.*(.)¶)
$1$&¶
¶.¶
¶

在线尝试!在单独的行上输入。说明:

.(?=.*¶(.+))
$1$&¶

第一个字符串中的每个字符都会产生一个单独的行,并以第二个字符串为前缀。

¶¶.+
¶

原始的第二个字符串将被删除。

.(?=.*(.)¶)
$1$&¶

对于第一个字符串中的每个字符,第二个字符串中的每个字符都会生成以第一个字符为前缀的单独行。

¶.¶
¶

第一个字符串中剩余的字符将被删除。


1

q / kdb +,5个字节

解:

cross           / yup, there's a built-in to do exactly this

例:

q)"123456"cross"abcd"
"1a"
"1b"
"1c"
"1d"
"2a"
"2b"
"2c"
"2d"
"3a"
"3b"
"3c"
"3d"
"4a"
"4b"
...etc

1

木炭8 7字节

FθEη⁺ικ

在线尝试!链接是详细版本的代码。说明:变量θη隐式引用两个输入字符串。该命令在第一个输入的每个字符上循环,而该命令在第二个输入的每个字符上映射,从而将loop变量ι和map变量连接在一起κ,其结果隐式打印在单独的行上。


这似乎是19个字节。
CalculatorFeline

@CalculatorFeline木炭有其自己的代码页
尼尔

1

R,29个字节

function(x,y)outer(x,y,paste)

在线尝试!

请注意,R矩阵是按列填充的,因此结果是按规范指定的顺序。

如果允许factors输入和输出,则有一个内置的...,但是需要从因子中提取结果级别,因此最终将超过29个字节。

R,11个字节

interaction

在线尝试!



1

C#7,78 63字节

(a,b)=>$"({string.Join(",",a.SelectMany(x=>b,(x,y)=>(x,y)))})";

这既不是完整的程序也不是函数
仅支持ASCII

您应该编写完整的程序或函数,而不要编写代码段。
穆罕默德·萨尔曼

我刚刚改变了。但是此页面上的许多答案都不是完整的程序或功能。不知道为什么要挑出这个。
Dennis_E

顺便说一句,这就是为什么我不喜欢打高尔夫球的原因。
Dennis_E

由于这是一个函数,因此您可以直接返回输出字符串,而不必将其写入屏幕,我认为这可以节省约20个字节。
sundar-恢复莫妮卡
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.