Python set: найдите объекты с изменённым хешем
Напишите решение на Python и проверьте его на странице.
Другие упражнения по этой теме: Сравнение и хеширование Python: задачи на eq, lt и set.
Аудит повреждённого инвентаря
Игровой сервер хранит экипировку персонажей в хеш-множестве set, где каждый предмет определяется неизменяемым артикулом и уровнем прочности. Из-за ошибки скрипта прочность некоторых вещей изменили напрямую в памяти уже после того, как они попали в инвентарь. Теперь такие объекты по-прежнему видны при прямом переборе for item in inventory, но точечная проверка принадлежности item in inventory неожиданно возвращает для них False.
Процедура аудита не изменяет исходное повреждённое множество и не трогает поля самих предметов. Она обходит коллекцию и выявляет элементы, которые фактически перестали находиться по условию item in inventory. Одновременно из всех обнаруженных вещей собирается отдельное новое хеш-множество, в котором корректный поиск восстанавливается для каждой единицы экипировки.
Реализуйте функцию аудита, которая принимает повреждённый инвентарь, оставляет его нетронутым и возвращает кортеж из списка потерянных при поиске предметов и нового исправленного множества всех предметов.
Что уже дано
При выполнении кода уже доступен класс предметов экипировки InventoryItem(article, durability):
- свойство
article(str, длина от 1 до 64 символов) доступно только для чтения; - атрибут
durability(int, значение от 0 до 1 000 000) хранит уровень прочности; - равенство
__eq__и хеш__hash__согласованы и вычисляются по паре(article, durability).
Также в окружении объявлены вспомогательные инструменты make_inventory_probe, observe_inventory_result и run_inventory_probe. Вам требуется реализовать только функцию audit_inventory.
Что нужно сделать
Напишите функцию audit_inventory(inventory).
Параметр inventory представляет собой стандартное хеш-множество set (содержащее от 0 до 200 экземпляров InventoryItem).
Функция должна возвращать кортеж из двух элементов: (lost_items, repaired_inventory).
Правила проверки и формирования результата:
- Исходное множество
inventoryи атрибуты переданных предметов запрещено изменять: нельзя вызывать методы очистки, добавления, удаления или перезаписывать поля объектов. - Проверяйте фактическую потерю предмета: в список
lost_itemsвключается исходный объект, для которого проверкаitem in inventoryвернулаFalse. Каждый такой объект добавляется ровно один раз. - Если значение прочности предмета мутировало, но точечный поиск
item in inventoryвсё ещё успешен (например, если в том же бакете есть подходящий элемент), считать его потерянным не нужно. - Второе значение,
repaired_inventory, должно быть новым независимым объектомset, содержащим все объекты изinventoryв их текущем состоянии. - Для каждого элемента из исходного
inventoryпроверкаitem in repaired_inventoryобязана возвращатьTrue. - Порядок элементов в списке
lost_itemsи порядок обхода множестваrepaired_inventoryне регламентируются.
Ввод и вывод
Стандартные потоки ввода stdin и вывода stdout в решении не используются: считывать ввод и вызывать print() не нужно. После выполнения кода учащегося проверяющая система считывает из пространства имён модуля функцию верхнего уровня audit_inventory и вызывает её с проверочными аргументами.
Пример использования
probe = make_inventory_probe([("amulet", 10), ("sword", 20)], [(0, 11)])
lost, repaired = audit_inventory(probe.inventory)
print(all(item in repaired for item in probe.inventory))
print(repaired is probe.inventory)
Вывод:
True False
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Изменение хеша объекта в set: вопрос по Python hash и eq
- NotImplemented в lt: как Python сравнивает объекты
- Сравнение объектов Python: lt и несовместимые группы
- Rich comparisons Python: ранжирование объектов разных классов
- Python eq: сравнение объекта с диапазоном допустимых значений
- Удаление ключа из ChainMap в Python: проверка поведения del
