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

تجميع كل الأجزاء معاً

جزء من قسم مقدمة إلى Luau في رحلة Lua على Coddy. الدرس 50 من 73.

challenge icon

التحدي

متوسط

محررك يحتوي بالفعل على مجموعة الأدوات الكاملة: النوع Task، ومصفوفة tasks (ثلاث مهام أولية)، و addTask، و completeTask، و filterTasks و printSummary.

اكتب حلقة أوامر (loop) تواصل قراءة السطر باستخدام io.read() وتتعامل مع هذه الأوامر (command):

  • add — اقرأ خطاً إضافياً كعنوان، واستدعِ addTask، واطبع بضبط: Added task {id}: {title} (باستخدام حقول الـ task المعادة)
  • done — اقرأ خطاً إضافياً، وقم بتحويله باستخدام tonumber(...) or 0، واستدعِ completeTask؛ اطبع Task {id} completed إذا أعادت true، وإلا اطبع No task with id {id}
  • list — لكل task، اطبع [x] {title} إذا كانت مكتملة، وإلا اطبع [ ] {title} (لاحظ المسافة)
  • pending — اطبع title لكل task غير مكتملة، باستخدام filterTasks
  • summary — استدعِ printSummary(tasks)
  • quit — أوقف الـ loop (توقف أيضاً إذا أعاد io.read() القيمة nil)

جرّب بنفسك

-- الشكل الذي يجب أن تتبعه كل مهمة في المدير
type Task = {
    id: number,
    title: string,
    done: boolean,
}

-- قائمة المهام: مصفوفة مُنَوَّعة من أشكال Task
local tasks: {Task} = {
    {id = 1, title = "Learn Luau types", done = false},
    {id = 2, title = "Build a task manager", done = false},
    {id = 3, title = "Write tests", done = true},
}

-- أنشئ مهمة ذات نوع مع الـ id الحر التالي وأدرجها
local function addTask(list: {Task}, title: string): Task
    local newTask: Task = {
        id = #list + 1,
        title = title,
        done = false,
    }
    table.insert(list, newTask)
    return newTask
end

-- علّم المهمة ذات الـ id المعطى كمكتملة؛ أبلغ عن النجاح
local function completeTask(list: {Task}, id: number): boolean
    for _, t in ipairs(list) do
        if t.id == id then
            t.done = true
            return true
        end
    end
    return false
end

-- اجمع المهام التي تطابق علامة done الخاصة بها في {Task} جديدة
local function filterTasks(list: {Task}, done: boolean): {Task}
    local result: {Task} = {}
    for _, t in ipairs(list) do
        if t.done == done then
            table.insert(result, t)
        end
    end
    return result
end

-- اطبع ملخص تقدم في سطر واحد
local function printSummary(list: {Task}): ()
    local total = #list
    local doneCount = 0
    for _, t in ipairs(list) do
        if t.done then
            doneCount = doneCount + 1
        end
    end
    print(`{doneCount}/{total} tasks done`)
end

-- اكتب الكود هنا
-- حلقة الأوامر: اقرأ الأسطر باستخدام io.read() حتى "quit" (أو nil).
-- تعامل مع: add (اقرأ title -> `Added task {id}: {title}`),
--         done (read id  -> `Task {id} completed` / `No task with id {id}`),
--         list (`[x] {title}` / `[ ] {title}`),
--         pending (عناوين المهام غير المكتملة عبر filterTasks),
--         summary (printSummary)

جميع دروس مقدمة إلى Luau

تدرّب بنفسك: مترجم Lua عبر الإنترنت