Vendere le scorte
Fa parte della sezione Logica e flusso del percorso Kotlin di Coddy. Lezione 58 di 63.
Sfida
DifficileCompleta runInventory con i parametri commands: List<String>. Crea un inventario che parte vuoto a ogni chiamata della funzione. Ogni comando è una stringa con campi separati da |. I nomi degli articoli sono parole ASCII minuscole. Ci sono al massimo 100 comandi. Separa 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 superiori a 1000 producono invalid senza modificare lo stato. Mantieni tutto ciò che hai scritto nei passaggi precedenti, inclusi tutti i comandi e le risposte precedenti. Supporta ADD|item|quantity: aggiungi un importo valido alla giacenza 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 con 0 se l’articolo non è presente. Aggiungi SELL|item|quantity: prima convalida l’importo usando le stesse regole di ADD. Se l’importo è valido, rispondi insufficient se la giacenza disponibile è inferiore; altrimenti sottrai l’importo e rispondi sold. Un articolo assente ha una giacenza disponibile pari a zero. La vendita di zero ha esito positivo senza creare un articolo mancante. Mantieni gli articoli esistenti con giacenza zero. L’input usa solo le operazioni supportate in questo passaggio.
A meno che sopra non siano indicati 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 conteggio, seguito dai suoi elementi, e 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 carattere di nuova riga. Le liste usano il formato standard di Kotlin tra parentesi quadre; 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())
}
}
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