根据 J 中的出现次数映射元素

Mapping of elements by number of occurrences in J

想用J语言实现数组元素个数的映射。

具体来说,我想输入一个包含两个或多个字母的小写英文单词,然后返回单词中的每对字母以及出现次数。

我需要一个动词来给出这样的东西,无论你认为合适的 J 结构:

对于'cocoa':

co 2
oc 1
oa 1

对于'banana':

ba 1
an 2
na 2

对于'milk':

mi 1
il 1
lk 1

对于'to':

to 1

(对于'a'这样的单字母单词,该任务未定义,不会尝试。)

(顺序重要,这就是我碰巧列出它们的方式。)

我可以很容易地获得单词中连续的字母对作为矩阵或框列表:

   2(] ;._3)'cocoa'
co
oc
co
oa
   ]
   2(< ;._3)'cocoa'
┌──┬──┬──┬──┐
│co│oc│co│oa│
└──┴──┴──┴──┘

但我需要帮助才能将对映射到计数。

我知道~。和 ~: 但我 只是 想要 return 重复项的唯一元素或索引。我想要计数映射。

NuVoc's "Loopless" page 表示 /(或 /\. 或 /\)是我应该寻找累积问题的地方。我熟悉 / 用于数字数组的算术运算,但是对于 u/y 我不知道你必须是什么来累积构成 y 的字母对列表。

(注意。我已经可以在 Java 或 Python 等 "normal" 语言中做到这一点而无需帮助。SO 上的类似问题适用于语法和语义与 J 截然不同的语言. 我对解决此类问题的惯用 J 方法很感兴趣。)

我认为您希望将独特项目的计数映射到项目。如果我错了,你可以纠正我。

开始于

 [t=. 2(< ;._3)'cocoa'
┌──┬──┬──┬──┐
│co│oc│co│oa│
└──┴──┴──┴──┘

您可以使用 ~. (Nub) 来 return 列表中的独特项目

   ~.t
┌──┬──┬──┐
│co│oc│oa│
└──┴──┴──┘

然后,如果您将小块与盒装列表进行比较,您会得到一个矩阵,其中 1 是将小块与字符串中的盒装对匹配的位置

   t =/ ~.t
1 0 0
0 1 0
1 0 0
0 0 1

对这个矩阵的列求和,得到小块的每一项出现的次数

    +/  t =/ ~.t
2 1 1

然后将它们装箱,以便您可以将整数与装箱字符一起合并

   <"0 +/  t =/ ~.t
┌─┬─┬─┐
│2│1│1│
└─┴─┴─┘

通过使用 ,.(Stitch)

将 nub 和 count 拼接在一起来组合它们
 (~.t) ,. <"0 +/  t =/ ~.t
┌──┬─┐
│co│2│
├──┼─┤
│oc│1│
├──┼─┤
│oa│1│
└──┴─┘
       [t=. 2(< ;._3)'banana'
┌──┬──┬──┬──┬──┐
│ba│an│na│an│na│
└──┴──┴──┴──┴──┘
   (~.t) ,. <"0 +/  t =/ ~.t
┌──┬─┐
│ba│1│
├──┼─┤
│an│2│
├──┼─┤
│na│2│
└──┴─┘
   [t=. 2(< ;._3)'milk'
┌──┬──┬──┐
│mi│il│lk│
└──┴──┴──┘
   (~.t) ,. <"0 +/  t =/ ~.t
┌──┬─┐
│mi│1│
├──┼─┤
│il│1│
├──┼─┤
│lk│1│
└──┴─┘

希望对您有所帮助。

要获得 2 个字母组合的列表,我会使用二元 infix (\):

   2 ]\ 'banana'
ba
an
na
an
na

要计算出现次数,立即想到的原语是 key (/.)

   #/.~ 2 ]\ 'banana'
1 2 2

如果您想将计数与字母组合相匹配,您可以将动词扩展为以下分支:

   ({. ; #)/.~ 2 ]\ 'banana'
┌──┬─┐
│ba│1│
├──┼─┤
│an│2│
├──┼─┤
│na│2│
└──┴─┘