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
