Menu
Coddy logo textTech

Avvisi di scorte basse

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

challenge icon

Sfida

Difficile

Completa runInventory con i parametri commands: List<String>. Crea un inventario che inizi 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. Rimuovi gli spazi dalle quantità prima di analizzarle; 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. Mantieni tutto ciò che hai scritto nei passaggi precedenti, inclusi ogni comando e risposta precedenti. Supporta ADD|item|quantity: aggiungi un importo valido alle scorte di quell'articolo, inizialmente pari a zero, e rispondi added. Anche aggiungere zero crea l'articolo. Aggiungi GET|item: rispondi con la sua quantità come stringa, oppure 0 se l'articolo è assente. Aggiungi SELL|item|quantity: convalida prima l'importo usando le stesse regole di ADD. Se l'importo è valido, rispondi insufficient se le scorte disponibili sono inferiori; altrimenti sottrai l'importo e rispondi sold. Un articolo assente ha zero scorte disponibili. Vendere zero ha esito positivo 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 di argomento. Aggiungi LOW|threshold: convalida threshold usando le stesse regole numeriche degli importi. Rispondi invalid se l'input non è valido. Altrimenti rispondi con i nomi degli articoli salvati la cui quantità è strettamente inferiore a threshold, ordinati alfabeticamente e separati da ;, oppure none se nessuno soddisfa il criterio. LOW non modifica le scorte. L'input usa solo le operazioni supportate in questo passaggio.

Salvo limiti più restrittivi indicati sopra, 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 conteggio seguito dagli elementi, mentre una mappa inizia con il conteggio delle sue voci seguito da ogni chiave e valore. Le liste annidate ripetono il formato conteggio ed elementi per ogni riga. Il main fornito stampa il valore restituito seguito da un a capo. 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")
                }
            }
            "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))
}

Tutte le lezioni di Logica e flusso

Esercitati da solo: Playground Kotlin