根据 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│
└──┴─┘
想用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)
(~.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│
└──┴─┘