按J中出现次数映射元素

duk*_*reg 4 j

使用J语言,我希望获得数组元素计数的映射.

具体来说,我想输入一个带有两到多个字母的小写英文单词,然后取回单词中的每对字母以及出现的次数.

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

对于'可可':

co 2
oc 1
oa 1
Run Code Online (Sandbox Code Playgroud)

对于'香蕉':

ba 1
an 2
na 2
Run Code Online (Sandbox Code Playgroud)

对于'牛奶':

mi 1
il 1
lk 1
Run Code Online (Sandbox Code Playgroud)

对于'到':

to 1
Run Code Online (Sandbox Code Playgroud)

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

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

我可以轻松地将单词中的连续字母对作为矩阵或框列表:

   2(] ;._3)'cocoa'
co
oc
co
oa
   ]
   2(< ;._3)'cocoa'
?????????????
?co?oc?co?oa?
?????????????
Run Code Online (Sandbox Code Playgroud)

但是我需要帮助从那里到对数映射.

我知道〜.和〜:但我不只想返回重复的唯一元素或索引.我想要计数的映射.

NuVoc的"Loopless"页面表明/(或/ \.或/ \)是我应该寻找累积问题的地方.我熟悉/对数值数组的算术运算,但是对于你/我我不知道你需要积累什么样的字母组合才能组成y.

(注意:我已经可以在没有帮助的情况下使用Java或Python等"常规"语言执行此操作.关于SO的类似问题适用于与J.语法和语义截然不同的语言.我对这种问题的惯用J方法很感兴趣. )

Tik*_*anz 6

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

   2 ]\ 'banana'
ba
an
na
an
na
Run Code Online (Sandbox Code Playgroud)

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

   #/.~ 2 ]\ 'banana'
1 2 2
Run Code Online (Sandbox Code Playgroud)

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

   ({. ; #)/.~ 2 ]\ 'banana'
??????
?ba?1?
??????
?an?2?
??????
?na?2?
??????
Run Code Online (Sandbox Code Playgroud)