这是我所做的(可能是天真的)方式:
计数 =: 4 : '# (#~ =&x) y'"1 0 1
换句话说,如果我说4 count 3 4 4 3 4 7 9
结果是3
,因为4
在给定列表中出现了 3 次。
这很有效,但我想知道 J 是否提供了一些更简洁的表达方式。
这是我所做的(可能是天真的)方式:
计数 =: 4 : '# (#~ =&x) y'"1 0 1
换句话说,如果我说4 count 3 4 4 3 4 7 9
结果是3
,因为4
在给定列表中出现了 3 次。
这很有效,但我想知道 J 是否提供了一些更简洁的表达方式。
当我这样做时,知道我只会有一个列表而不是矩阵,我使用:
count =: 4 : '+/x=y'
或者对于列表中的多个搜索:
count =: 4 : '+/x=y'"0 1
您的方法仅复制等于 x 的元素,然后计算结果。对相等的求和是少了一项操作。
我同意 MPelletier 提供的算法。既然您要求简洁,那么默契的措辞可能值得一看。这是一个这样的程序,分配了一个名称:
count =: +/ @: =
它也可以用作匿名动词,如下例所示:
4 (+/ @: =) 3 4 4 3 4 7 9
3
同义词是[: +/ =
正如 MPelletier 所说,当您要计算的是简单列表中的原子时,此算法有效。(需要不同方法的类似需求是计算在形状相似的矩阵列表中匹配的矩阵。)
我们可能还应该提到Interval 的成员 E.
:
4 E. 3 4 4 3 4 7 9
0 1 1 0 1 0 0
+/ 4 E. 3 4 4 3 4 7 9
3
所以
f =: +/ @: E.
例如
4 f 3 4 4 3 4 7 9
3
(1 0) f (1 0 3 2 4 1 0 3)
2