Avvisi di scorte basse
Fa parte della sezione Logica e flusso del percorso Kotlin di Coddy. Lezione 60 di 63.
Sfida
DifficileCompleta 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
1Mappe Parte 1
Creare mappeConsultare le mappe in modo sicuroAggiornare le mappeControllare le chiaviRiepilogo - Banco di borsa4Collezioni annidate
Liste di listeAttraversare le righeRiepiloghi delle righeAppiattire liste annidateRipasso - File di posti a sedere7Pipeline di collezioni
Trasformare con MapFiltrare i valoriVerificare le regole della collezioneAccumulare con FoldRiepilogo - Totali approvati2Mappe Parte 2
Iterare sulle voci delle mappeChiavi e valoriMappe di frequenzaMappe annidateRiepilogo - Report delle frequenze5Progetto - Rubrica
Salva contattiTrova contatti3Insiemi e appartenenza
Creare insiemiAggiornare gli insiemiOperazioni sugli insiemiVerificare i sottoinsiemiRiepilogo - Ospiti dell'evento6Valori delle funzioni
Scrivere funzioni lambdaTipi di funzionePassare funzioniVariabili catturateRiepilogo - Punteggio configurabile9Flusso di controllo avanzato
Clausole di guardiaInterrompere cicli etichettatiContinuare cicli etichettatiFunzioni ricorsiveRiepilogo - Prima riga valida12Progetto - Inventario
Ricevere le scorteControllare le scorteEsercitati da solo: Playground Kotlin