Düşük Stok Uyarıları
Coddy'nin Kotlin Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 60 / 63.
Görev
ZorrunInventory işlevini commands: List<String> parametresiyle tamamlayın. Her işlev çağrısı için boş başlayan bir envanter oluşturun. Her komut, alanları | ile ayrılmış tek bir dizedir. Öğe adları küçük ASCII sözcükleridir. En fazla 100 komut vardır. Her komutu gerçek ayırıcıya göre bölün; komutlar her zaman işlemleri için doğru sayıda alana sahiptir. Her komut için bir yanıt döndürün. Miktarlar ayrıştırılmadan önce baştaki ve sondaki boşluklardan arındı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'den büyük miktarlar, durum değişikliği olmadan invalid üretir. Daha önceki adımlarda yazdığınız her şeyi, daha önceki tüm komut ve yanıtlar dahil, koruyun. ADD|item|quantity desteği ekleyin: geçerli miktarı, başlangıçta sıfır olan ilgili öğenin stokuna ekleyin ve added yanıtını verin. Sıfır eklemek yine de öğeyi oluşturur. GET|item ekleyin: öğenin miktarını dize olarak veya öğe yoksa 0 yanıtını verin. SELL|item|quantity ekleyin: önce miktarı ADD ile aynı kuralları kullanarak doğrulayın. Miktar geçerliyse kullanılabilir stok daha küçük olduğunda insufficient yanıtını verin; aksi hâlde miktarı çıkarın ve sold yanıtını verin. Mevcut olmayan bir öğenin kullanılabilir miktarı sıfırdır. Sıfır satışı, eksik bir öğe oluşturmadan başarılı olur. Stoku sıfır olan mevcut öğeleri koruyun. REPORT ekleyin: kaydedilmiş tüm girdileri item=quantity biçiminde, ; ile ayrılmış ve öğeye göre alfabetik sıralanmış şekilde yanıtlayın. Stoku sıfır olan girdileri de dahil edin. Boş bir envanter empty üretir. REPORT işleminde bağımsız değişken alanları yoktur. LOW|threshold ekleyin: eşiği, miktarlarla aynı sayısal kuralları kullanarak doğrulayın. Geçersiz girişte invalid yanıtını verin. Aksi hâlde, miktarı eşikten kesin olarak küçük olan kayıtlı öğe adlarını alfabetik sıralanmış ve ; ile ayrılmış şekilde veya uygun öğe yoksa none olarak yanıtlayın. LOW stok durumunu değiştirmez. Girdi yalnızca bu adımda desteklenen işlemleri kullanır.
Yukarıda daha sıkı sınırlar belirtilmedikçe 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ün. Sağlanan girdi/çıktı kodunu koruyun. Bu kod, skaler bağımsız değişkenleri satır başına bir tane okur; bir liste, ardından öğeleri gelen sayısıyla başlar ve bir eşleme, ardından her anahtar ve değer gelen girdi sayısıyla başlar. İç içe listeler, her satır için sayı ve öğeler biçimini tekrarlar. Sağlanan main, dönüş değerini ve ardından bir yeni satırı yazdırır. Listeler Kotlin'in standart köşeli parantezli biçimini kullanır; ek etiket yazdırmayın.
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")
}
}
"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))
}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