数组元素之间的所有非有序对


11

任务:

返回具有数组元素之间所有可能对的数组。

a=["a", "b", "c", "d"];b=[["a","b"],["a","c"],["a","d"],["b","c"],["b","d"],["c","d"]]

对可以是任意顺序,只要包括所有可能的组合,并且显然["b","d"]与相同即可["d","b"]

输入值

由类中的char组成的唯一字符串元素数组[a-z]

输出量

包含所有可能的输入数组元素对的2d数组。

测试用例

input=["a","b","c"];
//output=[["a","b"],["a","c"],["b","c"]]

input=["a","b","c","d","e"];
//output=[["a","b"],["a","c"],["a","d"],["a","e"],["b","c"],["b","d"],["b","e"],["c","d"],["c","e"],["d","e"]]

注:我找不到一个重复这一挑战。如果有一个,请在评论中提醒我删除问题。


2
我不清楚输入值重复或未按排序顺序时会发生什么。一些更通用的测试用例会有所帮助。
xnor

@Adám不是骗子,涉及2个列表。
Xcoder先生17年

此问题排除了将元素与自身配对,甚至不再重复。
CalculatorFeline

@xnor没有考虑重复值,因为我最初的工作问题与一组独特的个体有关。我想我应该添加唯一性作为条件?
alexandros84

@ alexandros84唯一可以。应该["c","b","a"]返回什么?
xnor

Answers:



8

Haskell,29个字节

f(a:b)=map((,)a)b++f b
f _=[]

在线尝试!用法示例:f ["a","b","c"]yields [("a","b"),("a","c"),("b","c")]


使用该标志-XTupleSections可以将其缩短为27个字节,但是该标志需要计数:

f(a:b)=map(a,)b++f b
f _=[]

在线尝试!


我认为您可以将be case修改为,以节省一个字节f l=l
Kritzefitz

@Kritzefitz恐怕这将无法正常工作,因为两个空列表的类型不同,因此Haskell的类型检查器会抱怨。
Laikoni

好点子。我没想到。
Kritzefitz


6

Haskell,25个字节

f l=[(x,y)|x<-l,y<-l,x<y]

在线尝试!

外部(x)和内部(y)在输入列表中循环并(x,y)仅在出现时保持该对x < y



5

vim,50 48

AX<esc>qqYplX@qq@qqrYpllDkxh@rq:g/./norm@r<cr>:g/X/d<cr>dG

以表格形式输入

abcd

并输出为

ad
ac
ab
bd
bc
cd

说明

首先,AX<esc>将a附加X到输入中以处理2长度输入,这是必要的,原因很快就会变得很清楚。

然后是形式的第一个递归宏qq...@qq@q。(记录宏q,在末尾再次运行,结束记录,然后运行一次。)在宏的主体中,Yp复制当前行,l如果该行现在是一个字符长,则跳出宏,然后X删除该行的第一个字符。这产生了最终结果

abcdX
abcX
abX
aX
X
X

X现在忽略s,我们要做的就是abcdX例如将变成ab / ac / ad / aX。这是通过第二个递归宏实现的qr...@rq

在此宏中,我们首先复制行(Yp),然后通过向右移动两个(ll)并删除至行(D)的末尾,删除除前两个字符以外的所有字符。由于光标现在位于该行kx的第二个字符上,因此将从前一行删除第二个字符,而该字符恰好与该行的第一个字符配对。然后h,由于宏的递归性质,从行()的开头再次重复此过程,次数必要。

现在,只需在每行上运行宏即可,这可以通过:g/./norm@r(我不确定为什么它的行为不同于:%norm@r,但是可以说,后者不能按预期运行)X来实现:g/X/d。并r清除了由于宏的构建而导致的左端的空行dG


好答案。我需要一些时间来完成它。
alexandros84



4

Brachylog,5个字节

{⊇Ċ}ᶠ

在线尝试!

这个怎么运作

{⊇Ċ}ᶠ
    ᶠ   find all the possible outputs of the following predicate
 ⊇          the output is an ordered subset of the input
  Ċ         the output is a list with two elements



