これが私がやった(おそらく素朴な)方法です:
カウント =: 4 : '# (#~ =&x) y'"1 0 1
つまり、4 count 3 4 4 3 4 7 9
結果が3
であるとすれば4
、与えられたリストに 3 が 3 回出現するからです。
これは完全に機能しますが、J がこれを表現するためのより簡潔な方法を提供するかどうか疑問に思います。
これが私がやった(おそらく素朴な)方法です:
カウント =: 4 : '# (#~ =&x) y'"1 0 1
つまり、4 count 3 4 4 3 4 7 9
結果が3
であるとすれば4
、与えられたリストに 3 が 3 回出現するからです。
これは完全に機能しますが、J がこれを表現するためのより簡潔な方法を提供するかどうか疑問に思います。
これを行うとき、マトリックスではなくリストのみを使用することを知っているので、次を使用します。
count =: 4 : '+/x=y'
または、リスト内の複数の検索の場合:
count =: 4 : '+/x=y'"0 1
メソッドは x に等しい要素のみをコピーし、結果をカウントします。等しいものを合計すると、操作が 1 つ少なくなります。
おそらく、インターバルのメンバー 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
MPelletier が提供するアルゴリズムに同意します。あなたは簡潔さを求めているので、暗黙の言い回しは一見の価値があるかもしれません. 以下は、名前が割り当てられたそのようなプログラムの 1 つです。
count =: +/ @: =
次の例のように、匿名の動詞としても使用できます。
4 (+/ @: =) 3 4 4 3 4 7 9
3
同義語は[: +/ =
MPelletier が言ったように、このアルゴリズムは、カウントしたいものが単純なリスト内のアトムである場合に機能します。(異なるアプローチを必要とする同様の必要性は、同様の形状の行列のリストで一致する行列をカウントすることです。)