מכירת מלאי
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Kotlin של Coddy. שיעור 58 מתוך 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. לפריט שאינו קיים יש מלאי זמין של אפס. מכירת אפס מצליחה בלי ליצור פריט חסר. השאר פריטים קיימים עם מלאי אפס. הקלט משתמש רק בפעולות הנתמכות בשלב זה.
אלא אם צוין לעיל טווח מחמיר יותר, אוספים מכילים לכל היותר 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())
}
}
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 אונליין