Menu
Coddy logo textTech

Résumé mensuel

Fait partie de la section Logique et flux d’exécution du Journey R de Coddy. Leçon 61 sur 64.

challenge icon

Défi

Moyen

Ajoutez la commande MONTH. Veillez à ce que toutes les commandes des étapes précédentes continuent de fonctionner exactement comme avant.

  • MONTH <YYYY-MM> : ne prenez en compte que les dépenses dont la date commence par ce mois. Répondez 2024-05: count 3, total 520.50, biggest rent avec le nombre de dépenses, le total avec deux décimales et la catégorie de la dépense la plus importante du mois (la première en cas d’égalité). S’il n’y en a aucune, répondez 2024-05: no expenses.

Le code fourni transmet chaque ligne d’entrée à tracker() comme une seule commande et affiche chaque réponse renvoyée sur sa propre ligne. Les dates sont écrites au format YYYY-MM-DD, les catégories sont des mots en minuscules et l’entrée contient uniquement les commandes décrites jusqu’à présent.

Essayez vous-même

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
}

# Code d'entrée/sortie fourni : le garder tel quel
input <- suppressWarnings(readLines(file("stdin")))
cat(tracker(input), sep = "\n")

Toutes les leçons de Logique et flux d’exécution

Entraînez-vous par vous-même : Compilateur R en ligne