Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Hexagon Spiral by bukebuer
# migrated from python 2.7
# return amount of cells when there are i layers
def f(i):
return 3*i*(i+1) + 1
# return layer # and index in the layer if count clockwisely from 1,7,19,37
def get_coordinate(n):
if n==1: return 0,0
i = 1
while n > f(i):
i += 1
return i, (n-f(i-1))%(6*i)
# return cells which 1 cell away from (i,j)
def get_neighbor(xxx_todo_changeme):
(i,j) = xxx_todo_changeme
if i==0: return set([(1,i) for i in range(6)])
cmap = lambda x,y: (j/i*(i+x)+j%i+y)%(6*(i+x))
if i==1:
return set([(0, 0), (i, j-1), (i, j+1),
(i+1, cmap(1,0)), (i+1, cmap(1,-1)), (i+1, cmap(1,1))])
elif j%i:
return set([(i, j-1), (i, j+1),
(i+1, cmap(1,0)), (i+1, cmap(1,1)),
(i-1, cmap(-1,0)), (i-1, cmap(-1,-1))])
else:
return set([(i-1, cmap(-1,0)), (i, j-1), (i, j+1),
(i+1, cmap(1,0)), (i+1, cmap(1,-1)), (i+1, cmap(1,1))])
# brute-force search to get the distance
def hex_spiral(*args):
first, second = list(map(get_coordinate, args))
d, visited, to_search = 0, set([]), {first,}
while second not in to_search:
temp = set([])
for p in to_search:
visited.add(p)
temp = temp.union(get_neighbor(p))
to_search = temp
d += 1
return d
Nov. 12, 2014
Comments: