Stok Raporları
Coddy'nin Kotlin Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 59 / 63.
Görev
ZorrunInventory işlevini commands: List<String> parametresiyle tamamla. Her işlev çağrısı için başlangıçta boş olan bir envanter oluştur. Her komut, alanları | ile ayrılmış tek bir dizedir. Ürün adları küçük harfli ASCII sözcüklerdir. En fazla 100 komut vardır. Her komutu değişmez ayırıcıya göre böl; komutlar, işlemleri için her zaman doğru sayıda alana sahiptir. Her komut için bir yanıt döndür. Miktarlar ayrıştırılmadan önce baştaki ve sondaki boşlukları kaldırılır; geçerli miktarlar 0 ile 1000 arasındadır. Geçersiz sayısal metin, Int aralığı dışındaki metin, negatif miktarlar veya 1000'in üzerindeki miktarlar, durum değişikliği olmadan invalid üretir. Önceki adımlarda yazdığın her şeyi, daha önceki her komut ve yanıt dahil olmak üzere koru. ADD|item|quantity desteği ekle: geçerli bir miktarı, başlangıçta sıfır olan o ürünün stoğuna ekle ve added yanıtını ver. Sıfır eklemek de ürünü oluşturur. GET|item desteği ekle: ürünün miktarını bir dize olarak veya ürün yoksa 0 yanıtını ver. SELL|item|quantity desteği ekle: önce miktarı ADD ile aynı kuralları kullanarak doğrula. Miktar geçerliyse, mevcut stok daha küçükse insufficient yanıtını ver; aksi takdirde miktarı çıkar ve sold yanıtını ver. Olmayan bir ürünün mevcut miktarı sıfırdır. Sıfır satışı, olmayan bir ürün oluşturmadan başarılı olur. Stoğu sıfır olan mevcut ürünleri koru. REPORT desteği ekle: kaydedilmiş tüm girdileri item=quantity biçiminde, ; ile ayrılmış ve ürüne göre alfabetik olarak sıralanmış şekilde yanıtla. Stoğu sıfır olan girdileri de dahil et. Boş bir envanter empty üretir. REPORT işleminde bağımsız argüman alanları yoktur. Girdi yalnızca bu adımda desteklenen işlemleri kullanır.
Yukarıda daha katı sınırlar belirtilmediği sürece koleksiyonlar her düzeyde en fazla 100 öğe içerir; tamsayı bağımsız değişkenler ve tamsayı koleksiyon değerleri -1000 ile 1000 arasındadır. Ayrıştırma için sağlanan metin, açıklandığı gibi geçersiz veya aralık dışı gösterimler içerebilir.
List<String> türünde bir değer döndür. Sağlanan girdi/çıktı kodunu koru. Bu kod, skaler bağımsız değişkenleri satır başına bir tane okur; bir liste, ardından öğeleri gelecek şekilde sayısıyla başlar ve bir map, ardından her anahtar ve değer gelecek şekilde girdi sayısıyla başlar. İç içe listeler, her satır için sayım ve öğeler biçimini tekrarlar. Sağlanan main, dönüş değerini ve ardından bir satır sonunu yazdırır. Listeler Kotlin'in standart köşeli parantezli biçimini kullanır; ek etiket yazdırma.
Kendin dene
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))
}Mantık ve Akış bölümündeki tüm dersler
1Map'ler Bölüm 1
Map'ler OluşturmaGüvenli Map AramalarıMap'leri GüncellemeAnahtarları Kontrol EtmeTekrar - Stok Masası4İç İçe Koleksiyonlar
Liste ListeleriSatırlarda GezinmeSatır Özetleriİç İçe Listeleri DüzleştirmeTekrar - Oturma Sıraları7Koleksiyon İşlem Hatları
Map ile DönüştürmeDeğerleri FiltrelemeKoleksiyon Kurallarını Test EtmeFold ile BiriktirmeTekrar - Onaylanan Toplamlar2Map'ler Bölüm 2
Map Girdileri Üzerinde YinelemeAnahtarlar ve DeğerlerFrekans Map'leriİç İçe Map'lerTekrar - Frekans Raporu5Proje - Kişi Defteri
Kişileri KaydetmeKişileri Bulma3Kümeler ve Üyelik
Kümeler OluşturmaKümeleri GüncellemeKüme İşlemleriAlt Küme KontrolleriÖzet - Etkinlik Konukları6Fonksiyon Değerleri
Lambda YazmaFonksiyon TürleriFonksiyonları GeçirmeYakalanan DeğişkenlerÖzet - Yapılandırılabilir PuanKendi başına pratik yap: Kotlin playground