That's for the first part. The values in part 2 grow much faster, which was what I thought Roger was reminding me of.
Thanks, -- Raul On Tue, Dec 5, 2017 at 7:18 PM, Rob Hodgkinson <[email protected]> wrote: > 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 ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
