使用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方法很感兴趣问题。)
答案 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│
└──┴─┘
希望这有帮助。