一、方法1
data =reduce(string,1:168)
map(y->map(n->data[n]==y,1:length(data))|>sum,'1':2:'9')
结果正确。但问题是,二行,并不简洁,不过,语义比较清晰。
二、方法2
这种方法是在方法1的基础上进行简化。
map(y->map(x->x==y,[c for c in reduce(string,1:168)])|>sum,'1':2:'9')
三、方法3
map(x->split(reduce(string,1:168),[x]))|>length,'1':2:'9')
这种方法并不推荐。因为,结果要减1。还不是这么简单,有些存在不需要减1的可能性.
四、方法4
data =reduce(string,1:168)
map(i->filter(x->x==i,data)|>length ,'1':2:'9')
结果正确。且可以放一行,也不显挤。但需要对filter函数相当熟悉。
filter的函数经常可能用到。即过滤掉不符合条件的元素。
filter(x->(x>1), [0 1 5 3 2 1 0]) # =>[5 3 2]
filter((str)->length(str)==3, ["abcd", "efg", "hij", "klmn", "opq"]) #=> ["efg", "hij", "opq"]
注意:以下是表示,这些页码在这些页中是否出现过,并不符合原义。
map(y->map(x->in(y,x),map(string,1:168))|>sum,'1':2:'9')
但的确是蛮有意思的。
关于“|>”:Applies a function to the preceding argument. This allows for easy function chaining.
[1:5] |> x->x.^2 |> sum |> inv
=1/55=0.0182
[1:5] |> x->x.^2 |> sum #1^2+2^2+3^2+4^2+5^2 =55
=55