Система для проведения спортивных соревнований

Описание предметной области

Предположим вам необходимо реализовать систему организации для спортивных соревнований в одном из циклических видов спорта: бег, беговые лыжи, плаванье, велоспорт, спортивное ориентирование и т.п.

В простейшем случае соревнования имеют какое-то название, дату проведения, и подразумевают прохождение каждым спортсменом какой-то одной дистанции.

Все спортсмены выступают в разных группах в зависимости от пола и возраста. Список групп определяется регламентом соревнований и публикуется заранее.

У каждой группы своя дистанция, при этом у некоторых групп могут быть одинаковые дистанции.

Спортсмены выступают за разные коллективы, каждый коллектив подаёт заявочные списки, в которых указывает для спортсменов фамилию, имя, год рождения, спортивный разряд, желаемую группу. Также в заявочных списках указываются данные о медицинском осмотре и страховке от несчастного случая для каждого спортсмена.

На основании всех заявочных списков для каждой группы формируется протокол старта. Протокол формируется в результате жеребьёвки. Каждый спортсмен получает индивидуальный нагрудный номер и время старта. Старт может быть общим (в одно время) или раздельным. В простейшем случае жеребьёвка расставляет всех спортсменов в группе в случайном порядке. Однако могут быть более сложные виды жеребьёвки, например когда нужно учитывать разряд, учитывать забег внутри группы, учитывать одновременный старт разных групп.

После прохождения соревнований формируется протокол результатов, а также протокол с промежуточными результатами прохождения дистанции. Дистанция может состоять из нескольких контрольных пунктов, на каждом из которых фиксируется время прохождения. Результат фиксируется либо вручную, либо с помощью одной или нескольких систем электронной отметки. Соответственно результат предаётся в систему либо при ручном вводе, либо при получении данных от систем электронной отметки. Обычно это или список вида <номер> - <время> для заданного контрольного пункта, или список вида <контрольный пункт> - <время> для заданного номера (спортсмена).

В протоколах старта, финиша и пр. для каждого участника необходимо указать номер, имя, фамилию, год рождения, спортивный разряд, коллектив. В стартовом протоколе дополнительно указывается время старта. В протоколе результатов указывается итоговое место, результат (время затраченное на прохождение дистанции), Отставание от лидера и (опционально) выполненный спортивный разряд. Выполненный спортивный разряд вычисляется по некоторой формуле, которая зависит от вида спорта, группы и регламента конкретных соревнований. Кроме протокола результатов для каждой из групп формируется протокол результатов для коллективов. При этом по определённой формуле, зависящей от регламента конкретных соревнований, результат каждого спортсмена в его группе даёт определённое количество очков, которые в сумме дают результат коллектива.

Пример заявочного списка (CSV):

Выборгский СДЮШСОР №10,,,,,,,
Иванов,Иван,2002,КМС,М21,,,
Петров,Пётр,1978,I,М40,,,  
Пупкин,Василий,2011,3ю,М10,,

Пример протокола старта для группы (CSV):

М10,,,,,,
241,Пупкин,Василий,2011,3ю,12:01:00,
242,Пирогов,Григорий,2011,3ю,12:02:00
243,Смирнов,Сергей,2012,,12:03:00

Пример протокола прохождения дистанции участником (CSV):

243,,
1km,12:06:15
2km,12:10:36
Finish,12:14:51

Пример протокола прохождения контрольного пункта (CSV):

1km,,
241,12:04:17
242,12:05:11
243,12:06:15

Пример протокола результатов (CSV):

М10,,,,,,,
1,242,Пирогов,Григорий,2011,3ю,00:12:51,
2,243,Смирнов,Сергей,2012,,00:12:57,
3,241,Пупкин,Василий,2011,3ю,00:13:15

Задание

Программа должна:

  1. По заявочным спискам формировать стартовые протоколы. Использовать простую жеребьёвку с интервалом 1 минута и началом старта в 12:00:00.
  2. По стартовым протоколам и протоколам прохождения контрольных пунктов формировать протоколы результатов.
  3. По протоколам результатов формировать протокол результатов для команд. Очки вычислять по формуле max(0, 100 * (2 - <результат>/<результат победителя>)).
  4. Проверять корректность заявочных списков.
  5. Проверять корректность прохождения контрольных пунктов каждым из участников.
  6. Писать лог

Кроме того нужно:

  1. Создать файл DOCS.md с инструкциями по использованию программы
  2. Написать тесты (понадобится генераторы заявок, результатов и т.п.)

Общие замечания

  1. Библиотеки удобно искать на https://kotlin.link. Вам могут пригодиться библиотеки для логирования, разбора аргументов командно строки, работы с конфигурационными файлами (например, https://github.com/sksamuel/hoplite), чтения/записи csv (например, https://github.com/doyaaaaaken/kotlin-csv) и т.п.
  2. Предполагается, что описание соревнований и дистанции определены заранее в некотором конфигурационном файле.
  3. Система работает с файлами, подумайте как структурировать их расположение на диске - не стоит хранить всё в одной случайной папке.
  4. Система будет развиваться и изменяться. Постарайтесь построить объектную модель, которую будет удобно расширять. При этом не надо слишком увлекаться, поскольку пока вам неизвестно куда пойдёт развитие. Ищите баланс ⚖!