这种情况经常发生,我总是发现自己正在与之作斗争。所以我想要最终的解决方案,如果有的话。
基本问题归结为这场冲突:
这通常使用函数式语言中的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│
└───┴───┴───┴───┘
现在我们寻求的结果是三角形的上半部分。但这种方法有缺点:
使用{
的解决方案存在类似问题。
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方式)是什么?
注意:我没有在示例中寻找问题的临时解决方案,而是chain
用其他语言解决的一般问题的解决方案
答案 0 :(得分:1)
我认为这个答案对于你想要的东西来说太具体了,但它确实表明挑战的第2部分(可变长度结果)的解决方案是使用vertexShaderSource
以便可以避免填充。
each=:&.>
答案 1 :(得分:1)
为我的后代添加另一个答案。我最近在打高尔夫球时使用的一句话是:
;@(,.&.> <\)@i. 3
0 0
1 0
1 1
2 0
2 1
2 2
另一种稍长的替代方法:
>@(>:/ #&, {@;)~@i.
例如:
>@(>:/ #&, {@;)~@i. 3
0 0
1 0
1 1
2 0
2 1
2 2