Menu
Coddy logo textTech

Повторение — парковочный счётчик

Часть раздела Объектно-ориентированное программирование путешествия по R на Coddy. Урок 21 из 57.

challenge icon

Задание

Средне

Завершите фабрику make_meter(rate) в Meter.R. rate — это количество минут, которое покупает один цент; заблокируйте его с помощью 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