Запустил тестирование алгоритма через Юниттест
Сам алгоритм: algorithm.py
class FurnitureArrangement():
coordinates = [] # хранение координат по схеме "ключ объекта: (координаты, маркеры углов, маркеры точек)
free_space = [] # хранение расстояний между мебелью через запятую (в виде координат)
def free_space_algorithm(objects, walls_length):
# На вход подается список с координатами углов объектов. Координаты между друг другом минусим, находим
# по ближайшим неприлегающим углам расстояние по модулю в виде гипотенузы (вычитание по иксу -- это
# один катет, вычитание по игрику -- другой). И записыванием самое большое расстояние в переменную. Углы
# разбиты по сторонам света: north_west, north-east, south-west, south-east. Отдельно так же идет
# значение и длина стены "walls_length": {"first_wall": 1, "second_wall": 2, "third_wall": 1, "fourth_wall": 2}
lengths = {}
def longest_distance_corner(first_left, first_right, second_left, second_right):
first_distance = abs(first_left - second_left)
second_distance = abs(first_left - second_right)
third_distance = abs(first_right - second_left)
fourth_distance = abs(first_right - second_right)
minimal_distance = min([first_distance, second_distance, third_distance, fourth_distance])
return minimal_distance
def find_nearest_wall(corner, walls):
"""Функция для поиска ближайшей стены к углу"""
nearest_wall = None
nearest_distance = math.inf
for i, wall in enumerate(walls):
dist_to_wall = distance_to_wall(corner, wall)
if dist_to_wall is None:
continue # Угол не лежит на стене, пропускаем
if dist_to_wall < nearest_distance:
nearest_wall = i
nearest_distance = dist_to_wall
return nearest_wall, nearest_distance
def distance_to_wall(corner, wall):
"""Функция для нахождения расстояния от угла до стены"""
x, y = corner
x1, y1, x2, y2 = wall
if x1 <= x <= x2 or x2 <= x <= x1:
return abs(y - y1)
elif y1 <= y <= y2 or y2 <= y <= y1:
return abs(x - x1)
else:
return None
def x_or_y_distance(first_object, second_object, x_or_y):
nearest_wall1, dist1 = find_nearest_wall(first_object["north_east"], walls)
nearest_wall2, dist2 = find_nearest_wall(second_object["north_west"], walls)
if nearest_wall1 is None and nearest_wall2 is None:
# Объекты не находятся в комнате, расстояние равно бесконечности
distance = math.inf
elif nearest_wall1 == nearest_wall2:
# Объекты находятся на одной стене, находим расстояние между ними по x или y координате
distance = abs(first_object["north_east"][x_or_y] - second_object["south_west"][x_or_y])
else:
# Объекты находятся на разных стенах, находим расстояние по периметру комнаты
distance = dist1 + dist2
x_distance = abs(first_object["north_east"][0] - walls[nearest_wall1][2]) + \
abs(second_object["south_west"][0] - walls[nearest_wall2][0]) + distance
y_distance = abs(first_object["north_east"][1] - walls[nearest_wall1][3]) + \
abs(second_object["south_west"][1] - walls[nearest_wall2][1]) + distance
distance = min(x_distance, y_distance)
return distance
Сам юниттест: test_algorithm.py
import unittest
from algorithm import FurnitureArrangement
class TestFurnitureArrangement(unittest.TestCase):
def setUp(self):
self.calculator = FurnitureArrangement()
def test_double_free_space_algorithm(self):
self.assertEqual(self.calculator.free_space_algorithm(
[{"south_east": {"x": 2, "y": 0}, "south_west": {"x": 0, "y": 0},
"north_east": {"x": 2, "y": 3}, "north_west": {"x": 0, "y": 3},
"wall_info": {"wall_number": 4, "wall_length": 5}},
{"south_east": {"x": 5, "y": 0}, "south_west": {"x": 3, "y": 0},
"north_east": {"x": 5, "y": 3}, "north_west": {"x": 3, "y": 3},
"wall_info": {"wall_number": 4, "wall_length": 5}}]),
({'left_corner': {'x': 5, 'y': 3}, 'right_corner': {'x': 0, 'y': 3}}))
def test_triple_free_space_algorithm(self):
self.assertEqual(self.calculator.free_space_algorithm(
[{"south_east": {"x": 6, "y": 4}, "south_west": {"x": 8, "y": 4},
"north_east": {"x": 6, "y": 2}, "north_west": {"x": 8, "y": 2},
"wall_info": {"wall_number": 2, "wall_length": 6}},
{"south_east": {"x": 2, "y": 4}, "south_west": {"x": 4, "y": 4},
"north_east": {"x": 2, "y": 2}, "north_west": {"x": 4, "y": 2},
"wall_info": {"wall_number": 2, "wall_length": 6}},
{"south_east": {"x": 7, "y": 6}, "south_west": {"x": 5, "y": 6},
"north_east": {"x": 7, "y": 8}, "north_west": {"x": 5, "y": 8},
"wall_info": {"wall_number": 4, "wall_length": 6}}]),
({'left_corner': {'x': 2, 'y': 2}, 'right_corner': {'x': 5, 'y': 8}}))
И сама Ошибка
self.assertEqual(self.calculator.free_space_algorithm(
AssertionError: None != {'left_corner': {'x': 2, 'y': 1}, 'right_corner': {'x': 5, 'y': 8}}