Menu
CoddyTech

Các khoản chi lớn nhất

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 60 trên 64.

challenge icon

Thử thách

Trung bình

Thêm lệnh TOP. Giữ cho mọi lệnh từ các bước trước vẫn hoạt động chính xác như trước.

  • TOP <n>: trả lời bằng 2024-05-02 rent 500.00, gồm n khoản chi lớn nhất, mỗi khoản trên một dòng, sắp xếp từ lớn nhất trở xuống. Nếu các khoản chi có cùng số tiền, hãy liệt kê theo ngày, từ sớm nhất trước. Nếu có ít hơn n khoản chi, hãy liệt kê tất cả; nếu không có khoản nào, hãy trả lời no expenses.

Code được cung cấp chuyển từng dòng đầu vào cho tracker() dưới dạng một lệnh và in mỗi câu trả lời trả về trên một dòng riêng. Ngày được viết theo định dạng YYYY-MM-DD, danh mục là các từ viết thường và đầu vào chỉ chứa những lệnh đã mô tả cho đến nay.

Tự làm thử

tracker <- function(commands) {
  expenses <- data.frame(date = character(0), category = character(0), amount = numeric(0))
  replies <- c()
  for (cmd in commands) {
    parts <- strsplit(cmd, " ")[[1]]
    if (parts[1] == "ADD") {
      amount <- suppressWarnings(as.numeric(parts[4]))
      if (length(parts) != 4 || is.na(amount) || amount <= 0) {
        replies <- c(replies, paste("invalid:", cmd))
      } else {
        expenses <- rbind(expenses, data.frame(date = parts[2], category = parts[3], amount = amount))
        replies <- c(replies, sprintf("added %s %.2f", parts[3], amount))
      }
    } else if (parts[1] == "TOTAL") {
      replies <- c(replies, sprintf("total: %.2f, count: %d", sum(expenses$amount), nrow(expenses)))
    } else if (parts[1] == "CATEGORY") {
      if (nrow(expenses) == 0) {
        replies <- c(replies, "no expenses")
      } else {
        totals <- tapply(expenses$amount, expenses$category, sum)
        replies <- c(replies, sprintf("%s: %.2f", names(totals), totals))
      }
    }
  }
  replies
}

# Đoạn code đầu vào/đầu ra đã được cung cấp: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
cat(tracker(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