在J中“束缚”的非尴尬方式?

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

这经常发生,我总是发现自己正在与之抗争。所以,如果有的话,我希望有一个确定的解决方案。

基本问题归结为这一冲突:

  1. J喜欢使用同类列表/表格等。(例如,没有列表具有不同长度的项目)
  2. 有时您希望将动词应用于列表的每个项目,其中动词的结果本身就是一个列表,其项目数有所不同。

这通常使用功能语言中的chain(或flat_map)解决。

演示一般问题的示例

举个具体的例子,假设您要列出列表0 1 2 3中所有可能的对,其中第一个严格小于第二个:

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

当然,您可以表,/或目录{来获得完整的叉积,然后进行过滤,因此只剩下上三角形:

即取,"0/~ i.4的结果:

0 0
0 1
0 2
0 3

1 0
1 1
1 2
1 3

2 0
2 1
2 2
2 3

3 0
3 1
3 2
3 3

实际上,为使几何图形更加清晰,让我们将其显示为;/"2 ,"0/~ i.4

┌───┬───┬───┬───┐
│0 0│0 1│0 2│0 3│
├───┼───┼───┼───┤
│1 0│1 1│1 2│1 3│
├───┼───┼───┼───┤
│2 0│2 1│2 2│2 3│
├───┼───┼───┼───┤
│3 0│3 1│3 2│3 3│
└───┴───┴───┴───┘

现在我们寻求的结果是三角形的上半部分。但是这种方法有缺点:

  1. 我们必须将所需工作加倍。
  2. 我们必须引入一个单独的过滤器步骤,以删除我们无法使用的多余结果。
  3. 以上两件事使我们的代码难以理解。

使用{的解决方案有类似问题。

如果...会很好

chain方法看起来像这样:

g=. ,"0 i.
(g 0);(g 1);(g 2);(g"0 i.3);<(<@g"0 (1+i.3))

产生:

┌──┬───┬───┬───┬─────────────┐
│  │1 0│2 0│0 0│┌───┬───┬───┐│
│  │   │2 1│0 0││1 0│2 0│3 0││
│  │   │   │   ││   │2 1│3 1││
│  │   │   │1 0││   │   │3 2││
│  │   │   │0 0│└───┴───┴───┘│
│  │   │   │   │             │
│  │   │   │2 0│             │
│  │   │   │2 1│             │
└──┴───┴───┴───┴─────────────┘

最后两列与我想要的很接近,但是在倒数第二列中,我们有自动填充的麻烦,使我们的结果变得晦涩难懂,在最后一列中,我们将正确的结果装箱,但将其取消装箱会返回填充。

解决这种问题的一种好方法(习惯上是J?)?

NOTE:我不是在示例中寻找该问题的临时解决方案,而是通过chain用其他语言解决的一般问题的解决方案。

j
2个回答
1
投票

我认为此答案对于您想要的内容来说太具体了,但是它确实建议挑战第2部分(可变长度结果)的解决方案是使用each=:&.>,以便可以避免填充。

   (< 0 1 2 3) ;"1@:((],.>#[) each) 0 1 2 3
0 1
0 2
0 3
1 2
1 3
2 3
   (< 0 1 2 3) ((],.>#[) each) 0 1 2 3
+---+---+---+--+
|0 1|1 2|2 3|  |
|0 2|1 3|   |  |
|0 3|   |   |  |
+---+---+---+--+

0
投票

为我的后代问题再添加一个答案。我最近在打高尔夫球时使用的一句话是:

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

例如:

   >@(>:/ #&, {@;)~@i. 3
0 0
1 0
1 1
2 0
2 1
2 2
© www.soinside.com 2019 - 2024. All rights reserved.