Menu
Coddy logo textTech

在庫販売

CoddyのKotlinジャーニー「ロジックとフロー」セクションの一部。レッスン 58/63。

challenge icon

チャレンジ

難しい

runInventoryをパラメーターcommands: List<String>付きで完成させてください。関数を呼び出すたびに空の状態から始まる在庫を構築します。各コマンドは、フィールドが|で区切られた1つの文字列です。アイテム名は小文字のASCII単語です。コマンドは最大100個です。各コマンドをリテラルの区切り文字で分割してください。コマンドには、その操作に必要な正しい数のフィールドが常に含まれています。コマンドごとに1つの応答を返してください。数量は解析前にトリミングされます。有効な数量は0以上1000以下です。無効な数値テキスト、Intの範囲外のテキスト、負の数量、または1000を超える数量の場合は、状態を変更せずにinvalidを返します。以前の手順で記述した内容は、以前のすべてのコマンドと応答を含め、すべて保持してください。ADD|item|quantityをサポートしてください。有効な数量を、そのアイテムの初期状態では0である在庫に加算し、addedを返します。0を加算した場合もアイテムは作成されます。GET|itemを追加してください。その数量を文字列として返し、アイテムが存在しない場合は0を返します。SELL|item|quantityを追加してください。まず、ADDと同じ規則で数量を検証します。有効な数量の場合、在庫数が不足していればinsufficientを返し、それ以外の場合は数量を減算してsoldを返します。存在しないアイテムの在庫数は0です。0の販売は、存在しないアイテムを作成せずに成功します。在庫数が0の既存アイテムは保持してください。この手順でサポートされている操作のみが入力に使用されます。

上記でより厳しい上限が示されていない限り、各レベルのコレクションには最大100個の要素が含まれ、整数の引数と整数のコレクション値は-1000以上1000以下です。解析用に提供されるテキストには、説明されている無効な表現や範囲外の表現が含まれる場合があります。

型List<String>の値を返してください。提供された入力/出力コードを保持してください。スカラー引数は1行に1つずつ読み取られます。リストは要素数に続いて各要素を読み取り、マップはエントリ数に続いて各キーと値を読み取ります。ネストされたリストでは、各行について要素数と要素の形式を繰り返します。提供されたmainは、返り値の後に改行を1つ出力します。リストには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")
                }
            }
            "GET" -> replies.add((stock[item] ?: 0).toString())
        }
    }
    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プレイグラウンド