按J中出现次数映射元素

时间:2017-06-11 04:21:50

标签: j

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

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

我需要一个动词,在你认为合适的J结构中给出类似的东西:

对于'可可':

co 2
oc 1
oa 1

对于'banana':

ba 1
an 2
na 2

对于'牛奶':

mi 1
il 1
lk 1

对于'to':

to 1

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

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

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

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

但我需要帮助从那里到配对到计数的映射。

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

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

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

2 个答案:

答案 0 :(得分:6)

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

   2 ]\ 'banana'
ba
an
na
an
na

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

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

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

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

答案 1 :(得分:2)

我认为您希望将唯一商品的计数映射到商品。如果我错了,你可以纠正我。

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

您可以使用~.(Nub)返回列表中的唯一项目

   ~.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│
└─┴─┴─┘

使用,.(针迹)将小块和小数拼接在一起来组合它们

 (~.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│
└──┴─┘

希望这有帮助。