Menu
CoddyTech

Siswa dengan Nilai Tertinggi

Termasuk bagian Logika dan Alur dalam perjalanan R di Coddy. Pelajaran 26 dari 64.

challenge icon

Tantangan

Sedang

Tambahkan perintah TOP. Pastikan setiap perintah dari langkah sebelumnya tetap berfungsi persis seperti sebelumnya.

  • TOP: balas dengan Top: diikuti siswa dengan rata-rata tertinggi dan rata-rata tersebut dengan satu angka desimal di dalam tanda kurung, seperti Top: ada (92.0). Siswa tanpa nilai dilewati. Jika rata-rata sama, pilih siswa yang namanya lebih dahulu secara alfabetis. Jika tidak ada siswa yang memiliki nilai, balas Top: none.

Kode yang disediakan meneruskan setiap baris input ke gradebook() sebagai satu perintah dan mencetak setiap balasan yang dikembalikan pada barisnya sendiri. Nama terdiri dari satu kata dengan huruf kecil, dan input hanya memuat perintah yang telah dijelaskan sejauh ini.

Coba sendiri

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
}

# Kode input/output yang disediakan: biarkan tetap seperti ini
input <- suppressWarnings(readLines(file("stdin")))
cat(gradebook(input), sep = "\n")

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler R online