Merge branch 'main' of https://gitea.dimong.ru/Dimong4/Igor-kr
CI Check / lint-and-check (push) Failing after 7s
CI Check / lint-and-check (push) Failing after 7s
This commit is contained in:
+39
-18
@@ -1,24 +1,45 @@
|
|||||||
### Задача 3. Анализатор URL (Строки, Словари, Функции)
|
### Последняя Надежда Эпсилон-9: Протокол «К-Резонанс»
|
||||||
|
|
||||||
Напишите программу из 3 функций для парсинга URL:
|
**Ограничение по времени:** 3.0 с
|
||||||
|
|
||||||
1. `parse_url(url)` — принимает строку URL вида `"https://example.com/path?key1=value1&key2=value2"`. Разбирает URL на части и возвращает словарь:
|
**Ограничение по памяти:** 512 МБ
|
||||||
```python
|
|
||||||
{
|
|
||||||
"protocol": "https",
|
|
||||||
"domain": "example.com",
|
|
||||||
"path": "/path",
|
|
||||||
"params": {"key1": "value1", "key2": "value2"}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
Если параметров нет, `params` должен быть пустым словарем.
|
|
||||||
|
|
||||||
2. `get_param(parsed_url, key, default=None)` — принимает результат `parse_url` и возвращает значение параметра по ключу `key`. Если параметра нет, возвращает `default`.
|
Год 2142. Межзвездная колония на планете Эпсилон-9 столкнулась с невидимой смертью. Внешне безобидная флора планеты скрывает фатальную угрозу: питательный, спасающий от голода «Звездный Корень» и парализующая нервную систему «Теневая Лоза» визуально абсолютно неразличимы. Их выдают только биоэлектрические поля, которые сканируют наши харвестеры.
|
||||||
|
|
||||||
3. `format_url(parsed_url)` — принимает словарь из `parse_url` и собирает обратно строку URL.
|
До вчерашнего дня наш Центральный ИИ «Тензор-Оракул» успешно классифицировал растения. Но аномальная вспышка на местной звезде сожгла серверные стойки. Библиотеки машинного обучения расплавились в цифровом небытии. Остался только аварийный терминал жизнеобеспечения. Он принимает исключительно базовый, первобытный диалект языка Python. Использовать оператор `import` категорически запрещено — модулей просто не существует. Голод неминуем. Склады забиты смертельно опасным неклассифицированным урожаем.
|
||||||
|
|
||||||
**Тесты:**
|
Командор колонии Лира врывается в ваш инженерный отсек. В её руках дымящийся кристалл памяти.
|
||||||
|
|
||||||
1. Распарсите URL: `"https://api.github.com/search?q=python&sort=stars"`
|
— Инженер! — кричит она, смахивая пепел с терминала. — Я вытащила из мертвых архивов чертежи древнего алгоритма K-Ближайших Соседей. Мы должны воссоздать его с нуля, иначе завтра колония вымрет. Слушай меня внимательно, я зачитаю спецификацию протокола прямо с поврежденных секторов, а ты пиши код!
|
||||||
2. Получите значение параметра `q`
|
|
||||||
3. Соберите URL обратно и сравните с оригиналом
|
Лира подключает кристалл к вашему монитору, и аварийное освещение окрашивает отсек в красный цвет.
|
||||||
|
|
||||||
|
— Для начала, харвестеры присылают нам сплошной текстовый мусор, — диктует Командор, глядя на бегущие строки. — Тебе нужно написать первую функцию **`parse_sensor_data(record)`**. Она должна принимать сырую строку, где числа и класс разделены запятыми, и возвращать кортеж. Первым элементом в нем пойдет список чисел с плавающей точкой — это наши сырые признаки. Вторым — строка класса растения.
|
||||||
|
|
||||||
|
Она нервно стучит по экрану:
|
||||||
|
|
||||||
|
— Данные с сенсоров скачут! Чтобы алгоритм не сошел с ума от разницы в масштабах измерений, нам нужна калибровка. Создай функцию **`calculate_statistics(dataset)`**. Прогони через нее размеченные данные и вычисли для каждого признака среднее арифметическое и стандартное отклонение.s Верни это как список словарей с ключами `"mean"` и `"std"`. И помни, корень придется извлекать возведением в степень 0.5, у нас нет математических модулей!
|
||||||
|
|
||||||
|
— Как только получим статистическую базу, — продолжает Лира, — пиши **`normalize_features(features, stats)`**. Каждый сырой признак растения нужно очистить от шума, вычтя среднее и разделив на стандартное отклонение. Эта функция должна брать список признаков и словарь статистики, а возвращать новый список идеальных, нормализованных чисел.
|
||||||
|
|
||||||
|
Свет в отсеке мигает. Система охлаждения воет на пределе возможностей.
|
||||||
|
|
||||||
|
— Теперь самое главное — геометрия выживания! Пиши ядро: **`euclidean_distance(vector_a, vector_b)`**. Функция должна брать два нормализованных списка чисел и вычислять дистанцию между ними в многомерном пространстве. Просто верни одно число с плавающей точкой.
|
||||||
|
|
||||||
|
Лира выводит на экран голограмму базы данных:
|
||||||
|
|
||||||
|
— Когда мы умеем считать дистанцию, нам нужно найти сородичей. Функция **`find_k_nearest(train_set, test_point, k)`** должна прочесать историческую базу `train_set` и найти заданное число `k` самых близких соседей для неизвестного растения `test_point`. От тебя требуется вернуть только список их классов-строк.
|
||||||
|
|
||||||
|
— Но соседи могут расходиться во мнениях, — Лира хмурится. — Нам нужна логика большинства. Функция **`majority_vote(neighbors)`** примет этот список классов и вернет тот класс, который встречается чаще всего. Если будет ничья — система должна выжить, просто возвращай любой из лидирующих классов. Это и будет наш приговор.
|
||||||
|
|
||||||
|
Она тяжело вздыхает, опираясь на стол:
|
||||||
|
|
||||||
|
— Оберни этот поиск и голосование в единый боевой интерфейс **`predict_class(train_set, test_point, k)`**. Ей мы будем скармливать базу и одно неизвестное растение, чтобы сразу получить итоговый класс-строку.
|
||||||
|
|
||||||
|
— Но прежде чем отправить харвестеры в поля и кормить людей, — голос Лиры дрожит, — мы обязаны проверить алгоритм на архивах. Напиши **`calculate_accuracy(predictions, true_labels)`**. Сравни списки наших предсказаний с истинными классами на тестовом полигоне и верни долю правильных ответов от 0.0 до 1.0. Цена каждой ошибки — чья-то жизнь.
|
||||||
|
|
||||||
|
Лира кладет руку вам на плечо. В её глазах отражается код аварийного терминала:
|
||||||
|
|
||||||
|
— И наконец, Инженер... Великий Синтез. Финальная функция **`run_protocol(train_raw_lines, test_raw_lines, k)`**. Она должна объединить весь пайплайн воедино. Сначала распарсить обе выборки. Затем вычислить статистику **строго и только** по обучающей базе, чтобы не было утечки данных из будущего. Потом нормализовать и обучающую, и тестовую выборки. Пройтись циклом и сделать предсказания для каждого растения в тесте. В самом конце функция должна вернуть словарь с двумя ключами: `"accuracy"` с итоговой точностью и `"predictions"` со списком всех предсказанных классов.
|
||||||
|
|
||||||
|
Терминал призывно мигает пустым курсором. Система охлаждения реактора издает последний предупреждающий гудок. Жизнь Эпсилон-9 зависит от чистоты вашего кода. Приступайте.
|
||||||
Reference in New Issue
Block a user