See http://www.jsoftware.com/jwiki/Essays/Progressive%20Index-Of. Choose items with occurrence counts <: 2 .
On Thu, Jun 12, 2014 at 10:17 AM, Marshall Lochbaum <[email protected]> wrote: > I came across this problem and was wondering if anyone could come up > with a solution that is both elegant and fast: > > Given a list of positive integers, return a mask (or index list) which > selects the first two of each unique value in the list. > > Of course ~: is the solution if you only want the first value. A fast > but ugly solution using ~: is > > f1 =. (] +. ~:@:(*-.)) ~: > > which relies on the fact that the list is always positive. A more > general solution using key, which returns an unordered list of indices, > is > > f2 =. (2&{.)^:(2<#)(<@)/.(;@:) i.@# > > which isn't exactly pretty, but at least allows you to change the number > of values you want. It's also much slower than f1: > > d =. 99 , 100 + 1e7?.@$10000 > (I.@:f1 -: /:~@:f2) d > 1 > 6!:2 'f1 d' > 0.273576 > 6!:2 'f2 d' > 1.08829 > > Any other ideas? > > Marshall > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
