3
((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,一旦它打破和失败并且零出现。

我认为然后我可以添加另一组括号,再次从列表中获取前导元素,并以某种方式记录这些数字,最终的想法是有另一个阶段,我将向量的逆应用于原始列表,并且然后使用 $: 返回相同动词的递归应用。有点像快速排序的例子,我想我有点理解,但我想我不明白。

但我什至无法靠近。我将把它作为一个单独的问题提出,以便人们得到适当的回答。

4

4 回答 4

2

你在找这样的东西吗?

f=.{.,+/@:({. E. ])

NB.f 1 1 1 3 2 4 1
NB.1 4
于 2012-07-02T22:51:32.940 回答
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
于 2011-10-01T05:53:22.813 回答
0

J 是 0 索引,所以你想试试这个:

((0&{~+/)*./\(=0&{))1 1 1 3 2 4 1
于 2011-09-15T21:25:32.693 回答
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 元素列表是通过 dyadic ,(append) 实现的:

(result of {.) , (result of sum of first row (or column!) of e.)

我总是作弊并使用显式到默认的转换器(13 :)来处理这样的事情:

   13 : '({.y) , +/{. e.y'
{. , [: +/ [: {. e.

[:但是在这一点上,您可能会注意到这对(cap)有点强硬,并且NMR 的答案更清晰。

读到这里的奖励

如果您返回一个装箱数组(通过使用;而不是,),您可以将此函数扩展到除数字以外的事物列表:

   f =: 13 : '({.y) ; +/{. e.y'
   f  'abracadabra'
┌─┬─┐
│a│5│
└─┴─┘
于 2015-06-24T01:37:52.653 回答