Menu
CoddyTech

Ringkasan Bulanan

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

challenge icon

Tantangan

Sedang

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

  • MONTH <YYYY-MM>: pertimbangkan hanya pengeluaran dengan tanggal yang diawali bulan tersebut. Balas 2024-05: count 3, total 520.50, biggest rent dengan jumlah pengeluaran, total hingga dua angka desimal, dan kategori pengeluaran terbesar pada bulan tersebut (yang pertama jika ada beberapa pengeluaran dengan nilai yang sama). Jika tidak ada pengeluaran, balas 2024-05: 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 dengan huruf 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))
      }
    } else if (parts[1] == "TOP") {
      n <- as.numeric(parts[2])
      ranked <- expenses[order(-expenses$amount, expenses$date), ]
      top <- head(ranked, n)
      if (nrow(top) == 0) {
        replies <- c(replies, "no expenses")
      } else {
        replies <- c(replies, sprintf("%s %s %.2f", top$date, top$category, top$amount))
      }
    }
  }
  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