Brief note Daniel, to work out the size of spiral that will contain your input, remember the spiral is a square matrix.
So if input is 91, you need to go to a 10x10, which is simply ">. *: 91” (as in ceiling squareroot 91, which is 10). Rob > On 6 Dec 2017, at 9:16 am, Daniel Lyons <[email protected]> wrote: > > >> On Dec 3, 2017, at 9:33 PM, Daniel Lyons <[email protected]> wrote: >> >> >> >>> On Dec 3, 2017, at 7:01 PM, Jimmy Gauvin <[email protected]> wrote: >>> >>> has anybody found something better than a "do. while." to calculate the >>> spiral neighborhood count? >> >> >> Amusingly, someone made a video about a cool trick for doing this in J, it's >> about 1/3rd of y'all's Youtube presence: >> >> https://www.youtube.com/watch?v=dBC5vnwf6Zw&t=282s >> <https://www.youtube.com/watch?v=dBC5vnwf6Zw&t=282s> >> >> That said, I didn't see how to solve this one even with the spiral generated >> until this morning in the shower and haven't had time to work on it until >> now. >> >> My approach would basically be to generate the spiral of the right size and >> then do the index-decode trick from this S.O. answer: >> >> https://stackoverflow.com/questions/39686977/j-coordinates-with-specific-value >> >> <https://stackoverflow.com/questions/39686977/j-coordinates-with-specific-value> >> >> Once you have the coordinates, the sum of absolute value of the x- and >> y-coordinate should be the solution, but you'll have to do some kind of >> offset fiddling to compensate for 0,0 being in the middle rather than the >> lower-left. > > This turned out to be an adequate approach for part A. I just kept increasing > the iteration count until my number wound up in the spiral: > > a =. (|.@|: ,~ >./@, + 1 + i.@#)^:300 (1 1 $ 1) >> ./>./a > 22801 > > 300 iterations wasn’t quite big enough, so I made it bigger. Once I had a > large enough array, I used the sum/decode trick, but subtracted the location > of 1: > > +/ ,(| (($a) #: (I. input=,a)) - (($a) #: (I. 1=,a))) > > I’m not in love with this and need to study some of the other replies. > > For part B, I just looked up the sequence in the OEIS and found the right > value and plugged it in. *shrug* :) > > … > > Now I’m curious about what Roger said, that you don’t need to generate a big > spiral. Part of me thinks that you could do something like compute the polar > coordinate and convert to rectangular. One of the diagonals winds up being > squares of odd numbers: 1, 9, 25, 49. If your number is between (x-2)^2 and > x^2, you know it’s on the ((x+1) / 2) ring; so because 45 is between 25 and > 49, it’s on the 4th ring. That tells you the radius (4); all the solutions > will have “carrying distance” of 3 or more. From here I got stuck trying to > figure out the “angle” (I suspect knowing the distance to the next “middle of > a side” is sufficient) but I have to get back to work for now so it’ll have > to wait until later. > > -- > Daniel Lyons > > > > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
