Свойства объявляются в теле класса как атрибуты класса (со значениями по умолчанию). Инициализатор в решениях не используется.
Методы обязаны иметь self в сигнатуре, но не должны читать или изменять состояние через self. Всякое взаимодействие с состоянием идёт через объекты, переданные в метод аргументами. Если методу нужно изменить собственный объект — этот объект передаётся в него же аргументом.
В задачах НЕ ПРЕДПОЛАГАЕТСЯ изменение собственных свойств через self.
Есть два сосуда высотой N, соединённые на высоте M. При заполнении одного из сосудов выше M жидкость переливается во второй сосуд до высоты M, после чего дальнейшее заполнение идёт совместно.
Объемом и формой сосуда пренебрегается. Считается, что 1 у.е. залитой жидкости соответствует 1 единице высоты сосуда. Также считается, что 2 или более сосудов соединены на одной высоте.
PRIORITY – булево, указывает, какой сосуд заполняется первым (по умолчанию False; ровно одному сосуду присваивается True через экземпляр, случай нескольких True не рассматривается);
MAX_HEIGHT – максимальная высота сосуда, константа для всех сосудов;
CONN_HEIGHT – высота, на которой сосуд соединяется с другим, в данной задачей является константой
Метод наполнения принимает оба сосуда объектами-аргументами и определяет порядок наполнения по их флагам priority (а не по порядку аргументов): жидкость поступает в сосуд с priority = True, излишек над M передаётся сосуду с priority = False. Перелив реализуется тем, что метод, обнаружив превышение M, уменьшает уровень одного объекта и увеличивает уровень другого, обращаясь к их свойствам напрямую.
Один вызов должен провести долив через все фазы сразу — наполнение приоритетного до M → перелив излишка во второй до M → совместный подъём уровней, — ничего не теряя между фазами.
Уровень ни одного сосуда не может превысить MAX_HEIGHT. Долив обрезается: система принимает от очередной порции ровно столько, сколько суммарно свободно до MAX_HEIGHT; остаток отбрасывается (не переносится на следующий шаг). Долив, целиком превышающий свободную ёмкость, принимается частично — до заполнения, а не отклоняется. Цикл продолжается, пока оба сосуда не достигнут MAX_HEIGHT; после каждого долива печатаются уровни обоих сосудов, по завершении — сообщение о полном заполнении.
Проверка корректности (встроенный тест). В любой момент суммарный объём жидкости в системе равен сумме всех фактически принятых доливов (для 1.3 — считая объём в трубке). Если равенство не сходится — ошибка в каскаде перелива или в делении по уровням.
Решите задачу в трёх вариациях.
Объёмом и формой сосуда пренебрегаем: 1 у.е. залитой жидкости соответствует 1 единице высоты, сосуды одинаковы. Соединение — точка на высоте M, без длины и объёма. После M уровни растут поровну (равная высота = равный объём, поскольку сосуды одинаковы).
Программа случайным образом доливает в приоритетный сосуд величину 1 < X < 100, пока оба сосуда не будут заполнены до N.
Форма обоих сосудов — кубическая: у каждого есть ширина w условных единиц. Сделайте два разных по объёму сосуда (разная ширина). Соединение по-прежнему без длины и объёма. Заполнение — в целых кубических единицах.
До достижения высоты M жидкость идёт в приоритетный сосуд, затем излишек над M — во второй, целыми кубическими единицами. После того как оба достигли M, уровни должны оставаться равными, и порция распределяется между сосудами пропорционально их ширине только целыми кубическими единицами; неделимый остаток не доливается.
Исключение — последний долив: если суммарного свободного места до MAX_HEIGHT в обоих сосудах не больше, чем приходящая порция, система заполняется до потолка полностью, даже если это заполнение не выражается целым числом кубиков и пропорция не соблюдается. На этом цикл завершается (оба сосуда на MAX_HEIGHT). На всех прочих доливах действует правило целых кубиков с отбрасыванием неделимого остатка.
К условию 1.2 добавляется трубка кубической формы, соединяющая сосуды на высоте M: она имеет ширину w_conn и длину (расстояние между сосудами) и сама вмещает жидкость. Теперь жидкость, покидающая приоритетный сосуд, сперва заполняет объём трубки и лишь затем попадает во второй сосуд — в законе сохранения появляется третий резервуар. Проверка сохранения объёма считается по трём ёмкостям, включая трубку.