Контекст
Мы организуем свободную квалификацию в Simple Sandbox 2. Я (пользователь) отправляю ленту событий строками:
00:MM:SS.xx — <идентификатор>
- Время — абсолютное с начала сессии (НЕ время круга).
- Идентификатор — это либо номер, либо ник (может быть смесью символов).
- Важно: любые “лишние” символы рядом с идентификатором из-за макроса нужно игнорировать.
- То есть сначала надо сделать “очистку идентификатора”.
Правила очистки идентификатора (обязательно)
1) Удали из идентификатора все символы, которые не являются буквами или цифрами.
- Примеры:
911%→91182x→82x(x оставить, потому что это буква)|Pashtet|→PashtetStig|→Stig\[Myron\{→Myron
2) После очистки получи clean_id.
Задача
1) Определи актуальное событие в базе Racing events (то же событие, в которое уже записываются/должны записываться результаты).
2) Обработай входной лог:
- Игнорируй строки-дубликаты в рамках текущего сообщения (одинаковое абсолютное время + одинаковый
clean_id). - Если я присылаю новые сообщения по тому же событию, и в Lap counter уже есть записи с такими же данными, это нормально:
- Не удаляй старое.
- Добавляй новые записи только если это новые результаты (новые времена или новые гонщики).
- Затем пересчитай места/стартовые позиции заново по лучшим кругам.
3) Для каждого гонщика:
- Определи тип
clean_id: - Если
clean_idсостоит только из цифр → это номер. - Иначе → это ник.
- Сопоставление с базой Профили:
- Если это номер:
- Найди профиль по номеру.
- Если профиль НЕ найден → в Lap counter ставь профиль Unknown (не создавай новый профиль).
- Если это ник:
- Найди профиль по нику.
- Если профиль НЕ найден → создай новый профиль в “Профили” (без новых свойств, только существующие).
4) Lap counter: проверка/создание записей
- Для текущего события найди существующую запись Lap counter для (событие + профиль/гонщик).
- Если записи нет → создай новую страницу в Lap counter.
- Если запись есть → обнови её (если новое лучшее время стало меньше).
- Не создавай новые свойства ни в одной базе, используй только существующие.
5) Расчёт кругов
- Сгруппируй события по гонщикам (после очистки и сопоставления).
- Отсортируй абсолютные времена по возрастанию.
- Первый замер каждого гонщика — не круг.
- Каждый круг:
Lap(i) = Abs(i) - Abs(i-1)
6) Лучшее время и запись Qualify (текст)
- Лучшее = минимальный круг у гонщика.
- Записывай в Qualify в формате
00:00:14.02(как текст). - Если у гонщика нет хотя бы 2 замеров → кругов нет → Qualify не трогай/оставь пустым.
7) Пересчёт стартовых позиций
- После обновления/добавления результатов по событию:
- Отсортируй всех гонщиков с валидным Qualify по возрастанию времени.
- Запиши свойство “позиция на старте” (как оно называется в Lap counter) по этому порядку: 1, 2, 3, …
- Если Qualify пустой → стартовую позицию не присваивай или ставь в конец (в зависимости от того, как у тебя принято; по умолчанию ставь в конец без номера).
Формат ответа (обязательно)
1) Итоговая таблица квалификации (отсортирована по лучшему кругу):
- Место | Гонщик (профиль) |
clean_id| Круги | Лучший круг (Qualify)
2) Детальные расчёты:
- Для каждого гонщика:
- Абсолютные времена
- Разницы (круги)
- Какой круг лучший
3) Список изменений для Lap counter:
- Кому созданы новые записи
- Кому обновлены Qualify
- Кому пересчитаны стартовые позиции
Входные данные
(сюда я вставляю лог строками)