将一个集合分成两对

问题描述 投票:2回答:3

在列表按两个分组后,我需要在列表中找到一对匹配元素。

1 1 2 3 2 2将返回1 1 2 2,但1 2 2 1将不返回任何东西,因为这两个人将在不同的盒子里。

我的想法是创建盒子,然后应用一个蒙版来获得匹配对,但我无法弄清楚成对拳击步骤。我怎么做成对拳击?

(我的问题的另一个解决方案也很有趣,但我对成对拳击解决方案感兴趣)

j
3个回答
2
投票

通常,在处理可变大小列表的情况下最好使用框。如果不是这种情况,最好避免它们提高性能(提高速度和减少空间)。此版本不使用框:

   _2 ,@(]\ #~ =/\) 1 1 3 4 2 2
1 1 2 2
   _2 ,@(]\ #~ =/\) 1 2 2 1

1
投票

基于Bob的答案,您可以在Infix (\) adverb上对值对应用条件谓词:

   _2 =/\ 1 1 2 3 2 2
1 0 1

应用此条件并以盒装结果结束的简单方法如下,假设您需要将结果装箱(在此简单示例中不是这样):

   ((_2 =/\ ]) # _2 <\ ]) 1 2 2 1

   ((_2 =/\ ]) # _2 <\ ]) 1 1 2 3 2 2
┌───┬───┐
│1 1│2 2│
└───┴───┘

如果不清楚,上面用括号(_2 =/\ ])计算条件。 fork规则应用_2 <\ ]来装箱对,然后选择与f # g前叉匹配条件结果的方框。


1
投票

这应该工作。

   _2 ]\ 1 2 2 1
1 2
2 1

它基于称为Infix的二元游戏。更多关于此链接:http://www.jsoftware.com/help/dictionary/d430.htm

要打包,只需将副词\应用于动词<

   _2 <\ 1 2 4 5 4 6 2 1
+---+---+---+---+
|1 2|4 5|4 6|2 1|
+---+---+---+---+
© www.soinside.com 2019 - 2024. All rights reserved.