Passed
Push — master ( bf2308...026523 )
by Ken M.
01:15
created

hexagon_spiral.hex_spiral()   A

Complexity

Conditions 2

Size

Total Lines 5
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 5
nop 2
dl 0
loc 5
rs 10
c 0
b 0
f 0
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