복습 - 주차 요금기
Coddy R 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 21번째.
챌린지
중급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 컴파일러