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


class Cells:

    def __init__(self, quantity):
        if not isinstance(quantity, int):
            # ничего другого не придумал, чтобы
            # избежать создания класса с невалидным аргументом
            raise ValueError('You should you a integer to create Cells')

        self.quantity = quantity

    def __str__(self):
        return f'Object Cells has {self.quantity} cell(s)'

    def __add__(self, other):
        return Cells(self.quantity + other.quantity)

    def __sub__(self, other):
        res = self.quantity - other.quantity
        if res < 0:
            print('Invalid operation: arg1 < arg2')
        return Cells(res)

    def __mul__(self, other):
        return Cells(self.quantity * other.quantity)

    def __truediv__(self, other):
        return Cells(self.quantity // other.quantity)

    def make_order(self, n):
        div, rem = divmod(self.quantity, n)
        stars_list = ['*' * n for _ in range(div)]
        stars_list.append('*' * rem)
        return '\n'.join(stars_list)


c1 = Cells(5)
c2 = Cells(4)
print(c1 + c2)
print(c1 - c2)
print(c1 * c2)
print(c2 / c1)
print(Cells(20).make_order(6))
