Menu
CoddyTech

Học sinh đứng đầu

Thuộc phần Logic và luồng điều khiển trong hành trình R của Coddy. Bài học 26 trên 64.

challenge icon

Thử thách

Trung bình

Thêm lệnh (command) TOP. Giữ cho mọi lệnh từ các bước trước tiếp tục hoạt động chính xác như trước.

  • TOP: trả lời bằng Top: , theo sau là học sinh có giá trị trung bình (mean) cao nhất và giá trị trung bình đó với một chữ số thập phân trong ngoặc, như Top: ada (92.0). Bỏ qua học sinh chưa có điểm. Nếu giá trị trung bình bằng nhau, chọn học sinh có tên đứng trước theo thứ tự bảng chữ cái. Nếu không học sinh nào có điểm, trả lời Top: none.

Code được cung cấp chuyển từng dòng đầu vào vào hàm (function) gradebook() dưới dạng một lệnh và in ra từng câu trả lời được trả về trên một dòng riêng. Tên gồm một từ viết thường, và đầu vào chỉ chứa các lệnh đã mô tả đến đây.

Tự làm thử

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
}

# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
cat(gradebook(input), sep = "\n")

Tất cả bài học trong Logic và luồng điều khiển

Tự luyện tập: Trình biên dịch R online