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

أكبر النفقات

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

challenge icon

التحدي

متوسط

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

  • TOP <n>: أجب بأكبر n من النفقات، كل واحدة في سطر، بدءًا من الأكبر، بالتنسيق 2024-05-02 rent 500.00. تُدرج النفقات ذات المبلغ نفسه حسب التاريخ، من الأقدم أولًا. إذا كان عدد النفقات أقل من n، فأدرجها كلها؛ وإذا لم توجد أي نفقات، فأجب 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))
      }
    }
  }
  replies
}

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

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

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