Menu
Coddy logo textTech

Bester Schüler

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

challenge icon

Aufgabe

Mittel

Füge den Befehl TOP hinzu. Jeder Befehl aus den vorherigen Schritten muss weiterhin genau wie zuvor funktionieren.

  • TOP: Antworte mit Top: , gefolgt von der Person mit dem höchsten Mittelwert und diesem Mittelwert mit einer Dezimalstelle in Klammern, zum Beispiel Top: ada (92.0). Personen ohne Noten werden übersprungen. Bei gleichen Mittelwerten wähle die Person, deren Name alphabetisch zuerst kommt. Wenn niemand Noten hat, antworte mit Top: none.

Der bereitgestellte Code übergibt jede Eingabezeile als einen Befehl an gradebook() und gibt jede zurückgegebene Antwort in einer eigenen Zeile aus. Ein Name besteht aus einem kleingeschriebenen Wort, und die Eingabe enthält ausschließlich die bisher beschriebenen Befehle.

Probier es selbst

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
}

# Bereitgestellter Ein-/Ausgabe-Code: belasse ihn unverändert
input <- suppressWarnings(readLines(file("stdin")))
cat(gradebook(input), sep = "\n")

Alle Lektionen in Logik und Ablaufsteuerung

Übe selbstständig: Online-R-Compiler