|
1
|
|
|
__author__ = 'KenMercusLai' |
|
2
|
|
|
|
|
3
|
|
|
|
|
4
|
|
|
def determine_level(number): |
|
5
|
|
|
if number == 1: |
|
6
|
|
|
return 0, 0 |
|
7
|
|
|
level = 1 |
|
8
|
|
|
start_number = 2 |
|
9
|
|
|
while 1: |
|
10
|
|
|
if start_number <= number <= start_number + level * 6 - 1: |
|
11
|
|
|
return level, number - start_number |
|
12
|
|
|
start_number += level * 6 |
|
13
|
|
|
level += 1 |
|
14
|
|
|
|
|
15
|
|
|
|
|
16
|
|
|
def convert_to_position(level, shift): |
|
17
|
|
|
if level == 0: |
|
18
|
|
|
return 0, 0 |
|
19
|
|
|
position_map_of_numbers = [] |
|
20
|
|
|
for i in range(level): |
|
21
|
|
|
position_map_of_numbers.append((-level + 1 + i, 1 + i)) |
|
22
|
|
|
for i in range(1, level + 1): |
|
23
|
|
|
position_map_of_numbers.append((i, level)) |
|
24
|
|
|
for i in range(level - 1, 0, -1): |
|
25
|
|
|
position_map_of_numbers.append((level, i)) |
|
26
|
|
|
for i in range(level): |
|
27
|
|
|
position_map_of_numbers.append((level - i, 0 - i)) |
|
28
|
|
|
for i in range(level): |
|
29
|
|
|
position_map_of_numbers.append((0 - i, -level)) |
|
30
|
|
|
for i in range(level): |
|
31
|
|
|
position_map_of_numbers.append((-level, -level + i)) |
|
32
|
|
|
position_map_of_numbers.append((-level, 0)) |
|
33
|
|
|
return position_map_of_numbers[shift] |
|
34
|
|
|
|
|
35
|
|
|
|
|
36
|
|
|
def calc_distance(num0, num1): |
|
37
|
|
|
return max( |
|
38
|
|
|
abs(num1[1] - num0[1]), |
|
39
|
|
|
abs(num1[0] - num0[0]), |
|
40
|
|
|
abs((num1[0] - num1[1]) * -1 - (num0[0] - num0[1]) * -1), |
|
41
|
|
|
) |
|
42
|
|
|
|
|
43
|
|
|
|
|
44
|
|
|
def hex_spiral(first, second): |
|
45
|
|
|
return calc_distance( |
|
46
|
|
|
*map( |
|
47
|
|
|
lambda x: convert_to_position(x[0], x[1]), |
|
48
|
|
|
[determine_level(first), determine_level(second)], |
|
49
|
|
|
) |
|
50
|
|
|
) |
|
51
|
|
|
|
|
52
|
|
|
|
|
53
|
|
|
# These "asserts" using only for self-checking and not necessary for |
|
54
|
|
|
# auto-testing |
|
55
|
|
|
if __name__ == '__main__': # pragma: no cover |
|
56
|
|
|
assert hex_spiral(2, 9) == 1, "First" |
|
57
|
|
|
assert hex_spiral(9, 2) == 1, "Reverse First" |
|
58
|
|
|
assert hex_spiral(6, 19) == 2, "Second, short way" |
|
59
|
|
|
assert hex_spiral(5, 11) == 3, "Third" |
|
60
|
|
|
assert hex_spiral(13, 15) == 2, "Fourth, One row" |
|
61
|
|
|
assert hex_spiral(11, 17) == 4, "Fifth, One more test" |
|
62
|
|
|
|