Correction, I note you were taking about Part 2, in which you can indeed “stop short”, so you can use the original matrix idea again (it still works and remains quite fast even with lookups), or iterate as you suggested, or stop short in a while loop as suggested here too…/Rob
> On 6 Dec 2017, at 11:18 am, 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
