在庫レポート
CoddyのKotlinジャーニー「ロジックとフロー」セクションの一部。レッスン 59/63。
チャレンジ
難しいパラメーター commands: List<String> を使用して runInventory を完成させてください。関数が呼び出されるたびに空の状態から始まる在庫を構築します。各コマンドは、| で区切られたフィールドを持つ 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 の既存の商品は保持してください。REPORT を追加してください。保存されているすべてのエントリを item=quantity の形式で、; で区切って応答し、商品名のアルファベット順に並べます。在庫が 0 のエントリも含めてください。空の在庫は empty を生成します。REPORT には引数フィールドがありません。この段階でサポートされている操作のみが入力に使用されます。
上記でより厳しい境界が指定されていない限り、コレクションは各階層で最大 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())
"SELL" -> {
val amount = parts[2].trim().toIntOrNull()
val available = stock[item] ?: 0
if (amount == null || amount !in 0..1000) replies.add("invalid")
else if (amount > available) replies.add("insufficient")
else {
if (stock.containsKey(item)) stock[item] = available - amount
replies.add("sold")
}
}
}
}
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プレイグラウンド