我脑子里想出了一个不正确的J动词,它会在一个字符串中找到多余字母的比例。我从一堆未定义优先级的动词开始,并尝试向内分组:
c=. 'cool' NB. The test data string, 1/4 is redundant.
box =. 5!:2 NB. The verb to show the structure of another verb in a box.
p=.%#~.%# NB. First attempt. Meant to read "inverse of (tally of unique divided by tally)".
box < 'p'
┌─┬─┬────────┐
│%│#│┌──┬─┬─┐│
│ │ ││~.│%│#││
│ │ │└──┴─┴─┘│
└─┴─┴────────┘
p2=.%(#~.%#) NB. The first tally is meant to be in there with the nub sieve, so paren everything after the inverse monad.
box < 'p2'
┌─┬────────────┐
│%│┌─┬────────┐│
│ ││#│┌──┬─┬─┐││
│ ││ ││~.│%│#│││
│ ││ │└──┴─┴─┘││
│ │└─┴────────┘│
└─┴────────────┘
p3=. %((#~.)%#) NB. The first tally is still not grouped with the nub sieve, so paren the two together directly.
box < 'p3'
┌─┬────────────┐
│%│┌──────┬─┬─┐│
│ ││┌─┬──┐│%│#││
│ │││#│~.││ │ ││
│ ││└─┴──┘│ │ ││
│ │└──────┴─┴─┘│
└─┴────────────┘
p3 c NB. Looks about right, so test it!
|length error: p3
| p3 c
(#~.)c NB. Unexpected error, but I guessed as to what part had the problem.
|length error
| (#~.)c
我的问题是,为什么我的分组方法会因此长度错误而失败,我应该如何对其进行分组以获得所需的效果? (我认为这与把它变成钩子而不是分组有关,或者它只是没有意识到它需要使用monad形式,但我不知道如何验证或绕过它。)
答案 0 :(得分:2)
(# ~.)
是hook。这可能是你没想到的。 (# ~.) 'cool'
正在将~.
应用于'cool'
,以便为您提供'col'
。但是因为它是一个monadic钩子,它然后尝试'cool' # 'col'
,这不是你想要的,并且它给出了长度错误。
要将0.25
作为字符串中冗余字符的比例,请不要使用倒数(%
)。您只需从1中减去唯一字符的比例。这对叉子非常简单:
(1 - #&~. % #) 'cool'
0.25
p9 =. 1 - #&~. % #
box < 'p9'
┌─┬─┬──────────────┐
│1│-│┌────────┬─┬─┐│
│ │ ││┌─┬─┬──┐│%│#││
│ │ │││#│&│~.││ │ ││
│ │ ││└─┴─┴──┘│ │ ││
│ │ │└────────┴─┴─┘│
└─┴─┴──────────────┘
撰写(&
)确保您将小块(#
)统一起来(~.
),以便叉子将其作为单个动词抓取。 fork是一系列三个动词,它们应用第一个和第三个动词,然后将中间动词应用于结果。因此#&~. % #
是分叉,其中#&~.
应用于字符串,从而生成3
。已应用#
,结果为4
。然后将%
应用于这些结果,3 % 4
,为您提供0.75
。这是我们独特角色的比例。
1 -
只是为了让我们0.25
而不是0.75
。 % 0.75
与1 % 0.75
相同,后者为您1.33333
。