Les annales des Défis C
Date de publication : 15/09/2007 , Date de mise à jour : 21/08/2008
Par
L'équipe C (page d'accueil)
Vous vous trouvez dans les annales des Défis C. Ici vous pouvez visionner
les anciens sujets de défis et leur résultats !
Juin 2008
I-A. Sujet : Pavage de plan
Données sur les formes à utiliser
Utilisation des formes
Paramètres d'exécution
Résultat
Cas particuliers
I-B. Vainqueur
I-B-1. Notation
I-B-2. Critiques
Robustesse
Entrées / Sorties
Code
Commentaires / propreté
Élégance de la solution
Vitesse / consommation mémoire
Organisation du code
Conclusion
I-B-3. Téléchargement
Juin 2008
I-A. Sujet : Pavage de plan
Voici donc le sujet proposé par la rédaction C de Developpez.com
pour ce premier défi :
Le but de ce défi est de remplir le mieux possible un plan
(une surface) avec une liste de formes. Ces formes seront
communiquées à l'exécution.
Chaque programme proposé devra respecter
les règles des défis
Données sur les formes à utiliser
- Elles peuvent comporter des trous ;
- Elles ne seront pas plus larges ni plus hautes que 100 cases ;
- Elles seront définies dans un fichier texte noté "formes.txt" dont voici un exemple :
Cet exemple comporte 3 formes, séparées chacune par une ligne
vide. Chaque * représente une case de la forme, les
espaces marquent les décalages.
Le fichier formes.txt devra se situer dans le même
répertoire que l'exécutable.
Utilisation des formes
Chaque candidat pourra considérer les formes dans l'ordre
qu'il voudra. Il pourra aussi les tourner de 90°, 180° ou 270°.
Il ne pourra pas les retourner (symétries axiales).
Il devra utiliser ces formes pour paver un plan d'une taille variable,
fixée lors de l'exécution.
Pour une largeur donnée du plan, l'objectif est de fournir
l'agencement de formes qui nécessitera le moins de lignes de remplissage.
La largeur du jeu du plan n'excèdera pas 500 cases.
Paramètres d'exécution
Le programme nécessitera un paramètre pour s'exécuter :
la largeur du jeu de tétris à remplir.
L'exécution se fera de la manière suivante :
Le plan à remplir a une largeur de 17 cases.
Résultat
Le résultat de l'agencement sera également inscrit dans un fichier,
noté resultat.txt, ce fichier contiendra l'agencement trouvé, où les
formes seront représentées par des lettres. Pour une largeur de 6 cases,
un fichier résultat pourra être de la forme suivante :
On y retrouve les 3 formes de départ où A représente la première forme,
B la seconde et C la troisième. Le nommage des formes doit respecter
l'ordre de départ. L'exemple contient volontairement un faible
nombre de formes, les programmes proposés par les candidats
devront pouvoir agencer jusqu'à 26 formes. Il n'y aura pas
plus de 26 formes à agencer. Le fichier de résultat devra être
créé par le programme et être situé dans la même répertoire que l'exécutable.
Le programme affichera également à l'écran le nombre de lignes
nécessaires pour agencer les formes.
Cas particuliers
- Si une forme ne rentre pas dans le plan, le programme
l'indiquera lors de son exécution par un message à l'écran,
de la forme "La forme A ne rentre pas" où A est le même nommage
de la forme que pour l'affichage du résultat. Le programme
continuera cependant l'agencement des autres formes.
- Si plusieurs solutions existent pour un même jeu de formes,
le programme n'en inscrira qu'une dans le fichier resultat.txt
- Si le fichier formes.txt est introuvable ou inaccessible,
le programme affichera un message puis fermera proprement.
- Si le programme ne peut écrire le fichier resultat.txt,
il affichera un message puis fermera proprement.
- Si le paramètre d'exécution est supérieur à 500 ou est absent,
le programme affichera un message et fermera proprement.
I-B. Vainqueur
Le grand gagnant de ce premier défi C n'est autre que : floflo_2006
Toutes nos félicitations à ce grand gagnant des premiers défis C.
Voyons maintenant sa note ainsi que les critiques envers son code.
I-B-1. Notation
Voici le détail des notes retenues envers le gagnant :
- Robustesse : 0,6 / 3
- Commentaires / Propreté : 1 / 3
- Elegance : 2,833333333 / 6
- Vitesse / Consommation : 1,5 / 3
- Organisation du code : 4 / 5
Note finale : 10,16666667 (arrondie à 10)
I-B-2. Critiques
Robustesse
Entrées / Sorties
Le parsage du fichier formes.txt, bien que répondant
à l'énoncé est rude. En effet, le fichier de données doit
forcément être terminé par deux lignes vide pour que la
dernière forme soit prise en compte.
Dans le fichier de forme, les espaces en fin de ligne sont
pris en compte dans la largeur de l'élément ce qui peut donner
des résultats surprenant.
Il y a une fuite mémoire lors de la lecture des formes.
En effet, dès qu'une ligne est lue, une allocation est faite
si nécessaire par un élément de type t_forme. Par contre, si la
forme n'a pas été lu "correctement" (par exemple si la dernière
ligne n'est pas suivie de deux retours à la ligne) cet élément n'est pas libéré.
Au niveau de la sortie :
En principe, pour quitter une application correctement et s'assurer
quelque chose de portable, il faudrait utiliser EXIT_FAILURE.
Quitter l'application avec exit(-1) n'est pas une bonne solution.
La stratégie préconisée est de faire remonter l'erreur jusqu'à main(),
sauver ce qui peut l'être, libérer ce qui doit l'être et quitter
l'application proprement.
Code
2 variables pouvant être utilisé sans être initialisées
(signalées par deux warning à la compilation) :
- j dans positionnerForme() (lorsque la hauteur est nulle,
ce qui ne devrait pas pouvoir se produire)
- y dans utiliserForme() (avec un jolie plantage à l'exécution...)
Il aurait juste été plus plaisant d'avoir des arrêts
propres du programme lors des erreurs. Un exit(-1),
bien qu'amenant techniquement le même comportement suite à la
destruction du processus, est plus barbare qu'une libération
consciencieuse de tous les objets alloués et des fichiers ouverts.
Ne tester aucun ou quasiment aucun retour de malloc/calloc est une
très mauvaise habitude. Bien que la réponse de retour est quasiment
toujours positive, une vérification est nécessaire.
L'utilisation de sizeof(type) au lieu de sizeof(variable),
complexifie la maintenance et l'évolutibilité et
donc on prend des risques inutiles.
Aucun test sur les retours de fonctions, c'est aussi une mauvaise habitude.
Commentaires / propreté
On note un réel effort pour les commentaires.
Ils sont nombreux et amènent un ratio code/commentaire remarquable.
Cependant, des commentaires plus explicatifs, aidant à comprendre
les grandes lignes plutôt que simplement parfois une réécriture en
langage naturel des fonctions appelées aurait été plus appropriés.
De la même manière, un bloc descriptif accompagnant chaque fichier
aurait été du meilleur effet.
À déplorer aussi, l'allocation massive de la matrice principale s'appuyant
sur la hauteur maximale possible. Cela simplifie le problème c'est vrai
mais entraine une consommation excessive de mémoire. Une solution plus
propre aurait été d'agrandir la matrice au fur et à mesure de son utilisation
ou, pour éviter les multiples appels à l'allocateur mémoire, d'allouer la
matrice par blocs de lignes de plus en plus grands.
L'utilisation du nom de l'exécutable Pavage_de_plan.exe "en dur" dans
le message d'aide n'est pas une bonne idée, en effet, si on appelle son programme "pavage" ?
Utilisation de tests non explicite dans le code, par exemple :
Masquage de la qualité de pointeur de t_liste.
Pourquoi ne pas assumer qu'il s'agisse d'un pointeur?
Des cast en double inutile à plusieurs endroits du code.
Les identificateurs commençant par _ suivi d'une majuscule sont réservés.
Utilisation systématique de int pour les tailles et les indices de tableaux.
size_t aurait mieux convenu.
Élégance de la solution
L'avantage de cet algorithme est sa complexité qui est relativement avantageuse.
L'algorithme semble fonctionner et répond donc à nos attentes.
Dommage qu'il n'y ai pas eu d'autres concurrents pour comparer.
Vitesse / consommation mémoire
Comme dit précédemment, il y a une fuite mémoire, dommage.
Avec un fichier contenant une seule forme de 6 étoiles,
le programme effectue 2604 allocations dont 2600 pour allouer
largeur octets correspondant aux nombre de ligne maximale théorique
de la solution. Point de vue des performances, on peut faire mieux.
Organisation du code
Organisé comme un code orienté objet, on voit tout de suite
le rôle de chaque fichier. Bien joué! Nous souhaiterions voir
des programmes architecturés de la sorte plus souvent.
Conclusion
En général, c'est du code très bien présenté et architecturé,
et compte tenu du temps passé à coder la solution, est déjà très bien.
Seul regret, ne pas avoir profité de tout le temps défini pour peaufiner
et améliorer son code...
Etant donné qu'il n'y avait qu'un seul et unique participant,
nous avons eu le temps de bien nous plonger dans le code et d'en
ressortir toutes les qualités et défaut, en espérant que ça puisse lui servir.
I-B-3. Téléchargement
Les sources du grand gagnant du défi C sont téléchargeable à partir de
ce lien


Copyright © 2008 Equipe C. Aucune reproduction, même partielle, ne peut être faite
de ce site et de l'ensemble de son contenu : textes, documents, images, etc
sans l'autorisation expresse de l'auteur.
Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E
de dommages et intérêts.
Cette page est déposée à la
SACD.