這裏的(可能是幼稚)的方式我已經做到了:什麼是一個更簡潔的方法來計算一個元素出現在J列表中的次數?
count =: 4 : '# (#~ =&x) y'"1 0 1
換句話說,如果我說4 count 3 4 4 3 4 7 9
結果是3
,因爲4
發生在給定列表3個三次。
這很好,但我想知道J是否提供了一些更簡潔的方式來描述這一點。
這裏的(可能是幼稚)的方式我已經做到了:什麼是一個更簡潔的方法來計算一個元素出現在J列表中的次數?
count =: 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所述,當你想要計算的是簡單列表中的原子時,該算法就可以工作。 (這將需要不同的方法同樣需要將計算在形狀相似矩陣的列表匹配的矩陣。)
是的,一旦MPelletier提供了我的算法,我確實把它變成了它的默認形式。 (我使用'@:'變體而不是加蓋的形式)。我創建了一個名爲'counts'的動詞,它的二元形式基本上是'+/@:=「0 1',並且在它的一元形式中返回一個二維形式,列矩陣對給定列表進行計數 – 2010-09-28 14:20:04
換句話說,count的單子形式是'(,count&y)「0〜。 /:〜y'。 – 2010-09-28 14:22:18
我認爲一個一致動詞應該保持極簡:「[:+ /」1 ='似乎是這個「經典」計算。如果你想做排序,或者加入到結點,很好,但是我建議你不要把它們混合成「主要」動詞 – kaleidic 2010-09-28 21:14:14
我們或許應該也不在話下Member of IntervalE.
:
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
和往常一樣,insightf ul回答。再次感謝! – 2010-09-26 20:20:53
不是問題,我只是很高興我可以幫忙。 – MPelletier 2010-09-26 20:30:21