Menu
Coddy logo textTech

Monatliche Zusammenfassung

Teil des Abschnitts Logik und Ablaufsteuerung der R-Journey von Coddy. Lektion 61 von 64.

challenge icon

Aufgabe

Mittel

Füge den Befehl MONTH hinzu. Alle Befehle aus den vorherigen Schritten müssen weiterhin genau wie zuvor funktionieren.

  • MONTH <YYYY-MM>: Berücksichtige nur die Ausgaben, deren Datum mit diesem Monat beginnt. Antworte mit 2024-05: count 3, total 520.50, biggest rent, wobei die Anzahl der Ausgaben, die Gesamtsumme mit zwei Dezimalstellen und die Kategorie der größten Ausgabe des Monats enthalten sein sollen (bei mehreren gleich großen Ausgaben die erste). Wenn es keine gibt, antworte mit 2024-05: no expenses.

Der bereitgestellte Code übergibt jede Eingabezeile als einen Befehl an tracker() und gibt jede zurückgegebene Antwort in einer eigenen Zeile aus. Datumsangaben werden als YYYY-MM-DD geschrieben, Kategorien sind kleingeschriebene Wörter, und die Eingabe enthält nur die bisher beschriebenen Befehle.

Probier es selbst

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
}

# Gelieferter Ein-/Ausgabecode: belasse ihn wie er ist
input <- suppressWarnings(readLines(file("stdin")))
cat(tracker(input), sep = "\n")

Alle Lektionen in Logik und Ablaufsteuerung

Übe selbstständig: Online-R-Compiler