Menu
CoddyTech

Cảnh báo hàng sắp hết

Thuộc phần Logic và luồng chương trình trong hành trình Kotlin của Coddy. Bài học 60 trên 63.

challenge icon

Thử thách

Khó

Hoàn thiện runInventory với các tham số commands: List<String>. Tạo một kho hàng bắt đầu trống ở mỗi lần gọi hàm. Mỗi lệnh là một chuỗi có các trường được phân tách bằng |. Tên mặt hàng là các từ ASCII viết thường. Có tối đa 100 lệnh. Tách từng lệnh theo dấu phân cách chính xác này; số trường của mỗi lệnh luôn đúng với thao tác tương ứng. Trả về một câu trả lời cho mỗi lệnh. Cắt khoảng trắng ở hai đầu số lượng trước khi phân tích; số lượng hợp lệ nằm trong khoảng từ 0 đến 1000. Văn bản số không hợp lệ, văn bản có giá trị nằm ngoài phạm vi của Int, số lượng âm hoặc số lượng lớn hơn 1000 đều tạo ra câu trả lời invalid và không làm thay đổi trạng thái. Giữ lại tất cả những gì bạn đã viết ở các bước trước, bao gồm mọi lệnh và câu trả lời trước đó. Hỗ trợ ADD|item|quantity: thêm một số lượng hợp lệ vào lượng hàng của mặt hàng đó, ban đầu là 0, rồi trả lời added. Thêm 0 vẫn tạo mặt hàng. Thêm GET|item: trả lời bằng số lượng của mặt hàng dưới dạng chuỗi, hoặc 0 nếu không có mặt hàng đó. Thêm SELL|item|quantity: trước tiên, xác thực số lượng theo cùng quy tắc như ADD. Nếu số lượng hợp lệ, trả lời insufficient khi lượng hàng hiện có nhỏ hơn số lượng cần bán; nếu không, trừ số lượng đó rồi trả lời sold. Mặt hàng không tồn tại có lượng hàng hiện có là 0. Bán 0 vẫn thành công nhưng không tạo mặt hàng còn thiếu. Giữ lại các mặt hàng hiện có với lượng hàng bằng 0. Thêm REPORT: trả lời bằng tất cả mục đã lưu theo định dạng item=quantity, phân tách bằng ; và sắp xếp theo thứ tự bảng chữ cái của tên mặt hàng. Bao gồm cả các mục có lượng hàng bằng 0. Kho hàng trống sẽ tạo câu trả lời empty. REPORT không có trường đối số. Thêm LOW|threshold: xác thực ngưỡng theo cùng quy tắc số như số lượng. Trả lời invalid nếu đầu vào không hợp lệ. Nếu không, trả lời bằng tên các mặt hàng đã lưu có số lượng nhỏ hơn nghiêm ngặt so với ngưỡng, sắp xếp theo thứ tự bảng chữ cái và phân tách bằng ;, hoặc trả lời none nếu không có mặt hàng nào thỏa điều kiện. LOW không làm thay đổi lượng hàng. Đầu vào chỉ sử dụng các thao tác được hỗ trợ ở bước này.

Trừ khi các giới hạn chặt hơn được nêu ở trên, mỗi tập hợp có tối đa 100 phần tử ở mỗi cấp, và các đối số số nguyên cùng các giá trị số nguyên trong tập hợp nằm trong khoảng từ -1000 đến 1000. Văn bản được cung cấp để phân tích có thể chứa các dạng biểu diễn không hợp lệ hoặc nằm ngoài phạm vi như đã mô tả.

Trả về một giá trị có kiểu List<String>. Giữ nguyên code đầu vào/đầu ra đã cung cấp. Code này đọc từng đối số đơn lẻ trên một dòng; danh sách bắt đầu bằng số lượng phần tử, sau đó là các phần tử, còn từ điển bắt đầu bằng số mục, sau đó là từng khóa và giá trị. Danh sách lồng nhau lặp lại định dạng số lượng phần tử và các phần tử cho mỗi hàng. main đã cung cấp in giá trị trả về, theo sau là một ký tự xuống dòng. Danh sách sử dụng định dạng chuẩn có dấu ngoặc vuông của Kotlin; không in thêm nhãn nào.

Tự làm thử

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))
}

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Playground Kotlin