Prologin : "se relayer par équipe de un"
Par a3_nm, lundi 12 novembre 2007 à 21:43 :: Tests et opinions :: #151
L'édition 2008 du concours Prologin est à présent ouverte et je vous invite à y participer.
Pour ceux qui ne le savent pas, Prologin est le concours national d'informatique français. Il est ouvert aux personnes de moins de 20 ans, et la participation est gratuite. Une première sélection est effectuée sur la base d'un QCM et de quatre petits programmes à rédiger, que vous pouvez allez rendre en ligne dès maintenant. Les 300 meilleurs (environ) sont retenus pour participer aux demi-finales qui comportent de l'informatique, de l'algorithmique et un entretien, et qui se déroulent sur une journée dans les principales villes de France. Les 100 meilleurs sont retenus pour participer à la finale qui dure quelques jours et a lieu à Paris, et où l'épreuve est 36 (trente-six) heures de programmation non-stop. Vous devez coder une intelligence artificielle pour un jeu dont les règles vous ont été données. Les programmes s'affrontent au terme du concours, et les dix meilleurs candidats sont départagés par entretiens individuels et reçoivent des (très jolis) cadeaux.
J'ai participé à la finale de l'année dernière, et je peux vous dire que l'expression "concours national d'informatique" est extrêmement réductrice. Il serait plus juste de parler de "formation accélérée aux logiciels libres", de "paradis pour informaticiens", ou de "réunion de jeunes geeks".
Croyez-moi, ça en vaut vraiment, vraiment la peine. À titre illustratif, voici quelques informations concernant la finale :
Liste des activités organisées (non exhaustive)
- Banquet ;
- Barbe à papa ;
- Bataille d'eau ;
- Concerts ;
- Demos ;
- Discussions entre geeks ;
- DJ ;
- Feu d'artifice ;
- Formation au logiciel libre ;
- Jonglage ;
- Karaoké ;
- LAN ;
- Lasers ;
- Présentations ;
- Programmation ;
- Réveils en fanfare ;
- Surprises ;
- Tetris ;
- Très peu de sommeil.
Diagramme de mes activités
Quelques perles de code
Manque de temps, manque de sommeil... cela favorise l'apparition de certaines perles lors de la correction du code. Faute d'avoir gagné un prix, j'aurai au moins fait rigoler (ou pleurer) les correcteurs. Toutes ces perles sont tirées de la version finale du programme, que j'ai rendue. (Du moins, si je me souviens bien de quelle version j'ai rendue...)
Pour embrouiller le relecteur...
/* FIXME2: à utiliser */ #define MENACE_ALLIE_MALUS_ATTAQUE_CELLULE_SAINE 50
À comprendre...
#define SCORE_VIRUS_PHAGO 20.0 #define SCORE_CELL_PHAGO 20.0 #define SCORE_LEUCO_PHAGO 200.0 /* NB c'est un coefficient */
Bien la peine...
/* Distance max à considérer dans l'exploration des distances (en Manhattan) */ #define MAX_RANGE 1
Bon courage...
/* Coefficient d'incertitude au cours du temps pour chaque type. (à la puissance du nombre de jours pour aboutir à un pourcentage) */ const float certainty = {1, 1, 0.2, 0.9, 0.7, 0.2} ;
Ce serait bête, hein ?
/* Pour ne pas s'agglutiner bêtement */ #define PERIMETRE 1 #define PENALTY_POW 3000 #define PENALTY_ENNEMY_NEAR 10;
Ça devrait valoir 1...
/* Ratio des menaces pour priorités d'attaque, le total devrait valoir 1, allie virus bactérie */ #define MENACE_ALLIE 0 #define MENACE_VIRUS 1 #define MENACE_BACTERIE 2
Vanité...
/* Notre algorithme de chiffrement des messages révolutionnaire est réputé incassable.
Flemmard...
} else { /* Ne nous fatiguons pas, ce n'est pas le travail de cette fonction */ return BAD_ARGUMENT;
Dommage !
if (consistent() == SUCCESS) { /* Les données sont cohérentes après vérification, c'est donc un message au format privé */ /* On lui accorde donc la validation */ _typep = VALID; return SUCCESS; } else { /* Non ? Tant pis, dommage */ return BAD_ARGUMENT; }
Fonction essentielle.
int thirdparty_parse_message(int id) { /* Fonction de gestion des messages dans un format privé inconnu */ /* Tentatives élémentaires de décodage */ /* Gestion de la cohérence, des menaces etc */ /* FIXME4 */ return BAD_ARGUMENT; }
OSEF !
case COM_WHITEFLAG: /* On s'en moque :-) */ break;
Evil mastermind !
case INVALID: /* Le message est une tentative maladroite et pitoyable de nous induire en erreur. De fait, les informations qu'il renferme sont très probablement fausses. Cela veut dire qu'on ne peut plus avoir confiance en ses alliés ! On divise par deux la confiance accordée aux messages d'info adverse. FIXME4 : crédit négatif aux infos du message */ credibilite_allie /= 2;
OSEF toujours.
case COM_WHITEFLAG: /* On s'en moque aussi :-) */ break;
Désespoir...
printf("failed.\n"); /* Tant pis, que voulez-vous ! */ /* On arrête là, et on doit quand même retourner SUCCESS (quelle vie !) */ return SUCCESS;
Programmeur fou...
/* Maintenant que le message sous sa forme intelligible nous attend bien au chaud dans des variables globales, on fait le travail d'interprétation proprement dit */
Technique astucieuse...
/* Mesure de prudence... */ while (init_competences() != SUCCESS) ;
Hem...
} else { return 0; /* There be dragons... */ }
Mes plus belles pièces (1).
int allies_contigus() { if ( (regarde(position_leucocyte_x(mon_identifiant()), position_leucocyte_y(mon_identifiant()) + 1) == WHITE_CELL && equipe(identifiant_leucocyte(position_leucocyte_x(mon_identifiant()), position_leucocyte_y(mon_identifiant())+ 1)) != mon_equipe()) || (regarde(position_leucocyte_x(mon_identifiant()), position_leucocyte_y(mon_identifiant()) - 1) == WHITE_CELL && equipe(identifiant_leucocyte(position_leucocyte_x(mon_identifiant()), position_leucocyte_y(mon_identifiant())- 1)) != mon_equipe()) || (regarde(position_leucocyte_x(mon_identifiant()) + 1, position_leucocyte_y(mon_identifiant())) == WHITE_CELL && equipe(identifiant_leucocyte(position_leucocyte_x(mon_identifiant()) + 1, position_leucocyte_y(mon_identifiant()))) != mon_equipe()) || (regarde(position_leucocyte_x(mon_identifiant()) - 1, position_leucocyte_y(mon_identifiant())) == WHITE_CELL && equipe(identifiant_leucocyte(position_leucocyte_x(mon_identifiant()) - 1, position_leucocyte_y(mon_identifiant())) != mon_equipe())) ) { return 1; } else { return 0; } }
Mes plus belles pièces (2).
int agresseur() { int t, x, y; if (\(regarde((x = position_leucocyte_x(mon_identifiant())), (y = position_leucocyte_y(mon_identifiant())) + 1) == WHITE_CELL) && (equipe(t = identifiant_leucocyte(x, y+1)) != mon_equipe()) && (etat_leucocyte(t) == STATE_PHAGOCYTOSING)) { return t; } if ((regarde(x, y-1) == WHITE_CELL) && (equipe(t = identifiant_leucocyte(x, y-1)) != mon_equipe()) && (etat_leucocyte(t) == STATE_PHAGOCYTOSING)) { return t; } if ((regarde(x+1, y) == WHITE_CELL) && (equipe(t = identifiant_leucocyte(x+1, y)) != mon_equipe()) && (etat_leucocyte(t) == STATE_PHAGOCYTOSING)) { return t; } if ((regarde(x-1, y) == WHITE_CELL) && (equipe(t = identifiant_leucocyte(x-1, y)) != mon_equipe()) && (etat_leucocyte(t) == STATE_PHAGOCYTOSING)) { return t; } return INVALID_COMMAND; }
Tristesse...
case CELL_STATE_DEAD: /* Que peut-on en faire, sinon pleurer sur le sort de cette pauvre cellule innocente morte pour la bonne cause ? */ return -1; // (Ouin ouin)
Pessimisme.
case VIRUS: /* FIXME1: Oui mais, ce n'est guère subtil et n'est peut-être pas optimal */ /* FIXME1: (utilisation d'anticorps, astuces pour trahir etc.) */ return mult_p * menaceMENACE_VIRUS*SCORE_VIRUS_PHAGO; break;
Prudence.
} /* Euh... normalement rien, mais sait-on jamais... */ printf("@Une action est passée entre les mailles du filet de traitement."); return 0;
Pour rien...
{ /* On cherche à phagocyter un virus, on est pile à une case en diagonale, on n'a pas de traîtres potentiels aux basques. Donc : on ne fait rien. */
Conditionnel génial
if (1) // inutile de filtrer sur le type de terrain, c'est potentiellement intéressant partout {
Vengeance !
if(etat_leucocyte(mon_identifiant()) == STATE_BEING_PHAGOCYTED) { /* Hein ! Mais ... On nous attaque ! Jamais possible d'avoir la paix */ update_menace(MENACE_ALLIE, MALUS_AGRESSION); // Et vlan !
Mon code
Pour ceux que ça intéresserait, vous pouvez télécharger l'ensemble de mon code. Je vous le déconseille instamment, toutefois. Il est buggé, illisible (voir plus haut), peu performant (je n'ai fini que 44ème, soit parmi les derniers de ceux qui avaient un programme qui marchait), et issu d'une gestion du temps tout à fait pathétique (mais je compte faire mieux cette année, si je suis pris à nouveau). Si vous le voulez quand même :
- prologin_2007.tar.gz (12,8 Ko), archive des sources.
Participez !
C'est là un conseil que je vous donne. Ça ne prend pas longtemps et ça en vaut la peine. L'an dernier, je l'ai fait un soir, comme ça, juste pour voir, et j'ai été retenu. (Mais bon, si vous ne participez pas, tant pis pour vous. Ça me fera plus de chances de me qualifier :-)).
Commentaires
Aucun commentaire pour le moment.
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.