删除所有包含一个元素的框

时间:2017-12-01 19:48:57

标签: j

如何删除包含一个元素的所有框?例如。我想转此:

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

进入这个:

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

2 个答案:

答案 0 :(得分:4)

假设您的值在a

   ]a =. 1 1 1; 2 2; 3; 2 2 2
┌─────┬───┬─┬─────┐
│1 1 1│2 2│3│2 2 2│
└─────┴───┴─┴─────┘

这里的技巧是获得每个盒子的长度:

   #@> a
3 2 1 3

如果长度> 1,你得到一个“面具”,你可以传递给copy

   1 < #@> a
1 1 0 1

   a #~ 1 < #@> a
┌─────┬───┬─────┐
│1 1 1│2 2│2 2 2│
└─────┴───┴─────┘

13:会告诉我们如何做出这种默契:

   13 : 'y #~ 1<#@>y'
] #~ 1 < #@>

碰巧,需要将id放在fork的最后位置正是钩子的作用,所以我们甚至可以再简化一步:

   remsingles =. #~ 1 < #@>
   remsingles a
┌─────┬───┬─────┐
│1 1 1│2 2│2 2 2│
└─────┴───┴─────┘

答案 1 :(得分:4)

@ Daniel的回答另一种观点。

过滤列表非常常见,通常的习惯用语是:

(#~ filter)

其中filter是一个动词,为要保留的元素返回1,为要丢弃的元素返回0。在这种情况下,您的过滤器是

(1 < size) for_each_element

size翻译为#,将for_each_element翻译为动词"every"&>),过滤器为

(1 < #) &>

所以,

remsingles =: #~ (1 < #) &>
remsingles a
┌─────┬───┬─────┐
│1 1 1│2 2│2 2 2│
└─────┴───┴─────┘