התראות על מלאי נמוך
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-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))
}כל השיעורים ביחידה לוגיקה וזרימת תוכנית
4אוספים מקוננים
רשימות של רשימותמעבר על שורותסיכומים של שורותהשטחת רשימות מקוננותסיכום – שורות של מקומות ישיבה7צינורות עיבוד של אוספים
טרנספורמציה באמצעות Mapסינון ערכיםבדיקת כללי האוסףצבירה באמצעות Foldסיכום – סכומים מאושרים5פרויקט - ספר טלפונים
שמירת אנשי קשרחיפוש אנשי קשרתרגלו בעצמכם: Kotlin אונליין