Menu
Coddy logo textTech

Größte Ausgaben

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

challenge icon

Aufgabe

Mittel

Füge den Befehl TOP hinzu. Sorge dafür, dass jeder Befehl aus den vorherigen Schritten weiterhin genau wie zuvor funktioniert.

  • TOP <n>: Antworte mit den n größten Ausgaben, eine pro Zeile, absteigend nach Betrag, im Format 2024-05-02 rent 500.00. Ausgaben mit demselben Betrag werden nach Datum aufgelistet, das früheste zuerst. Wenn weniger als n Ausgaben vorhanden sind, liste alle auf; wenn keine vorhanden sind, antworte mit 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 im Format 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))
      }
    }
  }
  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