Files
Dimong4 3290ab91fc
CI Check / lint-and-check (push) Failing after 8s
update task
2026-07-18 20:00:33 +03:00

45 lines
8.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### Последняя Надежда Эпсилон-9: Протокол «К-Резонанс»
**Ограничение по времени:** 3.0 с
**Ограничение по памяти:** 512 МБ
Год 2142. Межзвездная колония на планете Эпсилон-9 столкнулась с невидимой смертью. Внешне безобидная флора планеты скрывает фатальную угрозу: питательный, спасающий от голода «Звездный Корень» и парализующая нервную систему «Теневая Лоза» визуально абсолютно неразличимы. Их выдают только биоэлектрические поля, которые сканируют наши харвестеры.
До вчерашнего дня наш Центральный ИИ «Тензор-Оракул» успешно классифицировал растения. Но аномальная вспышка на местной звезде сожгла серверные стойки. Библиотеки машинного обучения расплавились в цифровом небытии. Остался только аварийный терминал жизнеобеспечения. Он принимает исключительно базовый, первобытный диалект языка Python. Использовать оператор `import` категорически запрещено — модулей просто не существует. Голод неминуем. Склады забиты смертельно опасным неклассифицированным урожаем.
Командор колонии Лира врывается в ваш инженерный отсек. В её руках дымящийся кристалл памяти.
— Инженер! — кричит она, смахивая пепел с терминала. — Я вытащила из мертвых архивов чертежи древнего алгоритма K-Ближайших Соседей. Мы должны воссоздать его с нуля, иначе завтра колония вымрет. Слушай меня внимательно, я зачитаю спецификацию протокола прямо с поврежденных секторов, а ты пиши код!
Лира подключает кристалл к вашему монитору, и аварийное освещение окрашивает отсек в красный цвет.
— Для начала, харвестеры присылают нам сплошной текстовый мусор, — диктует Командор, глядя на бегущие строки. — Тебе нужно написать первую функцию **`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 зависит от чистоты вашего кода. Приступайте.