3

八度 49 48字节

@(x)[imag(y=(y=triu(x+j*x',1))(~~y)) real(y) '']

避免内置(nchoosek)的匿名函数。

在线尝试!

说明

x+j*x' 使用广播来构建复数矩阵,其中实部和虚部都是来自输入的所有代码点对 x

y=triu(...,1)保持不包括对角线的上三角部分,使其余元素为零。结果分配给变量y

y=(...)(~~y) 保留列向量形式的非零元素,该向量被分配给变量 y

imag(...)real(...)提取实部和虚部。

[... ... ''] 转换回char以构建输出。


真好!整个挑战真的很有趣。我花了大约一个半小时才提出了我的es5代码(如下所示)。我很高兴它产生了很多有趣的答案..
alexandros84







1

JavaScript ES6,52个字节

a=>a.map((x,i)=>a.slice(0,i).map(y=>[x,y])).slice(1)

如果有这样的话flatMap,将节省很多字节。


嘿,好答案!如果您愿意,请在我研究您的es5时查看我的es5答案。任何反馈将不胜感激(积极/建设性的哈哈)
alexandros84'6

1
Firefox 30的数组解析可以模拟平面图,例如a=>[for(x of[...a])for(y of(a.shift(),a))[x,y]]
尼尔

@Neil,那里有一些非常高级的语法...我必须至少在Google上搜索三件事才能开始理解您的表达。即散布运算符,什么是数组推导,最后的[x,y]是什么(仍然没有找到答案)。
alexandros84

1
@ alexandros84 [x,y]最后一点很简单,它只是一个数组文字。
尼尔

1
此外,由于我在循环内对其进行了变异,所以散布运算符仅在此处复制阵列。
尼尔

1

Python,55个字节

f=lambda s:[(s[0],j)for j in s[1:]]+f(s[1:])if s else[]

在线尝试!

比其他Python答案更长,但是它使用了不同的技术,因此我认为值得发布。


没有时间检查,我希望这真的是另一种技术,因为我对此表示反对。
alexandros84

我认为这与@ovs的Python 3答案非常相似。
尼尔




1

Clojure,42个字节

#(set(for[i % j(remove #{i}%)](set[i j])))

返回一组集合:)


1

Python,74个字节

f=lambda a:[(c,d) for i,c in enumerate(a) for j,d in enumerate(a) if i<j]

1
欢迎来到PPCG!您可以进行以下操作:1)用1个字符替换2个字符的变量名2)删除不必要的空格3)这是一个代码段,您需要使其成为lambda,函数或完整程序
Erik the Outgolfer

打高尔夫球的10个字节:64个字节
Xcoder先生17年

1

Javascript(ES 5),从108到78字节

我今天发布了答案,但显然我承诺不会接受自己的答案:

x=input;
a=[];

for(n=0;n<(x.length-1);n++){for(i=n+1;i<(x.length);i++){a.push([x[n],x[i]]);}}

1
欢迎来到PPCG;我们希望提交的内容能够得到解决,包括消除不必要的空白
HyperNeutrino

泰 我也在想:我是否应该包含x = input?a = []; 在我的回答与否?我明天编辑。
alexandros84

您可以只提交功能或完成整个程序。自使用以来a,您需要对其进行定义,但是可以使用的功能x
HyperNeutrino

现在好多了@HyperNeutrino。
alexandros84

1
我认为您可以排除一些分号和空行以节省空间。我也认为您可以更改for(i=n+1;i<(x.length);i++)for(i=n;++i<x.length;)。同样,您可以更改n<(x.length-1);n++n++<x.length-1
musicman523 '17

0

J,17个字节

({~$#:I.@,)#\</#\

在线尝试!

说明

({~$#:I.@,)#\</#\  Input: string S
               #\  Get the length of each prefix of S
           #\      Get the length of each prefix of S again
             </    Test using greater than (<) between each
         ,         Flatten
      I.@          Find the indices where the value is 1
   $               Shape of that table
    #:             Convert the indices to the base represented by the shape
 {~                Index into S at those values
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.