Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الملخص الشهري

جزء من قسم المنطق وتدفق التنفيذ في رحلة R على Coddy. الدرس 61 من 64.

challenge icon

التحدي

متوسط

أضف الأمر MONTH. حافظ على عمل كل أمر من الخطوات السابقة تمامًا كما كان من قبل.

  • MONTH <YYYY-MM>: لا تأخذ في الاعتبار سوى النفقات التي يبدأ تاريخها بذلك الشهر. أجب بـ 2024-05: count 3, total 520.50, biggest rent مع عدد النفقات، والإجمالي حتى منزلتين عشريتين، وفئة أكبر نفقة في الشهر (الأولى عند تساوي عدة نفقات). عند عدم وجود أي نفقات، أجب بـ 2024-05: no expenses.

يمرر الكود المقدم كل سطر إدخال إلى 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)))
    } else if (parts[1] == "CATEGORY") {
      if (nrow(expenses) == 0) {
        replies <- c(replies, "no expenses")
      } else {
        totals <- tapply(expenses$amount, expenses$category, sum)
        replies <- c(replies, sprintf("%s: %.2f", names(totals), totals))
      }
    } else if (parts[1] == "TOP") {
      n <- as.numeric(parts[2])
      ranked <- expenses[order(-expenses$amount, expenses$date), ]
      top <- head(ranked, n)
      if (nrow(top) == 0) {
        replies <- c(replies, "no expenses")
      } else {
        replies <- c(replies, sprintf("%s %s %.2f", top$date, top$category, top$amount))
      }
    }
  }
  replies
}

# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input <- suppressWarnings(readLines(file("stdin")))
cat(tracker(input), sep = "\n")

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم R عبر الإنترنت