On Mon, Nov 19, 2012 at 5:38 PM, Alexander Epifanov <[email protected]> wrote:
> Unfortunately cannot resolve problem, which could be easy resolved with loop:
> t=: 1 3 6 10 11 12
> v=: 0 20 40 60 80 100
>
> i=:   _1+(}.-}:) t
> i NB. its just distance between numbers
> 1 2 3 0 0 0
>
> And now the main problem for me, because I have to modify v array:
> if i = 0 then nothing
> if i = 1 or i = 2 then insert average value (for 1) and two values for 2
> if i = 3 then insert previous value

This specification seems odd.  What if i contains some other value?  I
am going to assume that values greater than 3 will be given the same
treatment as values where you need 3 copies, and that negative values
will not appear in i

> so, we have to fill missed values in t and v:
> t=: 1   3   6 10 11  12
> v=: 0 20 40 60 80 100
>
> should be:
> t2: 1   2   3   4  5   6   7  8   9 10 11 12 (ok, its just full index now)
> v2: 0 10 20 30 30 40 40 40 40 60 80 100
> ^ inserted by condition: 10; 30 30; 40 40 40
>
> Could you please help how to resolve it better? I suppose I can rotate
> |:t,:v and then fold it one-by-one, but I think it is not good
> solution.

I am not sure if this is better, but it meets the specifications you
have provided:

wat=:  4 :0
  ctl=. 0,~ _1+(}.-}:) x
  avg=. 0,~ 0.5 * (}.+}:) y
  ins=. ctl #&.> (2 < ctl) {"_1 avg,.y
  ;}:,y;"0 ins
)

   t wat v
0 10 20 30 30 40 40 40 40 60 80 100

-- 
Raul
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to