Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

جدولة الفعاليات

جزء من قسم البرمجة كائنية التوجه في رحلة R على Coddy. الدرس 56 من 57.

challenge icon

التحدي

صعب

أنشئ مجدولًا للأحداث عبر ملفين.

  • Event.R: فئة S3 المسماة event مع الحقول title وday وstart وend (بالساعات). اكتب new_event()؛ وvalidate_event()، التي تتوقف مع day must be from 1 to 31 أو hours must be within 0 to 24 and start before end؛ والمساعد event(title, day, start, end)، الذي يحوّل الوسائط النصية إلى أرقام؛ وformat.event()، الذي يعيد day 3 09-11 standup؛ وoverlaps(a, b)، التي تكون قيمتها TRUE عندما يكون حدثان في اليوم نفسه ويبدأ كل منهما قبل انتهاء الآخر.
  • Scheduler.R: تحافظ make_scheduler() على خصوصية أحداثها وتعيد add(e)، التي تردّ بـduplicate للعنوان نفسه في اليوم نفسه، أو conflicts with review عندما يتداخل الحدث مع حدث موجود، أو added؛ وagenda()، وهي الأحداث المنسّقة مرتبة حسب اليوم ووقت البدء والعنوان؛ وbusiest_day()، التي تعيد busiest: day 3 (4 hours) وفق إجمالي الساعات (ويُختار اليوم الأسبق عند التعادل)، أو no events.

استخدم 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 عبر الإنترنت