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.
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
4Các tập hợp lồng nhau
Danh sách các danh sáchDuyệt qua các hàngTóm tắt từng hàngLàm phẳng danh sách lồng nhauÔn tập: Các hàng ghế3Tập hợp và phép kiểm tra thành viên
Tạo tập hợpCập nhật tập hợpCác phép toán trên tập hợpKiểm tra tập conÔn tập: Khách mời sự kiện6Giá trị hàm
Viết biểu thức lambdaCác kiểu hàmTruyền hàmBiến được captureÔn tập: Điểm số có thể tùy chỉnh9Luồng điều khiển nâng cao
Mệnh đề bảo vệThoát khỏi vòng lặp có nhãnTiếp tục vòng lặp có nhãnHàm đệ quyÔn tập: hàng hợp lệ đầu tiên12Dự án: Quản lý kho
Nhập hàngKiểm tra hàng tồn khoTự luyện tập: Playground Kotlin