Решение на Навигация на Piet от Емилиан Спасов

Обратно към всички решения

Към профила на Емилиан Спасов

Резултати

  • 10 точки от тестове
  • 0 бонус точки
  • 10 точки общо
  • 8 успешни тест(а)
  • 0 неуспешни тест(а)

Код

class Color:
LIGHT_GREEN = "c0ffc0"
DARK_GREEN = "00c000"
LIGHT_YELLOW = "ffffc0"
DARK_YELLOW = "c0c000"
LIGHT_RED = "ffc0c0"
DARK_RED = "c00000"
LIGHT_BLUE = "c0c0ff"
DARK_BLUE = "0000c0"
WHITE = "ffffff"
BLACK = "000000"
COLOR_TO_MOVEMENT = {
Color.LIGHT_GREEN: lambda x: (x[0] - 1, x[1]),
Color.DARK_GREEN: lambda x: (x[0] + 1, x[1]),
Color.LIGHT_YELLOW: lambda x: (x[0], x[1] - 1),
Color.DARK_YELLOW: lambda x: (x[0], x[1] + 1),
Color.LIGHT_RED: lambda x: (x[0] + 1, x[1]),
Color.DARK_RED: lambda x: (x[0] - 1, x[1]),
Color.LIGHT_BLUE: lambda x: (x[0], x[1] + 1),
Color.DARK_BLUE: lambda x: (x[0], x[1] - 1),
Color.WHITE: lambda x: x
}
def calculate_final_vector(position_vector: tuple[int, int],
colors: list[str]) -> tuple[int, int]:
for raw_color in colors:
color = raw_color.lower()
if color == Color.BLACK:
break
if color in COLOR_TO_MOVEMENT:
update_position_function = COLOR_TO_MOVEMENT[color]
position_vector = update_position_function(position_vector)
return position_vector
if __name__ == '__main__':
assert calculate_final_vector(
(1, 1), ['00C000', 'C0FFC0', 'C00000', 'FFFFFF', 'C0C000']
) == (0, 2)
assert calculate_final_vector((0, 0), ['00c000', 'c0c000']) == (1, 1)

Лог от изпълнението

........
----------------------------------------------------------------------
Ran 8 tests in 0.087s

OK

История (2 версии и 3 коментара)

Емилиан обнови решението на 21.10.2022 22:01 (преди около 2 години)

+class Color:
+ LIGHT_GREEN = "c0ffc0"
+ DARK_GREEN = "00c000"
+ LIGHT_YELLOW = "ffffc0"
+ DARK_YELLOW = "c0c000"
+ LIGHT_RED = "ffc0c0"
+ DARK_RED = "c00000"
+ LIGHT_BLUE = "c0c0ff"
+ DARK_BLUE = "0000c0"
+ WHITE = "ffffff"
+ BLACK = "000000"
+
+
+COLOR_TO_MOVEMENT = {
+ Color.LIGHT_GREEN: lambda x: (x[0] - 1, x[1]),
+ Color.DARK_GREEN: lambda x: (x[0] + 1, x[1]),
+ Color.LIGHT_YELLOW: lambda x: (x[0], x[1] - 1),
+ Color.DARK_YELLOW: lambda x: (x[0], x[1] + 1),
+ Color.LIGHT_RED: lambda x: (x[0] + 1, x[1]),
+ Color.DARK_RED: lambda x: (x[0] - 1, x[1]),
+ Color.LIGHT_BLUE: lambda x: (x[0], x[1] + 1),
+ Color.DARK_BLUE: lambda x: (x[0], x[1] - 1),
+ Color.WHITE: lambda x: x
+}
+
+
+def is_color_black(color: str) -> bool:
+ return color == Color.BLACK
+
+
+def calculate_final_vector(position_vector: tuple[int, int],
+ colors: list[str]) -> tuple[int, int]:
+ for raw_color in colors:
+ color = raw_color.lower()
+ if is_color_black(color):
+ break
+
+ if color in COLOR_TO_MOVEMENT:
+ update_position_function = COLOR_TO_MOVEMENT[color]
+ position_vector = update_position_function(position_vector)
+
+ return position_vector
+
+
+if __name__ == '__main__':
+ assert calculate_final_vector(
+ (1, 1), ['00C000', 'C0FFC0', 'C00000', 'FFFFFF', 'C0C000']
+ ) == (0, 2)
+ assert calculate_final_vector((0, 0), ['00c000', 'c0c000']) == (1, 1)

Емилиан обнови решението на 24.10.2022 20:39 (преди около 2 години)

class Color:
LIGHT_GREEN = "c0ffc0"
DARK_GREEN = "00c000"
LIGHT_YELLOW = "ffffc0"
DARK_YELLOW = "c0c000"
LIGHT_RED = "ffc0c0"
DARK_RED = "c00000"
LIGHT_BLUE = "c0c0ff"
DARK_BLUE = "0000c0"
WHITE = "ffffff"
BLACK = "000000"
COLOR_TO_MOVEMENT = {
Color.LIGHT_GREEN: lambda x: (x[0] - 1, x[1]),
Color.DARK_GREEN: lambda x: (x[0] + 1, x[1]),
Color.LIGHT_YELLOW: lambda x: (x[0], x[1] - 1),
Color.DARK_YELLOW: lambda x: (x[0], x[1] + 1),
Color.LIGHT_RED: lambda x: (x[0] + 1, x[1]),
Color.DARK_RED: lambda x: (x[0] - 1, x[1]),
Color.LIGHT_BLUE: lambda x: (x[0], x[1] + 1),
Color.DARK_BLUE: lambda x: (x[0], x[1] - 1),
Color.WHITE: lambda x: x
}
-def is_color_black(color: str) -> bool:
- return color == Color.BLACK
-
-
def calculate_final_vector(position_vector: tuple[int, int],
colors: list[str]) -> tuple[int, int]:
for raw_color in colors:
color = raw_color.lower()
- if is_color_black(color):
+ if color == Color.BLACK:
break
if color in COLOR_TO_MOVEMENT:
update_position_function = COLOR_TO_MOVEMENT[color]
position_vector = update_position_function(position_vector)
return position_vector
if __name__ == '__main__':
assert calculate_final_vector(
(1, 1), ['00C000', 'C0FFC0', 'C00000', 'FFFFFF', 'C0C000']
) == (0, 2)
assert calculate_final_vector((0, 0), ['00c000', 'c0c000']) == (1, 1)

Според мен и двата варианта в случая са ок, тъй като случая color == Color.BLACK е достатъчно рийдабъл, но при примерно хардкоднат черен цвят според мен допълнителна функция с добро наименование би допринесла за подобряването на cognitive complexity-то на кода. ПС: Качих ново решение с премахната функцията is_color_black.

То черното си е хардкоднато, на практика. И проверката остава color == Color.BLACK. Не разбирам какво имаш предвид като разлика.

Иначе мисълта за cognitive complexity е супер, когато наистина има резон. За едноредови стейтмънти, особено такива, които се ползват на едно място в кода, ще ми трябва убеждаване. :)

Пример - color in COLOR_TO_MOVEMENT може по същата логика да е във функция is_color_movable. И е много slippery slope цялото нещо.