Menu
Coddy logo textTech

하나로 합치기

Coddy Lua 여정의 Luau 소개 섹션에 포함된 레슨 — 73개 중 50번째.

challenge icon

챌린지

중급

에디터에는 이미 완전한 툴킷이 포함되어 있습니다: Task type, tasks array (초기 작업 3개), addTask, completeTask, filterTasks, printSummary.

io.read()로 한 line씩 지속적으로 읽어 들여 다음 command들을 처리하는 Command loopWrite하세요:

  • add — 한 line을 더 읽어 title로 사용하고, addTask를 호출한 뒤 정확히 다음과 같이 Print합니다: Added task {id}: {title} (반환된 task의 필드 사용)
  • done — 한 line을 더 읽어 tonumber(...) or 0으로 변환한 뒤 completeTask를 호출합니다. 반환값이 true이면 Task {id} completed를, 그렇지 않으면 No task with id {id}print합니다.
  • listevery task에 대해 done 상태이면 [x] {title}을, 그렇지 않으면 [ ] {title}print합니다(공백 주의).
  • pendingfilterTasks를 사용하여 완료되지 않은 every tasktitleprint합니다.
  • summaryprintSummary(tasks)를 호출합니다.
  • quitloop를 중지합니다 (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 (제목 읽기 -> `Added task {id}: {title}`),
--         done (read id  -> `Task {id} completed` / `No task with id {id}`),
--         list (`[x] {title}` / `[ ] {title}`),
--         pending (filterTasks를 통한 미완료 태스크의 제목들),
--         summary (printSummary)

Luau 소개의 모든 레슨