Menu
Coddy logo textTech

イベントスケジューラー

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

challenge icon

チャレンジ

難しい

イベントスケジューラーを作成してください。

  • Event(title, day, start, end)(0〜24時間)は、日、開始時刻、タイトルの順で並べられる Comparable<Event> を実装するクラスです。タイトルと日が一致する場合(同じイベントが2回入力された場合)、2つのイベントは等しいものとみなされるため、これら2つのプロパティに基づいて equals と hashCode をオーバーライドしてください。表示形式は day 3 09-11 standup で、時刻は2桁で表示します。同じ日に、一方のイベントの開始時刻がもう一方のイベントの終了時刻より前であり、かつもう一方の開始時刻が最初のイベントの終了時刻より前である場合、overlaps(other) は true になります。
  • Scheduler.add(event) は、イベントが開始後に終了しない場合は invalid: standup、等しいイベントの場合は duplicate、agendaの順序で最初に重複するイベントがある場合は conflicts with review、それ以外の場合は added を返します。
  • agenda() はイベントをソートして返し、busiestDay() は予約時間が最も多い日の場合に busiest day 3: 5h を返します(同率の場合は早い日)。イベントがない場合は no events を返します。

提供されたコードは、イベントを title,day,start,end 形式の行として読み込み、それぞれの返答を出力した後、agenda(1行につき1イベント)と最も忙しい日を出力します。

コードは Event.kt と Scheduler.kt に記述してください。Main.kt には提供された入出力コードが含まれており、編集できません。

自分で試してみよう

fun main() {
    // 提供された入出力コード: そのままにしておく
    val input = generateSequence(::readLine).toList()
    val scheduler = Scheduler()
    for (line in input) {
        val p = line.split(",")
        println(scheduler.add(Event(p[0], p[1].toInt(), p[2].toInt(), p[3].toInt())))
    }
    for (e in scheduler.agenda()) println(e)
    println(scheduler.busiestDay())
}

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Kotlinプレイグラウンド