Menu
Coddy logo textTech

Проверка запасов

Часть раздела Логика и управление потоком путешествия по Kotlin на Coddy. Урок 57 из 63.

challenge icon

Задание

Сложно

Завершите runInventory с параметрами commands: List<String>. Создайте инвентарь, который начинается пустым при каждом вызове функции. Каждая команда представляет собой одну строку с полями, разделёнными символом |. Имена товаров — слова в нижнем регистре, состоящие из ASCII-символов. Всего может быть не более 100 команд. Разделяйте каждую команду по буквальному разделителю; команды всегда содержат правильное количество полей для своей операции. Возвращайте один ответ на каждую команду. Перед разбором количества удаляйте окружающие пробелы; допустимые количества находятся в диапазоне от 0 до 1000. Некорректный числовой текст, текст с числом вне диапазона Int, отрицательные количества или количества больше 1000 должны приводить к результату invalid без изменения состояния. Сохраните всё, что было написано на предыдущих шагах, включая каждую предыдущую команду и ответ. Поддержите ADD|item|quantity: добавляйте допустимое количество к запасу этого товара, изначально равному нулю, и возвращайте ответ added. Добавление нуля также создаёт товар. Добавьте GET|item: возвращайте его количество в виде строки или 0, если товар отсутствует. На этом шаге входные данные используют только поддерживаемые операции.

Если выше не указаны более строгие ограничения, коллекции содержат не более 100 элементов на каждом уровне, а целочисленные аргументы и целочисленные значения коллекций находятся в диапазоне от -1000 до 1000. Текст, предоставленный для разбора, может содержать некорректные представления или представления чисел вне диапазона, как описано выше.

Возвращайте значение типа List<String>. Сохраните предоставленный код ввода/вывода. Он считывает скалярные аргументы по одному в строке; список начинается с его размера, за которым следуют его элементы, а отображение начинается с количества его записей, за которым следуют каждый ключ и значение. Вложенные списки используют тот же формат размера и элементов для каждой строки. Предоставленный main выводит возвращаемое значение, за которым следует один перевод строки. Списки используют стандартный формат Kotlin со скобками; не выводите дополнительные метки.

Попробуйте сами

fun runInventory(commands: List<String>): List<String> {
    val stock = mutableMapOf<String, Int>()
    val replies = mutableListOf<String>()
    for (command in commands) {
        val parts = command.split("|")
        val operation = parts[0]
        val item = if (parts.size > 1) parts[1] else ""
        when (operation) {
            "ADD" -> {
                val amount = parts[2].trim().toIntOrNull()
                if (amount == null || amount !in 0..1000) replies.add("invalid")
                else {
                    stock[item] = (stock[item] ?: 0) + amount
                    replies.add("added")
                }
            }
        }
    }
    return replies
}
fun main() {
    val commandsCount = readln().toInt()
    val commands = mutableListOf<String>()
    for (i0 in 0 until commandsCount) {
        val commandsItem = readLine().orEmpty()
        commands.add(commandsItem)
    }
    println(runInventory(commands))
}

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Песочница Kotlin