تنبيهات انخفاض المخزون
جزء من قسم المنطق وتدفق التنفيذ في رحلة Kotlin على Coddy. الدرس 60 من 63.
التحدي
صعبأكمل runInventory باستخدام المعاملات commands: List<String>. أنشئ مخزونًا يبدأ فارغًا عند كل استدعاء للدالة. كل أمر عبارة عن سلسلة نصية واحدة تحتوي على حقول مفصولة بواسطة |. أسماء العناصر كلمات ASCII صغيرة الأحرف. يوجد بحد أقصى 100 أمر. قسّم كل أمر باستخدام الفاصل الحرفي؛ تكون الأوامر دائمًا ذات العدد الصحيح من الحقول للعملية الخاصة بها. أعد ردًا واحدًا لكل أمر. تُزال المسافات من الكميات قبل تحليلها؛ والمقادير الصالحة تقع بين 0 و1000. ينتج عن النص الرقمي غير الصالح، أو النص الذي يتجاوز نطاق Int، أو المقادير السالبة، أو المقادير التي تتجاوز 1000، القيمة invalid من دون تغيير الحالة. احتفظ بكل ما كتبته في الخطوات السابقة، بما في ذلك كل أمر ورد سابق وكل رد. ادعم ADD|item|quantity: أضف مقدارًا صالحًا إلى مخزون ذلك العنصر، الذي يبدأ بقيمة صفر، وأعد added. تؤدي إضافة الصفر أيضًا إلى إنشاء العنصر. أضف GET|item: أعد كميته كسلسلة نصية، أو 0 عندما يكون العنصر غير موجود. أضف SELL|item|quantity: تحقّق أولًا من صحة المقدار باستخدام القواعد نفسها المتّبعة مع ADD. بالنسبة إلى مقدار صالح، أعد insufficient إذا كان المخزون المتاح أصغر؛ وإلا اطرح المقدار وأعد sold. العنصر غير الموجود لديه كمية متاحة تساوي صفرًا. ينجح بيع الصفر من دون إنشاء عنصر مفقود. احتفظ بالعناصر الموجودة ذات المخزون الصفري. أضف REPORT: أعد جميع الإدخالات المحفوظة بصيغة item=quantity مفصولة بواسطة ;، ومرتبة أبجديًا حسب العنصر. أدرج الإدخالات ذات المخزون الصفري. ينتج عن المخزون الفارغ empty. لا يحتوي REPORT على حقول معاملات. أضف LOW|threshold: تحقّق من صحة الحد باستخدام القواعد الرقمية نفسها المتّبعة مع المقادير. أعد invalid عند إدخال غير صالح. وإلا فأعد أسماء العناصر المحفوظة التي تكون كميتها أقل من الحد بشكل صارم، مرتبة أبجديًا ومفصولة بواسطة ;، أو none إذا لم يطابق أي عنصر. لا يغيّر LOW المخزون. يستخدم الإدخال العمليات المدعومة في هذه الخطوة فقط.
ما لم تُذكر حدود أكثر صرامة أعلاه، تحتوي المجموعات على 100 عنصر كحد أقصى في كل مستوى، وتتراوح المعاملات الصحيحة وقيم المجموعات الصحيحة بين -1000 و1000. يمكن أن يتضمن النص المُقدَّم للتحليل تمثيلات غير صالحة أو خارج النطاق كما هو موضح.
أعد قيمة من النوع List<String>. احتفظ بكود الإدخال/الإخراج المُقدَّم. فهو يقرأ المعاملات المفردة، واحدًا في كل سطر؛ وتبدأ القائمة بعدد عناصرها متبوعًا بعناصرها، وتبدأ الخريطة بعدد إدخالاتها متبوعًا بكل مفتاح وقيمة. تكرر القوائم المتداخلة تنسيق العدد والعناصر لكل صف. تطبع main المُقدَّمة قيمة الإرجاع متبوعة بسطر جديد واحد. تستخدم القوائم التنسيق القياسي ذي الأقواس في Kotlin؛ ولا تطبع أي تسميات إضافية.
جرّب بنفسك
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))
}جميع دروس المنطق وتدفق التنفيذ
1القواميس، الجزء الأول
إنشاء القواميسالبحث الآمن في القواميستحديث القواميسالتحقق من المفاتيحمراجعة - مكتب الأسهم4المجموعات المتداخلة
قوائم القوائماستعراض الصفوفملخصات الصفوفتسطيح القوائم المتداخلةمراجعة - صفوف المقاعد7مسارات معالجة المجموعات
التحويل باستخدام Mapتصفية القيماختبار قواعد المجموعاتالتجميع باستخدام Foldمراجعة - الإجماليات المعتمدة2الخرائط - الجزء الثاني
التكرار على إدخالات الخريطةالمفاتيح والقيمخرائط التكرارالخرائط المتداخلةمراجعة - تقرير التكرار5مشروع - دفتر جهات الاتصال
حفظ جهات الاتصالالعثور على جهات الاتصالتدرّب بنفسك: Playground لـ Kotlin