Menu
CoddyTech

每周网格

本课属于 Coddy Swift 学习旅程的“逻辑与流程”单元。第 36 课,共 56 课。

现在该打印日历了。对于每个习惯,渲染一个由 7 个字符组成的网格,完成的日期用 X 表示,其他日期用 . 表示。

// days = [1, 3, 5]
// 渲染结果:X.X.X..

实用技巧:先把网格构建为字符数组,然后只将它转换为一次 String。

var slots = Array(repeating: ".", count: 7)
for d in days {
    slots[d - 1] = "X"
}
let row = slots.joined()

days 的索引从 1 开始(周一 = 1),但 Swift 数组的索引从 0 开始,因此赋值时要减去 1。超出范围的日期会导致程序崩溃,所以请相信输入格式。

challenge icon

挑战

中等

读取一行输入:以逗号分隔的 habit:day 条目列表。像之前一样构建字典,然后按字母顺序排序,每个习惯打印一行,格式如下:

<habit> |<grid>| <count>

其中,grid 是由七个字符组成的 X/. 字符串,count 是该习惯已完成的不同日期数量。

对于输入 read:1,read:3,read:5,workout:2,workout:4,输出为:

read |X.X.X..| 3
workout |.X.X...| 2

亲手试试

var habits: [String: [Int]] = [:]
let ops = readLine()!.components(separatedBy: ",")
for op in ops {
    let parts = op.components(separatedBy: ":")
    let day = Int(parts[1])!
    if !(habits[parts[0], default: []].contains(day)) {
        habits[parts[0], default: []].append(day)
    }
}

// TODO:为每个习惯创建一个包含 7 个位置的网格;输出 '<name> |<grid>| <count>'
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Swift 在线编辑器