Menu
Coddy logo textTech

イベントスケジューラー

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

challenge icon

チャレンジ

難しい

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