Menu
Coddy logo textTech

復習 - タスクキュー

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

challenge icon

チャレンジ

中級

2つのリファレンスクラスからタスクキューを構築してください。どちらの定義も suppressMessages() でラップされています。

  • Task(Task.R 内):フィールドは title、priority(数値)、done(論理値)です。initialize は、done が指定されていない場合に FALSE にします。label() は、完了したタスクには [x] fix (3) を、そうでないタスクには [ ] fix (3) を返します。
  • TaskQueue(TaskQueue.R 内):フィールドは tasks(list)です。add(title, priority) は新しい Task を追加し、invisible(.self) を返します。next_task() は、未完了タスクのうち優先度が最も高いもの(同順位の場合は先に追加されたもの)のタイトルを返し、該当するタスクがなければ nothing を返します。complete(title) は、そのタイトルを持つ最初の未完了タスクを完了済みにし、TRUE を返します。該当するタスクがなければ FALSE を返します。report() は、追加された順に各タスクのラベルを1つずつ返し、その後に open: 2 を返します。

提供されたコードは add fix 3、next、done fix を読み取り、その後、連結された1回の呼び出しで2つのタスクを追加し、レポートを出力します。

コードは Task.R と TaskQueue.R に記述します。main.R には提供された入出力コードが含まれており、編集できません。

自分で試してみよう

source("Task.R")
source("TaskQueue.R")

# 提供された入出力コード: そのままにしておく
input <- suppressWarnings(readLines(file("stdin")))
q <- TaskQueue$new()
for (line in input) {
  p <- strsplit(line, " ")[[1]]
  if (p[1] == "add") {
    q$add(p[2], as.numeric(p[3]))
  } else if (p[1] == "next") {
    cat("next: ", q$next_task(), "\n", sep = "")
  } else if (p[1] == "done") {
    cat(if (q$complete(p[2])) "completed " else "no open task ", p[2], "\n", sep = "")
  }
}
q$add("late", 1)$add("later", 1)
writeLines(q$report())

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

自分で練習してみよう: Rオンラインコンパイラ