Menu
CoddyTech

Peringatan Stok Menipis

Termasuk bagian Logika & Alur dalam perjalanan Kotlin di Coddy. Pelajaran 60 dari 63.

challenge icon

Tantangan

Sulit

Lengkapi runInventory dengan parameter commands: List<String>. Buat inventaris yang kosong pada setiap pemanggilan fungsi. Setiap perintah berupa satu string dengan field yang dipisahkan oleh |. Nama item berupa kata ASCII huruf kecil. Jumlah perintah paling banyak 100. Pisahkan setiap perintah berdasarkan pemisah literal; jumlah field pada setiap perintah selalu sesuai dengan operasinya. Kembalikan satu balasan untuk setiap perintah. Pangkas kuantitas sebelum menguraikannya; jumlah yang valid berada di antara 0 dan 1000. Teks numerik yang tidak valid, teks di luar rentang Int, jumlah negatif, atau jumlah di atas 1000 menghasilkan invalid tanpa perubahan status. Pertahankan semua yang kamu tulis pada langkah sebelumnya, termasuk setiap perintah dan balasan sebelumnya. Dukung ADD|item|quantity: tambahkan jumlah valid ke stok item tersebut, yang awalnya nol, lalu balas added. Menambahkan nol tetap membuat item. Tambahkan GET|item: balas dengan kuantitasnya sebagai string, atau 0 jika item tidak ada. Tambahkan SELL|item|quantity: validasi jumlah terlebih dahulu dengan aturan yang sama seperti ADD. Untuk jumlah yang valid, balas insufficient jika stok yang tersedia lebih sedikit; jika tidak, kurangi stok dan balas sold. Item yang tidak ada memiliki stok tersedia nol. Menjual nol berhasil tanpa membuat item yang belum ada. Pertahankan item yang sudah ada dengan stok nol. Tambahkan REPORT: balas dengan semua entri tersimpan dalam format item=quantity, dipisahkan oleh ; dan diurutkan secara alfabetis berdasarkan item. Sertakan entri dengan stok nol. Inventaris kosong menghasilkan empty. REPORT tidak memiliki field argumen. Tambahkan LOW|threshold: validasi threshold dengan aturan numerik yang sama seperti jumlah. Balas invalid untuk input yang tidak valid. Jika valid, balas dengan nama item tersimpan yang kuantitasnya kurang dari threshold, diurutkan secara alfabetis dan dipisahkan oleh ;, atau none jika tidak ada yang memenuhi syarat. LOW tidak mengubah stok. Input hanya menggunakan operasi yang didukung pada langkah ini.

Kecuali batas yang lebih ketat dinyatakan di atas, koleksi berisi paling banyak 100 elemen pada setiap tingkat, dan argumen integer serta nilai integer dalam koleksi berada di antara -1000 dan 1000. Teks yang diberikan untuk diuraikan dapat berisi representasi yang tidak valid atau di luar rentang, seperti yang dijelaskan.

Kembalikan nilai bertipe List<String>. Pertahankan kode input/output yang disediakan. Kode tersebut membaca argumen skalar satu per baris; sebuah list dimulai dengan jumlah elemennya, lalu diikuti elemen-elemennya, sedangkan sebuah map dimulai dengan jumlah entrinya, lalu diikuti setiap key dan value. List bersarang mengulangi format jumlah-elemen untuk setiap baris. main yang disediakan mencetak nilai yang dikembalikan, lalu satu baris baru. List menggunakan format standar Kotlin dengan tanda kurung siku; jangan cetak label tambahan.

Coba sendiri

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")
                }
            }
            "REPORT" -> {
                if (stock.isEmpty()) replies.add("empty")
                else replies.add(stock.keys.sorted().map { "$it=${stock[it]}" }.joinToString(";"))
            }
        }
    }
    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))
}

Semua pelajaran di Logika & Alur

Latihan sendiri: Playground Kotlin