Projet 2018 · Analyse des Open de CrossFit

Objectifs
L'objectif de ce projet est de vérifier que vous maîtrisez les principes vus en cours de programmation avancée comme les structures de données complexes, lecture / écriture de fichiers, compilation séparée et automatique, utilisation de gestionnaire de version...

Résumé

Pour cela, le travail demandé est de réaliser une application qui permet d’analyser les résultats d’une compétition sportive à laquelle ont participé plus de 200 000 personnnes. Votre travail est de charger ce fichier pour effectuer un certain nombre de requêtes (classement, recherche d’un club, du score d’un athlète…). Il s’agit d’un travail en groupe à réaliser à deux ou à trois personnes.

Contexte

Le CrossFit est une méthode de conditionnement physique combine principalement la force athlétique, l’haltérophilie, la gymnastique et les sports d’endurance. Le mot CrossFit vient de Cross Fitness (en français, entraînement croisé), appelé ainsi parce qu’il mélange différentes activités physiques et sportives préexistantes (source Wikipedia). Tous les ans a lieu une compétition (Crossfit Games) ouverte à tous en utilisant un système de sélection en ligne. La première phase de cette compétition (les Open) a lieu habituellement au mois de Février et s’est donc terminée pour l’édition 2019. Elle comporte 5 épreuves différentes qui sont utilisées pour calculer le score et le classement global. Tous les résultats sont disponibles sur le site web games.crossfit.com et via une API qui permet de télécharger l’intégralité des résultats.

Les données sont stockées dans un fichier CSV (comma-separated values) qui est un format texte permettant de stocker des tableaux. Chaque ligne du fichier correspond à une ligne du tableau et les différents éléments d’une ligne sont séparés par un élément particulier (en général une virgule , mais d’autres sont possibles \t, ;…). La première ligne sert à décrire le nom des différents champs mais est optionnelle. Par exemple sur le fichier qui nous intéresse :

153604,Fraser     ,Mathew       ,M,29,195 lb,67 in ,3220 ,CrossFit Mayhem        ,66 ,1,13870000,387 reps,59 ,14300212,16:28,3 ,11800153,7:27,1  ,11320232,8:08,2  ,12100787,6:53,1
81616 ,Guðmundsson,Björgvin Karl,M,26,185 lb,178 cm,4860 ,CrossFit Hengill       ,93 ,2,13990000,399 reps,5  ,14300114,18:06,21,11800091,8:29,32 ,11320199,8:41,21 ,12100723,7:57,14
199938,Heppner    ,Jacob        ,M,29,192 lb,68 in ,13888,Cobra Command CrossFit ,168,3,13800000,380 reps,136,14300116,18:04,20,11800142,7:38,3  ,11320217,8:23,5  ,12100759,7:21,4
514502,Theofanidis,Lefteris     ,M,29,81 kg ,171 cm,6356 ,CrossFit North Zone    ,183,4,13880000,388 reps,51 ,14300174,17:06,5 ,11800031,9:29,115,11320207,8:33,9  ,12100760,7:20,3
308712,Roy-Lemaire,Jean-Simon   ,M,25,195 lb,176 cm,4459 ,Tonic CrossFit         ,187,5,13990000,399 reps,5  ,14300094,18:26,29,11800140,7:40,6  ,11320166,9:14,119,12100708,8:12,28
153625,Sager      ,Cole         ,M,28,202 lb,70 in ,967  ,CrossFit Spokane Valley,222,6,13840000,384 reps,90 ,14300107,18:13,23,11800074,8:46,43 ,11320187,8:53,46 ,12100715,8:05,20

Le premier champ correspond à l’identifiant de l’athlète (153604), le deuxième à son nom de famille Fraser, le troisième à son prénom Mathew…Pour plus de détails sur chacun des champs, vous pouvez consulter l’annexe.

Cahier des charges

Il vous est demandé de réaliser un programme qui charge le fichier de données CSV (il est disponible dans le répertoire data) et qui permet d’interroger facilement ce fichier. Il doit être possible de :

Le volume de données est important, par conséquent un soin particulier devra être apporté aux structures de données utilisées et à la rapidité d’exécution de votre programme. Les choix algorithmiques devront obligatoirement être expliqués et justifiés dans votre rapport.

Pour permettre d’évaluer automatiquement la performance de votre programme et permettre une utilisation automatique par redirection, votre programme devra fonctionner de la manière suivante :

  1. charger le fichier de données
  2. attendre une commande
  3. traiter la commande
  4. afficher le résultat de cette commande
  5. revenir à l’étape 2

Les commandes seront les suivantes:

Ainsi si votre exécutable s’appelle projet_pa il doit être possible de l’utiliser de la manière suivante:

$ ./projet_pa < requetes.txt

avec le fichier requetes.txt qui contient par exemple:

1
2 M
3 1
4 881332
5 Vigneault
6 12020
4 670954
4 553467
4 98546
4 344299
4 1033765
4 190466
4 3774
4 236854
4 1006179
4 263196
4 911088
4 236032
4 288309
4 173209
2 F
7

Précisions sur les requêtes

Pour toutes les requêtes du type donne le top 50… ou donne le classement…, on attend un résultat du type

01   nom    prenom  score
02   nom    prenom  score
...

Pour toutes les requêtes du type recherche…, on attend un résultat du type

athId nom prenom genre age taille poids score rang

Vous prendrez soin d’avoir des résultats qui utilisent le système international d’unités (masse en kg et longueur en m)

Déliverables

La date de fin de projet est le mercredi 26 juin 2019 23:59 CEST. Tout retard entraînera des pénalités.

Vous n’avez rien à imprimer, ni des documents à envoyer par e-mail. Il faudra donner l’accès du dépôt à votre correcteur et celui-ci corrigera à partir de la dernière version du dépôt ou de la branche release (si elle existe) avant la date limite. Les push qui suivraient la date limite ne seront pas considérés.

Sur votre dépôt devront figurer :

Annexes

Fichiers de données

Pour éviter d’avoir à travailler sur le fichier complet qui comprend près de 350000 athlètes, je vous propose des fichiers de tests de plus petites tailles: ils vous permettront de tester / debugger vos algorithmes avant de tester sur le fichier de données le plus complet. Les sources étant encodées en UTF-8, elles intègrent tous les caractères spécifiques qui ne sont pas en ASCII. Pour éviter d’avoir à gérer un encodage UTF-8, les sources ont été converties en ASCII, il est donc possible que des chaînes de caractères fassent apparaître des choses étonnantes: comme par exemple Guðmundsson devient Gu0x00F0mundsson… en théorie vous n’avez donc que des synboles ASCII à lire.

Pour démarrer

Pour commencer à travailler, vous pouvez créer un dépôt GIT. Ne pas oublier d’ajouter votre correcteur dans la liste des personnes ayant accès à votre dépôt (menu Settings à droite puis Menu Members puis bouton New Projet Member).

On rappelle brièvement les commandes GIT que vous serez amené à utiliser :

Description des champs du tableau CSV

Ensuite il y a 5 épreuves qui sont toutes au même format: