Menu
Coddy logo textTech

הוצאות לפי קטגוריה

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

challenge icon

אתגר

קל

הוסף את הפקודה CATEGORY. ודא שכל הפקודות מהשלבים הקודמים ממשיכות לעבוד בדיוק כמו קודם.

  • CATEGORY: השב בשורה אחת לכל קטגוריה, בסדר אלפביתי, food: 20.50, עם הסכום הכולל של הקטגוריה בשתי ספרות אחרי הנקודה העשרונית. אם לא נשמרו נתונים, השב no expenses.

פקודת CATEGORY אחת מפיקה כמה תשובות, וכל אחת מהן מודפסת בשורה נפרדת.

הקוד שסופק מעביר כל שורת קלט אל tracker() כפקודה אחת ומדפיס כל תשובה שהוחזרה בשורה נפרדת. התאריכים נכתבים בתבנית YYYY-MM-DD, הקטגוריות הן מילים באותיות קטנות, והקלט מכיל רק את הפקודות שתוארו עד כה.

נסו בעצמכם

tracker <- function(commands) {
  expenses <- data.frame(date = character(0), category = character(0), amount = numeric(0))
  replies <- c()
  for (cmd in commands) {
    parts <- strsplit(cmd, " ")[[1]]
    if (parts[1] == "ADD") {
      amount <- suppressWarnings(as.numeric(parts[4]))
      if (length(parts) != 4 || is.na(amount) || amount <= 0) {
        replies <- c(replies, paste("invalid:", cmd))
      } else {
        expenses <- rbind(expenses, data.frame(date = parts[2], category = parts[3], amount = amount))
        replies <- c(replies, sprintf("added %s %.2f", parts[3], amount))
      }
    } else if (parts[1] == "TOTAL") {
      replies <- c(replies, sprintf("total: %.2f, count: %d", sum(expenses$amount), nrow(expenses)))
    }
  }
  replies
}

# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
cat(tracker(input), sep = "\n")

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

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