イベントスケジューラー
CoddyのRジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 56/57。
チャレンジ
難しい2つのファイルにイベントスケジューラーを構築してください。
Event.R: フィールドtitle、day、start、end(時間)を持つS3クラスevent。new_event()を記述してください。day must be from 1 to 31またはhours must be within 0 to 24 and start before endで停止するvalidate_event()、テキスト引数を数値に変換するヘルパーevent(title, day, start, end)、day 3 09-11 standupを返すformat.event()、および2つのイベントが同じ日にあり、それぞれの開始時刻がもう一方の終了時刻より前である場合にTRUEとなるoverlaps(a, b)。Scheduler.R:make_scheduler()はイベントを非公開に保持し、add(e)を返します。同じ日に同じタイトルのイベントの場合はduplicate、イベントが既存のイベントと重複する場合はconflicts with review、それ以外の場合はaddedを返します。また、日、開始時刻、タイトルの順に並べ替えた整形済みイベントを返すagenda()と、合計時間に基づくbusiest: day 3 (4 hours)(同点の場合は早い日)、またはno eventsを返すbusiest_day()を提供します。
call. = FALSEを使用してください。提供されたコードは title,day,start,end の行を読み取り、それぞれの返信を出力した後、アジェンダと最も忙しい日を出力します。
コードは Event.R と Scheduler.R に記述してください。main.Rには提供された入出力コードが含まれており、編集できません。
自分で試してみよう
source("Event.R")
source("Scheduler.R")
# 提供された入出力コード: そのままにしておく
input <- suppressWarnings(readLines(file("stdin")))
s <- make_scheduler()
for (line in input) {
p <- strsplit(line, ",")[[1]]
reply <- tryCatch(s$add(event(p[1], p[2], p[3], p[4])), error = function(e) paste("invalid:", conditionMessage(e)))
cat(p[1], ": ", reply, "\n", sep = "")
}
cat("agenda:\n")
for (l in s$agenda()) cat(" ", l, "\n", sep = "")
cat(s$busiest_day(), "\n", sep = "")
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