Kotlin · 34 строк
Платёжная система ждёт ответа на авторизацию не дольше 150 мс. Сервис держит потраченное за сутки в памяти и вызывается из пула на 64 потока. Лимит задаётся клиентом в приложении, по умолчанию его нет.
При снятии наличных (MCC 6011) в лимит засчитывается сумма плюс комиссия 1 %. Отметьте строки с ошибками.
В работе: Онлайн-авторизация покупок по карте: ответ «одобрено» или «отказ» за доли секунды.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
Источник: на задачах Т‑Банка: авторизация платежей по карте. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
class CardLimitService(private val repo: LimitRepository,private val notifier: PushNotifier,) {private val spentToday = HashMap<String, Long>()private var day = LocalDate.now()fun authorize(cardId: String, amountKop: Long, mcc: Int): Boolean {resetIfNewDay()val limit = repo.dailyLimit(cardId) ?: 0Lval spent = spentToday[cardId] ?: 0Lif (spent + amountKop > limit) {notifier.send(cardId, "Отказ: превышен лимит ${limit / 100} ₽")return false}spentToday[cardId] = spent + amountKopif (mcc == 6011) {spentToday[cardId] = spent + amountKop + amountKop / 100}return true}fun refund(cardId: String, amountKop: Long) {spentToday[cardId] = spentToday.getValue(cardId) - amountKop}private fun resetIfNewDay() {val today = LocalDate.now()if (today != day) {spentToday.clear()day = today}}}