-
Version: 2024.01 (BUT1 2024)
-
Durée : 18 heures (1 TD et 4 TP encadrés, 7 créneaux en autonomie)
L’objectif de cette SAÉ (Situation d'Apprentissage et d'Évaluation) est d’approfondir la réflexion sur l’approche algorithmique des problèmes rencontrés pendant les phases de développement. (cf. docs/sae2.02.pdf).
Plus précisément :
-
Participer à un petit "concours" de codage
-
Lire, comprendre et évaluer un code qui n’est pas le sien
-
Comparer des algorithmes sur un critère précis
-
Justifier de manière objective ses comparaisons et son classement
Cette SAÉ se déroule en 2 phases.
Vous allez devoir soumettre individuellement un algorithme qui résout un problème simple (niveau BUT S1) mais qui peut se régler avec plusieurs solutions différentes. Vous avez la semaine 24 (encadrée, et questions sur Discord bienvenues pendant les séances libres) pour réaliser et soumettre votre (ou vos) solutions.
|
Cette 1ère phase est individuelle. |
Le problème consiste à simplement implémenter l’algorithme de compression Run-Length Encoding (RLE).
💡
|
Voir aussi cette page : https://fr.wikipedia.org/wiki/Codage_par_plages |
- Exemple d’input
-
"WWWWWWWWWBWWWWWWWWBBBWWWBWWWWWWW"
- Exemple d’ouput
-
"9W1B8W3B3W1B7W"
|
Attention, pour les répétitions au-dessus de 10 occurrences, il faut adopter une convention particulière. En effet, comment décompresser 133W est "un trois et 3 W ⇒ 3W`" ou bien "133 W"!
Nous adoptons donc la convention de faire de blocs de 9 max. Ainsi `wwwwwwwwwwww se compresse 9w3w (cf. message Discord en ce sens).
|
Les contraintes sont les suivantes :
-
votre algorithme doit être écrit dans l’un des langages suivants au choix : java, python ou C
-
il doit permettre aux test JUnit fournis de passer (respect donc des noms de classes, méthodes ou fonctions en conséquence). Le choix du nom de la fonction n’est donc pas libre!
-
le texte à compresser est donné sous forme d’une chaîne de caractères (sans accents pour éviter les soucis)
-
le texte compressé est aussi retourné sous forme d’une chaîne de caractères.
Vu qu’il existe de nombreuses façons de résoudre ce problème, vous devrez soumettre, pour chaque catégorie, votre meilleure solution.
- Simplicité
-
Ici il s’agit de faire un code facile à maintenir, lisible par des humains. Pas forcément efficace, mais très facile à lire et à réutiliser. Toute méthode de
java.util
existante est autorisée. - Efficacité
-
Peu importe le code source, c’est l’efficacité de son exécution qui est recherchée (complexité maîtrisée, temps d’exécution minimal, …). Ici aucune méthode complexe (de type
split()
ousort()
) ne devra être utilisée (contrairement à celles de typesize()
oulength()
qui sont autorisées). - Sobriété numérique
-
L’algorithme consomme le moins de ressources possible (mémoire, calcul, …).
ℹ️
|
Vous pouvez soumettre plusieurs algorithmes dans plusieurs catégories pour maximiser vos chances de gagner le concours et obtenir des points bonus. |
|
Nous sommes conscients que vous pouvez vous aider de Copilot, ChatGPT ou des codes de vos collègues, mais la notation qui a le plus gros coefficient est l’oral final. Si vous êtes incapable d’expliquer vos propres résultats, cette note s’approchera de 0. |
Vous devrez déposer sur WebEtud, avant vendredi 14 juin à 23h59, vos fichiers de solutions en les nommant ainsi (pour le dépôt) : [efficacite|sobriete|simplicite].[java|c|py]
.
Par exemple pour votre algorithme java en simplicité, vous le déposerez avec le nom simplicite.java
.
ℹ️
|
|
Dans cette deuxième phase, (avec séances encadrées et libres), vous devrez comparer des solutions entre elles, et les classer en justifiant vos analyses.
|
Cette deuxième phase est en binôme (de votre choix) |
Vous vous verrez affecter, pour chaque catégorie d’algorithmes (Simplicité, Efficacité, Sobriété) un certain nombre de solutions au hasard parmi celles soumises en phase 1.
Il vous faudra évaluer chaque algorithme selon des critères et les classer ensuite.
ℹ️
|
On vous impose au minimum les critères ci-dessous mais vous pourrez en rajouter. À vous de les utiliser judicieusement pour les catégories les plus appropriées. |
- Lisibilité du code
-
Ce critère est subjectif. Il se base sur la facilité à comprendre ce que fait le code.
- Qualité du code
-
Vous utiliserez des outils open source de mesure de qualité de code (e.g., Codacy).
- Efficacité
-
Il s’agit d’évaluer la complexité algorithmique de la solution (
O(n^2)
ouO(nlog(n))
). Si on double par exemple la taille de la donnée en entrée, est-ce qu’on double le temps de calcul ? - Sobriété numérique
-
Cela devient un critère de plus en plus important. Certains outils permettent de donner une mesure de la consommation en ressources d’un algorithme (e.g., Joular).
- Temps d’exécution
-
Il s’agit de mesurer le temps d’exécution.
⚠️ Il conviendra de prendre des mesures sur des données plus ou moins grandes, certains algorithmes étant plus rapides que d’autres en fonction de la taille des données en entrée (beaucoup de mots dans la chaîne initiale), ou de leur variété (beaucoup de grands mots).
Vous utiliserez le dépôt initial qui vous aura été attribué via classroom pour pousser vos codes et vos livrables (en plus des dépôts moodle).
-
❏ Votre ou vos algorithmes en précisant les éléments du tableau ci-dessous :
# | lien | langage | catégorie |
---|---|---|---|
1 |
Java |
Simplicité |
|
2 |
C |
Efficacité |
|
… |
… |
… |
… |
-
❏ Le rapport d’évaluation des algorithmes (e.g., asciidoc ou PDF). Pour chaque catégorie, vous devrez désigner qui est 1er, 2ème, 3ème, … (avec possibilité d’ex-aequo si le hasard vous a attribué des algos similaires). Il doit se trouver dans le répertoire
rapport
de votre dépôt. -
❏ Les codes de test, d’évaluation ou de mesure. Ils doivent se trouver dans le répertoire
analyse
de votre dépôt. -
❏ Les références des librairies/outils utilisés (pour ceux non fournis). Elles doivent être listées dans la sous-section (Références) ci-dessous.
-
❏ La chaîne de compilation et exécutable, ou paquetage selon les standards du langage (comment exécuter vos codes d’évaluation). Cette description doit se trouver dans vos rapports.
|
Les répertoires et fichiers existants devront être complétés et mis à jour sans être renommés. Les binaires de compilation (répertoire bin ou target par exemple) ne devront pas être poussés sur le dépôt.
|
-
link: https://app.codacy.com
-
Vous pouvez vous entraider pour les outils d’analyse et de performance, voire vous inspirer de ChatGPT
-
N’hésitez pas à solliciter vos enseignants des ressources impliquées par cette SAÉ (salon #sae_2_02_qualité du serveur discord).
-
80% de la notation portera sur votre rapport de la phase 2 et vos analyses (véracité, pertinence, qualité, ajout de critères pertinents, …). L’évaluation comportera un oral en semaine 25 (lors des séances encadrées).
-
20% de la notation portera sur le classement de votre algorithme de la phase 1 (pertinence de la catégorie choisie, évaluation/classement par les pairs, …)
-
Bonus pour les 10 premiers de chaque catégorie du concours de codage
-
Bonus pour ceux qui auront proposés plusieurs algos différents (indépendamment de leur classement final)
-
Bonus supplémentaire pour ceux qui auront proposés des versions en langages différents de leur(s) algo(s) (indépendamment de leur classement final)
À la demande des étudiants est créé une nouvelle catégorie, juste pour le fun : le concours du code source le plus compact. Ainsi, si vous pensez avoir le fichier source le plus compact (le moins gros en taille), envoyez-moi en MP sur Discord (jmb) le nombre d’octet pour afficher qui tient la corde sur ce concours.
|
Bien sûr le code doit fonctionner (passer les tests java ou équivalents). |