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

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

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

challenge icon

التحدي

متوسط

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

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

  • add: اقرأ سطرًا إضافيًا باعتباره العنوان، واستدعِ addTask، واطبع تمامًا: Added task {id}: {title} (باستخدام حقول المهمة المُعادة)
  • done: اقرأ سطرًا إضافيًا، وحوّله باستخدام tonumber(...) or 0، واستدعِ completeTask؛ اطبع Task {id} completed إذا أعاد true، وإلا فاطبع No task with id {id}
  • list: لكل مهمة، اطبع [x] {title} إذا كانت مكتملة، وإلا فاطبع [ ] {title} (لاحظ المسافة)
  • pending: اطبع عنوان كل مهمة غير مكتملة، باستخدام filterTasks
  • summary: استدعِ printSummary(tasks)
  • quit: أوقف الحلقة (وأوقفها أيضًا إذا أعادت 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 عبر الإنترنت