Menu
Coddy logo textTech

復習 - パーキングメーター

CoddyのRジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 21/57。

challenge icon

チャレンジ

中級

Meter.R のファクトリ make_meter(rate) を完成させてください。rate は 1 セントで購入できる分数です。ファクトリ内で lockBinding() を使ってロックし、決して変更できないようにしてください。メーターは残り時間と支払ったセント数をプライベート変数として保持し、4 つの関数を返します:

  • 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オンラインコンパイラ