当我尝试向这个J程序添加第二个钩子/叉子时,我得到了意想不到的结果。有谁能解释为什么?

时间:2011-09-15 21:10:44

标签: j tacit-programming

((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元素,并以某种方式记录这些数字,最终的想法是有另一个阶段,我将矢量的逆应用于原始列表,然后使用$:来获取相同动词的递归应用程序。有点像快速排序的例子,我认为我有点理解,但我想我没有。

但我甚至无法接近。我会将此问题作为一个单独的问题,以便人们获得适当的回答。

4 个答案:

答案 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)

第1部分

内置动词{.来获取数组中的第一项,所以第一部分已经完成。

第2部分

对于第二部分,我们可以将其与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│
└─┴─┘