Предположим вам необходимо реализовать систему организации для спортивных соревнований в одном из циклических видов спорта: бег, беговые лыжи, плаванье, велоспорт, спортивное ориентирование и т.п.
В простейшем случае соревнования имеют какое-то название, дату проведения, и подразумевают прохождение каждым спортсменом какой-то одной дистанции.
Все спортсмены выступают в разных группах в зависимости от пола и возраста. Список групп определяется регламентом соревнований и публикуется заранее.
У каждой группы своя дистанция, при этом у некоторых групп могут быть одинаковые дистанции.
Спортсмены выступают за разные коллективы, каждый коллектив подаёт заявочные списки, в которых указывает для спортсменов фамилию, имя, год рождения, спортивный разряд, желаемую группу. Также в заявочных списках указываются данные о медицинском осмотре и страховке от несчастного случая для каждого спортсмена.
На основании всех заявочных списков для каждой группы формируется протокол старта. Протокол формируется в результате жеребьёвки. Каждый спортсмен получает индивидуальный нагрудный номер и время старта. Старт может быть общим (в одно время) или раздельным. В простейшем случае жеребьёвка расставляет всех спортсменов в группе в случайном порядке. Однако могут быть более сложные виды жеребьёвки, например когда нужно учитывать разряд, учитывать забег внутри группы, учитывать одновременный старт разных групп.
После прохождения соревнований формируется протокол результатов, а также протокол с промежуточными результатами прохождения дистанции. Дистанция может состоять из нескольких контрольных пунктов, на каждом из которых фиксируется время прохождения. Результат фиксируется либо вручную, либо с помощью одной или нескольких систем электронной отметки. Соответственно результат предаётся в систему либо при ручном вводе, либо при получении данных от систем электронной отметки. Обычно это или список вида <номер> - <время> для заданного контрольного пункта, или список вида <контрольный пункт> - <время> для заданного номера (спортсмена).
В протоколах старта, финиша и пр. для каждого участника необходимо указать номер, имя, фамилию, год рождения, спортивный разряд, коллектив. В стартовом протоколе дополнительно указывается время старта. В протоколе результатов указывается итоговое место, результат (время затраченное на прохождение дистанции), Отставание от лидера и (опционально) выполненный спортивный разряд. Выполненный спортивный разряд вычисляется по некоторой формуле, которая зависит от вида спорта, группы и регламента конкретных соревнований. Кроме протокола результатов для каждой из групп формируется протокол результатов для коллективов. При этом по определённой формуле, зависящей от регламента конкретных соревнований, результат каждого спортсмена в его группе даёт определённое количество очков, которые в сумме дают результат коллектива.
Пример заявочного списка (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 минута и началом старта в 12:00:00.
- По стартовым протоколам и протоколам прохождения контрольных пунктов формировать протоколы результатов.
- По протоколам результатов формировать протокол результатов для команд. Очки вычислять по формуле max(0, 100 * (2 - <результат>/<результат победителя>)).
- Проверять корректность заявочных списков.
- Проверять корректность прохождения контрольных пунктов каждым из участников.
- Писать лог
Кроме того нужно:
- Создать файл DOCS.md с инструкциями по использованию программы
- Написать тесты (понадобится генераторы заявок, результатов и т.п.)
- Библиотеки удобно искать на https://kotlin.link. Вам могут пригодиться библиотеки для логирования, разбора аргументов командно строки, работы с конфигурационными файлами (например, https://github.com/sksamuel/hoplite), чтения/записи csv (например, https://github.com/doyaaaaaken/kotlin-csv) и т.п.
- Предполагается, что описание соревнований и дистанции определены заранее в некотором конфигурационном файле.
- Система работает с файлами, подумайте как структурировать их расположение на диске - не стоит хранить всё в одной случайной папке.
- Система будет развиваться и изменяться. Постарайтесь построить объектную модель, которую будет удобно расширять. При этом не надо слишком увлекаться, поскольку пока вам неизвестно куда пойдёт развитие. Ищите баланс ⚖!