Перейти к содержимому

Практика 5. Практика к лекции 5

Цель: закрепить работу с коллекциями Swift — массивами, множествами и словарями — а также освоить функциональные методы (map, filter, reduce, compactMap, flatMap, sorted, contains) через серию упражнений от базовых к проектным.

Рекомендации по выполнению:

  • Выполняйте задания в отдельных файлах .swift (например, task1.swift, task2.swift).
  • Запускайте через терминал: swift task1.swift (или swift имя_файла.swift).
  • Для проектов из нескольких файлов используйте Swift Package Manager (swift package init --type executable).
  • Работа ведётся на Linux — Xcode не требуется, достаточно установленного Swift toolchain.
  • Сопровождайте решения проверочными print-выражениями или assert-ами.

A. Разминка

  1. Создайте массив целых чисел от 1 до 20. С помощью filter отберите числа, делящиеся на 3, затем с помощью reduce найдите их сумму.
let numbers = Array(1...20)
// Ожидаемый результат: 3 + 6 + 9 + 12 + 15 + 18 = 63
  1. Дан массив строк — названия городов. Используя map и sorted, получите массив строк вида "ГОРОД (N букв)", отсортированный по длине названия.
let cities = ["Москва", "Уфа", "Новосибирск", "Казань", "Сочи"]
// Ожидаемый результат:
// ["УФА (3 букв)", "СОЧИ (4 букв)", "КАЗАНЬ (6 букв)", "МОСКВА (6 букв)", "НОВОСИБИРСК (11 букв)"]

B. Множества

  1. Дано два множества Set<String> — навыки двух программистов. Найдите: (а) общие навыки, (б) уникальные навыки каждого, (в) все навыки вместе. Выведите результат каждой операции.
let dev1: Set = ["Swift", "Python", "Git", "SQL", "Docker"]
let dev2: Set = ["Python", "JavaScript", "Git", "React", "Docker"]
// Общие: {"Python", "Git", "Docker"}
// Уникальные dev1: {"Swift", "SQL"}
// Уникальные dev2: {"JavaScript", "React"}
// Все вместе: {"Swift", "Python", "Git", "SQL", "Docker", "JavaScript", "React"}
  1. Дан массив целых чисел с повторениями. Используя Set, удалите дубликаты и верните отсортированный массив. Затем проверьте, является ли полученное множество надмножеством множества [1, 2, 3] (метод isSuperset(of:)).
let raw = [5, 3, 1, 3, 2, 5, 4, 1, 2, 4]
// Уникальные (отсортированные): [1, 2, 3, 4, 5]
// Является надмножеством [1, 2, 3]: true

C. Словари

  1. Создайте словарь [String: [Int]], где ключ — имя студента, значение — массив оценок. С помощью mapValues (или map + reduce) создайте новый словарь [String: Double] со средними оценками каждого студента.
let grades = [
"Анна": [90, 85, 92, 88],
"Борис": [70, 65, 80, 75],
"Виктор": [95, 100, 92, 98]
]
// Ожидаемый результат: ["Анна": 88.75, "Борис": 72.5, "Виктор": 96.25]
  1. Дан массив слов. Постройте частотный словарь [String: Int], подсчитывающий количество вхождений каждого слова. Выведите топ-3 самых частых слова с помощью sorted(by:) и prefix.
let words = ["swift", "python", "swift", "go", "python", "swift", "rust", "go", "python", "swift"]
// Ожидаемый результат:
// swift: 4
// python: 3
// go: 2

D. compactMap и flatMap

  1. Дан массив опциональных строк. Используя compactMap, извлеките непустые значения и преобразуйте их в верхний регистр.
let input: [String?] = ["swift", nil, "python", nil, "go", nil]
// Ожидаемый результат: ["SWIFT", "PYTHON", "GO"]
  1. Дан массив массивов целых чисел. Используя flatMap, объедините их в один массив, затем с помощью filter оставьте только чётные числа и отсортируйте по убыванию.
let nested = [[5, 2, 8], [1, 9, 3], [4, 7, 6]]
// После flatMap: [5, 2, 8, 1, 9, 3, 4, 7, 6]
// Чётные по убыванию: [8, 6, 4, 2]

E. Цепочки функциональных преобразований

  1. Напишите цепочку функциональных вызовов, которая из строки текста извлекает все слова длиной больше 4 символов, убирает дубликаты и возвращает отсортированный массив в нижнем регистре.
let text = "Swift это Swift язык для разработки приложений для Apple и Linux"
// Ожидаемый результат: ["apple", "linux", "swift", "приложений", "разработки"]

Подсказка: разбейте строку через split(separator: " "), преобразуйте в [String], примените filter, map, затем Set для уникальности и sorted.


F. Мини-проект

  1. «Каталог товаров» — реализуйте следующую логику:

Определите структуру Product:

struct Product {
let name: String
let category: String
let price: Double
let inStock: Bool
}

Создайте массив из 8–10 товаров разных категорий. Реализуйте следующие запросы, используя только функциональные методы (filter, map, reduce, sorted и т.д.) — без циклов for:

  • Все товары в наличии, отсортированные по цене (по возрастанию).
  • Названия товаров дороже 1000 ₽ в верхнем регистре.
  • Средняя цена товаров в каждой категории (результат — словарь [String: Double]).
  • Самый дорогой товар (max(by:) или sorted).
  • Строка-отчёт: "Всего товаров: N, в наличии: M, средняя цена: X ₽".

Пример вывода:

// В наличии (по цене): [Кабель (150.0), Мышь (800.0), Клавиатура (2500.0), Монитор (25000.0)]
// Дорогие товары: ["КЛАВИАТУРА", "МОНИТОР", "НОУТБУК"]
// Средние цены: ["Аксессуары": 475.0, "Периферия": 9433.33, ...]
// Самый дорогой: Ноутбук (75000.0)
// Отчёт: "Всего товаров: 10, в наличии: 7, средняя цена: 12340.0 ₽"

Критерии оценивания

  • Корректность и полнота реализации: 0–5 баллов
  • Использование функциональных методов коллекций (map, filter, reduce, compactMap и др.): 0–5 баллов
  • Качество и читаемость кода (именование переменных, форматирование, комментарии): 0–3 балла
  • Наличие проверочных print/assert выражений: 0–3 балла

Максимум: 16 баллов. Бонус до +2 за дополнительные задания.


Дополнительно (по желанию)

  • Реализуйте задание 10 как Swift Package (swift package init --type executable) с разделением кода на модули.
  • Добавьте в мини-проект функцию поиска товаров по подстроке в названии (используйте filter + contains).
  • Реализуйте аналог Python-генератора [x ** 2 for x in range(20) if x % 2 == 0] с помощью цепочки filtermap.