Menu
CoddyTech

Chi tiêu theo danh mục

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

challenge icon

Thử thách

Dễ

Thêm lệnh CATEGORY. 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.

  • CATEGORY: trả lời một dòng cho mỗi danh mục theo thứ tự bảng chữ cái, food: 20.50, kèm tổng của danh mục đó với hai chữ số thập phân. Nếu chưa có khoản nào được ghi lại, trả lời no expenses.

Một lệnh CATEGORY tạo ra nhiều câu trả lời, mỗi câu được in trên một dòng riêng.

Code được cung cấp truyề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 được 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 lúc này.

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)))
    }
  }
  replies
}

# Đoạn code đầu vào/đầu ra có sẵn: 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