Informes de inventario
Parte de la sección Lógica y flujo del Journey de Kotlin de Coddy. Lección 59 de 63.
Desafío
DifícilCompleta runInventory con los parámetros commands: List<String>. Construye un inventario que empiece vacío en cada llamada a la función. Cada comando es una cadena con campos separados por |. Los nombres de los artículos son palabras ASCII en minúsculas. Hay como máximo 100 comandos. Divide cada comando usando el separador literal; los comandos siempre tienen el número correcto de campos para su operación. Devuelve una respuesta por comando. Las cantidades se recortan antes de analizarlas; las cantidades válidas están entre 0 y 1000. El texto numérico no válido, el texto cuyo valor está fuera del rango de Int, las cantidades negativas o las cantidades superiores a 1000 producen invalid sin cambiar el estado. Conserva todo lo que escribiste en los pasos anteriores, incluidos todos los comandos y respuestas anteriores. Admite ADD|item|quantity: añade una cantidad válida al inventario de ese artículo, inicialmente cero, y responde added. Añadir cero también crea el artículo. Añade GET|item: responde con su cantidad como cadena, o con 0 cuando el artículo no está presente. Añade SELL|item|quantity: primero valida la cantidad usando las mismas reglas que para ADD. Para una cantidad válida, responde insufficient si el inventario disponible es menor; de lo contrario, réstala y responde sold. Un artículo ausente tiene cero unidades disponibles. Vender cero funciona correctamente sin crear un artículo inexistente. Conserva los artículos existentes cuyo inventario sea cero. Añade REPORT: responde con todas las entradas guardadas como item=quantity, separadas por ; y ordenadas alfabéticamente por artículo. Incluye las entradas cuyo inventario sea cero. Un inventario vacío produce empty. REPORT no tiene campos de argumentos. La entrada utiliza únicamente las operaciones admitidas en este paso.
A menos que se indiquen límites más estrictos arriba, las colecciones contienen como máximo 100 elementos en cada nivel, y los argumentos enteros y los valores enteros de las colecciones están entre -1000 y 1000. El texto proporcionado para analizar puede incluir representaciones no válidas o fuera de rango, como se describe.
Devuelve un valor de tipo List<String>. Conserva el código de entrada/salida proporcionado. Lee los argumentos escalares, uno por línea; una lista comienza con su cantidad, seguida de sus elementos, y un mapa comienza con la cantidad de sus entradas, seguida de cada clave y valor. Las listas anidadas repiten el formato de cantidad y elementos para cada fila. El main proporcionado imprime el valor devuelto seguido de un salto de línea. Las listas utilizan el formato estándar entre corchetes de Kotlin; no imprimas etiquetas adicionales.
Pruébalo tú mismo
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))
}Todas las lecciones de Lógica y flujo
1Mapas Parte 1
Crear mapasBúsquedas seguras en mapasActualizar mapasComprobar clavesRepaso - Stock Desk4Colecciones anidadas
Listas de listasRecorrer filasResúmenes de filasAplanar listas anidadasRepaso: filas de asientos7Flujos de colecciones
Transformar con MapFiltrar valoresProbar reglas de coleccionesAcumular con FoldRepaso: totales aprobados2Mapas, parte 2
Iterar entradas de mapasClaves y valoresMapas de frecuenciaMapas anidadosRepaso: informe de frecuencias5Proyecto - Agenda de contactos
Guardar contactosBuscar contactos3Conjuntos y pertenencia
Crear conjuntosActualizar conjuntosOperaciones con conjuntosComprobación de subconjuntosRepaso: invitados al evento6Valores de función
Escribir lambdasTipos de funciónPasar funcionesVariables capturadasRepaso - Puntuación configurable9Control de flujo avanzado
Cláusulas de guardaRomper bucles etiquetadosContinuar bucles etiquetadosFunciones recursivasRepaso: primera fila válida12Proyecto - Inventario
Recibir existenciasComprobar existenciasPractica por tu cuenta: Playground de Kotlin