Menu
Coddy logo textTech

Report dell'inventario

Fa parte della sezione Logica e flusso del percorso Kotlin di Coddy. Lezione 59 di 63.

challenge icon

Sfida

Difficile

Completa runInventory con il parametro commands: List<String>. Crea un inventario inizialmente vuoto a ogni chiamata della funzione. Ogni comando è una stringa con campi separati da |. I nomi degli articoli sono parole ASCII in minuscolo. Ci sono al massimo 100 comandi. Dividi ogni comando usando il separatore letterale; i comandi hanno sempre il numero corretto di campi per la rispettiva operazione. Restituisci una risposta per ogni comando. Le quantità vengono ripulite dagli spazi prima dell'analisi; gli importi validi sono compresi tra 0 e 1000. Testo numerico non valido, testo fuori dall'intervallo di Int, importi negativi o importi superiori a 1000 producono invalid senza modificare lo stato. Conserva tutto ciò che hai scritto nei passaggi precedenti, inclusi tutti i comandi e le risposte precedenti. Supporta ADD|item|quantity: aggiungi una quantità valida alle scorte dell'articolo, inizialmente pari a zero, e rispondi added. Anche aggiungere zero crea l'articolo. Aggiungi GET|item: rispondi con la quantità come stringa oppure con 0 se l'articolo non è presente. Aggiungi SELL|item|quantity: prima convalida la quantità usando le stesse regole di ADD. Se la quantità è valida, rispondi insufficient se le scorte disponibili sono inferiori; altrimenti sottraila e rispondi sold. Un articolo assente ha zero scorte disponibili. La vendita di zero riesce senza creare un articolo mancante. Mantieni gli articoli esistenti con scorte pari a zero. Aggiungi REPORT: rispondi con tutte le voci salvate nel formato item=quantity, separate da ; e ordinate alfabeticamente per articolo. Includi le voci con scorte pari a zero. Un inventario vuoto produce empty. REPORT non ha campi argomento. L'input usa solo le operazioni supportate in questo passaggio.

A meno che sopra non siano specificati limiti più restrittivi, le raccolte contengono al massimo 100 elementi a ogni livello e gli argomenti interi e i valori interi delle raccolte sono compresi tra -1000 e 1000. Il testo fornito per l'analisi può includere rappresentazioni non valide o fuori intervallo, come descritto.

Restituisci un valore di tipo List<String>. Mantieni il codice di input/output fornito. Legge gli argomenti scalari uno per riga; una lista inizia con il suo numero di elementi seguito dagli elementi, e una mappa inizia con il numero di voci seguito da ogni chiave e valore. Le liste annidate ripetono il formato numero-di-elementi-e-elementi per ogni riga. Il main fornito stampa il valore restituito seguito da un carattere di nuova riga. Le liste usano il formato standard tra parentesi quadre di Kotlin; non stampare etichette aggiuntive.

Provalo tu

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

Tutte le lezioni di Logica e flusso

Esercitati da solo: Playground Kotlin