一种非尴尬的方式来链接"在J?

时间:2017-10-26 20:31:41

标签: j

这种情况经常发生,我总是发现自己正在与之作斗争。所以我想要最终的解决方案,如果有的话。

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

  1. J喜欢使用同类列表/表等(例如,没有包含不同长度项目的列表,例如)
  2. 有时您希望将动词应用于列表的每个项目,其中动词的结果本身就是一个项目数量不同的列表。
  3. 这通常使用函数式语言中的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. 上述两件事模糊了我们代码的意图。
    4. 使用{的解决方案存在类似问题。

      如果...

      会很好

      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用其他语言解决的一般问题的解决方案

2 个答案:

答案 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