Проверка запасов
Часть раздела Логика и управление потоком путешествия по Kotlin на Coddy. Урок 57 из 63.
Задание
СложноЗавершите 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))
}Все уроки раздела Логика и управление потоком
1Карты, часть 1
Создание картБезопасный доступ к картамОбновление картПроверка ключейПовторение — складской учёт4Вложенные коллекции
Списки списковОбход строкСводки по строкамСведение вложенных списковПовторение — ряды мест7Конвейеры коллекций
Преобразование с помощью MapФильтрация значенийПроверка правил коллекцийНакопление с помощью FoldПовторение — одобренные итоги2Карты. Часть 2
Перебор записей картыКлючи и значенияКарты частотВложенные картыПовторение — отчёт о частотах5Проект — Книга контактов
Сохранение контактовПоиск контактов3Множества и принадлежность
Создание множествОбновление множествОперации над множествамиПроверка подмножествПовторение — гости мероприятия6Значения функций
Написание лямбдТипы функцийПередача функцийЗахваченные переменныеПовторение — настраиваемый счёт9Расширенный контроль потока выполнения
Защитные условияПрерывание именованных цикловПродолжение именованных цикловРекурсивные функцииПовторение — первая допустимая строка12Проект — Учёт запасов
Приёмка запасовПроверка запасовПотренируйтесь самостоятельно: Песочница Kotlin