Menu
Coddy logo textTech

דוחות מלאי

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Kotlin של Coddy. שיעור 59 מתוך 63.

challenge icon

אתגר

קשה

השלימו את 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 אין שדות של ארגומנטים. הקלט משתמש רק בפעולות הנתמכות בשלב הזה.

אלא אם צוין לעיל טווח מחמיר יותר, אוספים מכילים לכל היותר 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")
                }
            }
        }
    }
    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))
}

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: Kotlin אונליין