Menu
Coddy logo textTech

복습 - 주차 요금기

Coddy R 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 21번째.

challenge icon

챌린지

중급

Meter.R에서 팩토리 make_meter(rate)를 완성하세요. rate는 1센트로 구매할 수 있는 시간(분)이며, 절대로 변경되지 않도록 팩토리 내부에서 lockBinding()으로 잠그세요. 미터는 남은 시간(분)과 지불한 센트를 비공개 변수로 유지하고 네 개의 함수를 반환합니다:

  • insert(cents)는 10, 20, 50 또는 100만 허용하며, 그 외의 값이 입력되면 coin not accepted와 함께 중지됩니다. 각 동전은 cents * rate분을 추가하고 지불 금액에 반영됩니다.
  • wait(minutes)는 시간이 흐르게 합니다. 남은 시간(분)은 줄어들지만 0보다 작아지지는 않습니다. 음수로 기다리면 time cannot go back과 함께 중지됩니다.
  • status()는 12 min left를 반환하거나, 남은 시간이 없으면 expired를 반환합니다.
  • paid()는 지불한 센트를 반환합니다.

call. = FALSE를 사용하세요. 제공된 코드는 요금을 읽은 다음 coin 20 또는 wait 5 형식의 줄을 읽고, 각 줄 다음에 상태 또는 error: 와 메시지를 출력합니다. 마지막으로 지불한 금액을 출력하고 팩토리의 환경 내부에서 rate를 변경하려고 시도합니다.

코드는 Meter.R에 작성하세요. main.R에는 제공된 입력/출력 코드가 들어 있으며 편집할 수 없습니다.

직접 해보기

source("Meter.R")

# 제공된 입력/출력 코드: 그대로 유지하세요
input <- suppressWarnings(readLines(file("stdin")))
meter <- make_meter(as.numeric(input[1]))
for (line in input[-1]) {
  p <- strsplit(line, " ")[[1]]
  msg <- tryCatch({
    if (p[1] == "coin") meter$insert(as.numeric(p[2]))
    if (p[1] == "wait") meter$wait(as.numeric(p[2]))
    meter$status()
  }, error = function(e) paste("error:", conditionMessage(e)))
  cat(line, ": ", msg, "\n", sep = "")
}
cat("paid: ", meter$paid(), " cents\n", sep = "")
r <- tryCatch({ environment(meter$insert)$rate <- 0; "rate changed" }, error = function(e) "rate is locked")
cat(r, "\n", sep = "")

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 R 컴파일러