Откройте контекст
Выберите папку проекта и обозначьте нужные файлы или поведение.
Проверьте прямоугольные области сетки с именами ASCII и одиночными точками для пустых ячеек. Испытайте пустой ввод, неровные строки и разорванные имена, возвращая исключающие границы только для полностью заполненных прямоугольников.
Выберите папку проекта и обозначьте нужные файлы или поведение.
Укажите входные данные, ожидаемый результат и границы, которые нужно сохранить.
Проверьте предлагаемые изменения и команды, прежде чем полагаться на результат.
Сравните фактическое поведение с ожидаемым. Если проверка не проходит, разберитесь в причине перед следующими изменениями.
import re
def grid_areas(rows):
if type(rows) is not list or any(type(r) is not str for r in rows):
raise ValueError("grid.rows")
if not rows:
return {}
cells = [r.split() for r in rows]
width = len(cells[0])
if not width or any(len(r) != width for r in cells):
raise ValueError("grid.width")
groups = {}
for y, row in enumerate(cells):
for x, name in enumerate(row):
if name == ".":
continue
if not re.fullmatch(r"[A-Za-z_][A-Za-z0-9_-]*", name):
raise ValueError("grid.name")
groups.setdefault(name, []).append((y, x))
result = {}
for name, points in groups.items():
top, bottom = min(y for y,x in points), max(y for y,x in points)+1
left, right = min(x for y,x in points), max(x for y,x in points)+1
if len(points) != (bottom-top)*(right-left):
raise ValueError("grid.rectangle")
result[name] = (top, bottom, left, right)
return resultПример — отправная точка для реального проекта, а не утверждение, что сгенерированный код уже протестирован. Адаптируйте пути, зависимости и ожидаемое поведение к своему приложению.