Menu
Coddy logo textTech

Еженедельная сетка

Часть раздела Логика и управление потоком путешествия по Swift на Coddy — урок 36 из 56.

Пришло время вывести календарь. Для каждой привычки отрисуйте сетку из семи символов с 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), но массивы Swift используют индексацию с нуля, поэтому вычитайте 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

Шпаргалка

Создайте сетку из 7 символов с X в выполненные дни и . в остальных местах (дни индексируются с 1):

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

Попробуйте сами

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Проверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком