Menu
CoddyTech

Pengeluaran Terbesar

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

challenge icon

Tantangan

Sedang

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

  • TOP <n>: balas dengan n pengeluaran terbesar, masing-masing pada satu baris, dari yang terbesar ke yang terkecil, sebagai 2024-05-02 rent 500.00. Pengeluaran dengan jumlah yang sama diurutkan berdasarkan tanggal, dari yang paling awal. Jika jumlah pengeluaran kurang dari n, tampilkan semuanya; jika tidak ada, balas no expenses.

Kode yang disediakan meneruskan setiap baris input ke tracker() sebagai satu perintah dan mencetak setiap balasan yang dikembalikan pada barisnya sendiri. Tanggal ditulis dalam format YYYY-MM-DD, kategori berupa kata-kata berhuruf kecil, dan input hanya berisi perintah yang telah dijelaskan sejauh ini.

Coba sendiri

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
}

# Kode input/output yang disediakan: biarkan apa adanya
input <- suppressWarnings(readLines(file("stdin")))
cat(tracker(input), sep = "\n")

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler R online