I can't verify right now (on the road), but in concept: yes, multidimensional 
indexing should work. 

I was thinking along the lines of 0&|:^:(#@$)@] with the appropriate (sometimes 
0) rotations at each step, but your approach should have significant 
performance advantages over that.

-Dan

> On May 30, 2014, at 7:39 PM, Raul Miller <[email protected]> wrote:
> 
> This should work for non-scalar x?
> 
> rotate=: <@([ (]|(+ i.))&.> #@[{.$@]) { ]
> 
> Thanks,
> 
> -- 
> Raul
> 
> 
> 
>> On Fri, May 30, 2014 at 7:13 PM, Dan Bron <[email protected]> wrote:
>> 
>> Thanks. Appreciate the improvements too.
>> 
>> For non-scalar x, I think we'd have to mess with transposes, which is
>> doable, though overkill for my current purposes.
>> 
>> -Dan
>> 
>>> On May 30, 2014, at 7:04 PM, Raul Miller <[email protected]> wrote:
>>> 
>>> That looks right.
>>> 
>>> Note that (((] | + + i.@]) #) { ]) can be replaced with (((] | [ + i.@])
>> #)
>>> { ]) or, even ((] | (+ i.)) #) { ]
>>> 
>>> Note also that behavior will be different from |. when x is not a scalar.
>>> 
>>> Thanks,
>>> 
>>> --
>>> Raul
>>> 
>>> 
>>> 
>>>> On Fri, May 30, 2014 at 6:42 PM, Dan Bron <[email protected]> wrote:
>>>> 
>>>> While trying to implement the Nautical Bell task on RosettaCode [1], I
>>>> needed an arithmetic way to express a rotation. The short story is
>> clocks
>>>> on ships are origin-1, whereas modern clocks are origin zero (midnight
>> is
>>>> 00:00:00.000).
>>>> 
>>>> Now, if I had a list of all timestamps, the index change is simple: _1
>> |.
>>>> list_of_timestamps .  The problem is, I'm given timestamps as scalars
>>>> (i.e. individual points in time), so I don't have a list. All I have is
>> a
>>>> timestamp and a maximum (which corresponds to the length of the list).
>>>> 
>>>> Anyway, you can see the solution I cobbled together on the page, but
>> what
>>>> I'm interested in is a general way to express rotations arithmetically
>>>> (i.e. as operations on indices).  Is it true that after a rotation of R
>>>> places, the indices i of a list of length L will be given by L | (L+R)
>> + i
>>>> ?
>>>> 
>>>> Or, modelled in J:
>>>> 
>>>>          rotate =: ((] | + + i.@]) #) { ]
>>>> 
>>>>          _1 rotate i. 10
>>>>       9 0 1 2 3 4 5 6 7 8
>>>> 
>>>>          _1 rotate 'hello world!'
>>>>       !hello world
>>>> 
>>>>          2 rotate 'abcdefg'
>>>>       cdefgab
>>>> 
>>>>          (rotate"0 _~ i.@#) 'abcdefg'
>>>>       abcdefg
>>>>       bcdefga
>>>>       cdefgab
>>>>       defgabc
>>>>       efgabcd
>>>>       fgabcde
>>>>       gabcdef
>>>> 
>>>> Can I rely on this identity for future work? Is there any scalar x and
>> list
>>>> y where  x rotate y  will differ from   x |. y  ?
>>>> 
>>>> -Dan
>>>> 
>>>> [1] Nautical Bell task on RosettaCode
>>>>   http://rosettacode.org/wiki/Nautical_bell#J
>>>> ----------------------------------------------------------------------
>>>> For information about J forums see http://www.jsoftware.com/forums.htm
>>> ----------------------------------------------------------------------
>>> For information about J forums see http://www.jsoftware.com/forums.htm
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to