Menu
Coddy logo textTech

Studente migliore

Fa parte della sezione Logica e flusso del percorso R di Coddy. Lezione 26 di 64.

challenge icon

Sfida

Medio

Aggiungi il comando TOP. Mantieni funzionanti esattamente come prima tutti i comandi dei passaggi precedenti.

  • TOP: rispondi Top: seguito dallo studente con la media più alta e da quella media con una cifra decimale tra parentesi, ad esempio Top: ada (92.0). Gli studenti senza voti vengono ignorati. In caso di parità tra le medie, scegli lo studente il cui nome viene prima in ordine alfabetico. Quando nessuno studente ha voti, rispondi Top: none.

Il codice fornito passa ogni riga di input a gradebook() come un singolo comando e stampa ogni risposta restituita su una riga separata. Un nome è una singola parola in minuscolo e l'input contiene solo i comandi descritti finora.

Provalo tu

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
}

# Codice di input/output fornito: lascialo così com'è
input <- suppressWarnings(readLines(file("stdin")))
cat(gradebook(input), sep = "\n")

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore R online