# 3. Реализовать программу работы с органическими клетками.
# Необходимо создать класс Клетка.
# В его конструкторе инициализировать параметр, соответствующий количеству клеток (целое число).
# В классе должны быть реализованы методы перегрузки арифметических операторов:
# сложение (__add__()), вычитание (__sub__()), умножение (__mul__()), деление (__truediv__()).
# Данные методы должны применяться только к клеткам и выполнять увеличение,
# уменьшение, умножение и обычное (не целочисленное) деление клеток, соответственно.
# В методе деления должно осуществляться округление значения до целого числа.
# Сложение. Объединение двух клеток.
# При этом число ячеек общей клетки должно равняться сумме ячеек исходных двух клеток.
# Вычитание. Участвуют две клетки.
# Операцию необходимо выполнять только если разность количества ячеек двух клеток больше нуля,
# иначе выводить соответствующее сообщение.
# Умножение. Создается общая клетка из двух.
# Число ячеек общей клетки определяется как произведение количества ячеек этих двух клеток.
# Деление. Создается общая клетка из двух.
# Число ячеек общей клетки определяется как целочисленное деление количества ячеек этих двух клеток.
# В классе необходимо реализовать метод make_order(), принимающий экземпляр класса и количество ячеек в ряду.
# Данный метод позволяет организовать ячейки по рядам.
# Метод должен возвращать строку вида *****\n*****\n*****..., где количество ячеек между \n равно переданному аргументу.
# Если ячеек на формирование ряда не хватает, то в последний ряд записываются все оставшиеся.
# Например, количество ячеек клетки равняется 12, количество ячеек в ряду — 5.
# Тогда метод make_order() вернет строку: *****\n*****\n**.
# Или, количество ячеек клетки равняется 15, количество ячеек в ряду — 5.
# Тогда метод make_order() вернет строку: *****\n*****\n*****.
# Подсказка: подробный список операторов для перегрузки доступен по ссылке.


class Cell:

    def __init__(self, amount):
        self.amount = amount

    # Для наглядности: вывод количества клеток, а не самого объекта
    def __str__(self):
        return f'{self.amount}'

    def __add__(self, other):
        return Cell(self.amount + other.amount)

    def __sub__(self, other):
        return Cell(self.amount - other.amount) if (self.amount - other.amount > 0) else "Ошибка!"

    def __mul__(self, other):
        return Cell(self.amount * other.amount)

    def __truediv__(self, other):
        return Cell(self.amount // other.amount)

    def make_order(self, length):
        new_order = ''
        for i in range(self.amount // length):
            new_order += length * '*' + '\n'
        new_order += self.amount % length * '*' + '\n'
        return new_order


# Тестирование:
cell1 = Cell(115)
cell2 = Cell(45)
print(cell1.make_order(10))
print(cell2.make_order(10))

print(cell1 - cell2)
print(cell2 - cell1)
print(cell1 + cell2)
print(cell1 * cell2)
print(cell1 / cell2)

print((cell1 - cell2).make_order(10))
