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
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи