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

remove all boxes with one element

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

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

进入这个:

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

假设您的值在 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,你得到一个 "mask" 你可以传递给 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的最后一个位置,这正是hook所做的,所以我们甚至可以再简化一步:

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

@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│
└─────┴───┴─────┘