Senior
70
# ΑΤΜ που φορτώνεται με κασέτες με χαρτονομίσματα, με την εφαρμογή μας στο πλοίο # πρέπει να μπορεί να εκδίδει χαρτονομίσματα για το καθορισμένο ποσό ή να απαντά με άρνηση # Κατά την έκδοση, τα χαρτονομίσματα αφαιρούνται από το υπόλοιπο του ΑΤΜ. # Επιτρεπτές ονομασίες: 50€, 100€, 500€, 1000€, 5000€. class ATM: pass # χώρος για κώδικα # Συσκευή του ΑΤΜ: # - τα χρήματα βρίσκονται σε κασέτες μέσα στο ΑΤΜ, φορτώνονται από τον επιθεωρητή και ξαναφορτώνονται; # - σε κάθε κασέτα υπάρχουν χαρτονομίσματα της δικής της ονομαστικής αξίας; # - το ΑΤΜ μπορεί να μετρήσει τα υπόλοιπα χαρτονομίσματα στις κασέτες, αλλά αυτή η λειτουργία διαρκεί πολύ - πρέπει να καλείται όσο το δυνατόν λιγότερο. # API για αλληλεπίδραση με τον εξοπλισμό του ΑΤΜ. # η διεπαφή SDK μπορεί να τροποποιηθεί/επεκταθεί με συμφωνία των μερών, αν χρειάζεται class SDK(ABC): @abstractmethod def count_banknotes(self, banknote: int) -> int: pass @abstractmethod def move_banknote_to_dispenser(self, banknote: int, count: int) -> None: pass @abstractmethod def open_dispenser(self) -> None: pass
Εταιρείες όπου ρωτήθηκαν
Яндекс
Απάντηση από AI
sobes.tech AI
python from abc import ABC, abstractmethod
class ATM: def init(self, sdk: SDK): self.sdk = sdk self.banknotes_cache = {}
def _update_cache(self):
# Обновляем кэш количества банкнот для каждого номинала
for banknote in [50, 100, 500, 1000, 5000]:
self.banknotes_cache[banknote] = self.sdk.count_banknotes(banknote)
def _can_dispense(self, amount: int) -> bool:
# Проверяем, можно ли выдать сумму с текущим кэшем
# Используем жадный алгоритм по убыванию номиналов
remaining = amount
temp_cache = self.banknotes_cache.copy()
for banknote in sorted(temp_cache.keys(), reverse=True):
needed = remaining // banknote
available = temp_cache[banknote]
used = min(needed, available)
remaining -= used * banknote
temp_cache[banknote] -= used
if remaining == 0:
return True
return False
def dispense(self, amount: int) -> bool:
# Обновляем кэш перед выдачей
self._update_cache()
if amount <= 0 or amount % 50 != 0:
return False # Неверная сумма
if not self._can_dispense(amount):
return False # Невозможно выдать сумму
remaining = amount
for banknote in sorted(self.banknotes_cache.keys(), reverse=True):
needed = remaining // banknote
available = self.banknotes_cache[banknote]
used = min(needed, available)
if used > 0:
self.sdk.move_banknote_to_dispenser(banknote, used)
self.banknotes_cache[banknote] -= used
remaining -= used * banknote
if remaining == 0:
break
self.sdk.open_dispenser()
return True
**Объяснение:**
- Класс `ATM` принимает объект `SDK` для взаимодействия с аппаратной частью.
- Для оптимизации вызовов `count_banknotes` используется кэш, который обновляется перед выдачей.
- Метод `dispense` проверяет возможность выдать сумму, используя жадный алгоритм по номиналам.
- Если выдача возможна, банкноты перемещаются в диспенсер, после чего он открывается.
- Если сумма не кратна 50 или не может быть выдана, возвращается отказ.