((1&{~+/)*./\(=1&{))1 1 1 3 2 4 1
我总是得到索引错误。
要点是输出两个数字,一个与列表中的第一个数字相同,第二个数字与重复该数字的次数相同。
所以这很有效:
*./\(=1&{)1 1 1 3 2 4 1
1 1 1 0 0 0 0
我将第一个数字与列表的其余部分进行比较。然后我插入一个和压缩 - 这给了我一个1,只要我有一个完整的1的字符串,一旦它打破并失败并且零出现。
我认为我可以添加另一组parens,再次从列表中获取lead元素,并以某种方式记录这些数字,最终的想法是有另一个阶段,我将矢量的逆应用于原始列表,然后使用$:来获取相同动词的递归应用程序。有点像快速排序的例子,我认为我有点理解,但我想我没有。
但我甚至无法接近。我会将此问题作为一个单独的问题,以便人们获得适当的回答。
答案 0 :(得分:2)
你在找这样的东西吗?
f=.{.,+/@:({. E. ])
NB.f 1 1 1 3 2 4 1
NB.1 4
答案 1 :(得分:0)
J是0索引,所以你想尝试这样做:
((0&{~+/)*./\(=0&{))1 1 1 3 2 4 1
答案 2 :(得分:0)
(0&{ , +/@(*./\)@(= 0&{)) 1 1 1 3 2 4 1
1 3
我不能确定你的问题是否是你想要的初步结果?
这可能是获取第一个元素重复次数的更简单方法。
=/\ 1 1 1 3 2 4 1
1 1 1 0 0 0 0
我的印象是你想要得到类似下面的东西? (它给出了列表中连续重复的计数)
([: #/.~ 0 , [: +/\ 2 ~:/\ ]) 1 1 1 3 2 2 4 1
3 1 2 1 1
答案 3 :(得分:0)
内置动词{.
来获取数组中的第一项,所以第一部分已经完成。
对于第二部分,我们可以将其与e.
结合使用,如果给定一个向量,则返回一个表格,显示元素出现的位置:
e. 1 3 1 1
1 0 1 1
0 1 0 0
1 0 1 1
1 0 1 1
使用第一行(或列!):
{.e. 1 3 1 1
1 0 1 1
总结这个结果:
+/{.e. 1 3 1 1
3
使用二元,
(追加)实现将第1部分和第2部分组合成一个2元素列表:
(result of {.) , (result of sum of first row (or column!) of e.)
我总是作弊并使用显式转换器(13 :
)来做这样的事情:
13 : '({.y) , +/{. e.y'
{. , [: +/ [: {. e.
但是在这一点上你可能会注意到[:
(上限)和NMR's answer更加干净,这有点过分了。
如果您返回一个盒装数组(使用;
而不是,
),则可以将此函数扩展为除数字之外的其他内容:
f =: 13 : '({.y) ; +/{. e.y'
f 'abracadabra'
┌─┬─┐
│a│5│
└─┴─┘