Menu
Coddy logo textTech

Meilleur élève

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

challenge icon

Défi

Moyen

Ajoutez la commande TOP. Gardez chaque commande des étapes précédentes fonctionnelle exactement comme avant.

  • TOP : répondez Top: suivi de l’étudiant ayant la moyenne la plus élevée et de cette moyenne avec une décimale entre parenthèses, comme Top: ada (92.0). Les étudiants sans notes sont ignorés. En cas d’égalité des moyennes, choisissez l’étudiant dont le nom vient en premier dans l’ordre alphabétique. Lorsqu’aucun étudiant n’a de notes, répondez Top: none.

Le code fourni transmet chaque ligne d’entrée à gradebook() en tant que commande et affiche chaque réponse renvoyée sur sa propre ligne. Un nom est un mot en minuscules, et l’entrée contient uniquement les commandes décrites jusqu’à présent.

Essayez vous-même

average_text <- function(scores) {
  if (length(scores) == 0) "no grades" else sprintf("%.1f", mean(scores))
}

gradebook <- function(commands) {
  grades <- list()
  replies <- c()
  for (cmd in commands) {
    parts <- strsplit(cmd, " ")[[1]]
    name <- parts[2]
    if (parts[1] == "ADD") {
      if (name %in% names(grades)) {
        replies <- c(replies, paste(name, "already exists"))
      } else {
        grades[[name]] <- numeric(0)
        replies <- c(replies, paste("added", name))
      }
    } else if (parts[1] == "GRADE") {
      if (!(name %in% names(grades))) {
        replies <- c(replies, paste("no student", name))
      } else {
        score <- as.numeric(parts[3])
        grades[[name]] <- c(grades[[name]], score)
        replies <- c(replies, paste("recorded", score, "for", name))
      }
    } else if (parts[1] == "AVG") {
      if (!(name %in% names(grades))) {
        replies <- c(replies, paste("no student", name))
      } else {
        replies <- c(replies, paste0(name, ": ", average_text(grades[[name]])))
      }
    } else if (parts[1] == "REPORT") {
      for (student in sort(names(grades))) {
        replies <- c(replies, paste0(student, ": ", average_text(grades[[student]])))
      }
      replies <- c(replies, paste("Class average:", average_text(unlist(grades))))
    }
  }
  replies
}

# Code d'entrée/sortie fourni : le garder tel quel
input <- suppressWarnings(readLines(file("stdin")))
cat(gradebook(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