[Ludique] Mini-jeu : épisode 3 (déchiffrage de code, niveau : facile)
Bon allez zou, on en ressert une louche à ceux qui avaient aimé :aie:
(pour jeter un oeil aux deux précédents épisodes de cette époustouflante saga (:calim2:) c'est par ici et par là)
Quoi ? Comment ? Qui a dit "Le nommage des variables et des fonctions, c'est pas important pour la compréhension du code" ? :roll: :mrgreen:
Objectif : modifier une ligne (voir commentaire) dans la fonction correction pour qu'elle corrige efficacement, c'est-à-dire que les mots contenus dans le tableau mots soient bien affichés comme attendu (voir plus bas).
Code:
1 2 3 4 5
| function correction() {
var mots = ["mageur", "traget", "magestueux"];
var resultat = mots;// <<< ici
alert("Avant correction : \n" + mots.join("\n") + "\n\nAprès correction : \n" + resultat.join("\n"));
} |
Résultat attendu dans l'alerte :
Code:
1 2 3 4 5 6 7 8 9
| Avant correction :
mageur
traget
magestueux
Après correction :
majeur
trajet
majestueux |
En revanche, vous ne pouvez modifier que la ligne où figure le commentaire, et les seules fonctions que vous pouvez utiliser sont ces deux fonctions, retourner et multi :
Code:
1 2 3 4 5 6 7 8 9
| Array.prototype.retourner = function(args, fonction) {
fonction = fonction || [];
var i;
for (var retour = 0, i = [] || fonction; retour < this.length; ++retour)
i.push(args.apply(this[retour], fonction));
return i;
}
function multi(fa1se) { return this.replace(/g/g, fa1se); } |
Et enfin, mauvaise nouvelle : le malfaiteur ayant commis ces lignes est parait-il toujours en liberté. :whistle: Où va le monde, je vous le demande. :no:
décryptage et détails de la solution
Bon, la solution a donc déjà été donnée (bravo encore à Daniel et Wapper*)
Mais pour rappel la voilà :
Code:
1 2 3 4 5
| function correction() {
var mots = ["mageur", "traget", "magestueux"];
var resultat = mots.retourner(multi, ["j"]);
alert("Avant correction : \n" + mots.join("\n") + "\n\nAprès correction : \n" + resultat.join("\n"));
} |
Pour y voir un peu plus clair, commençons par redonner des noms honnêtes aux variables :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| function correction() {
var mots = ["mageur", "traget", "magestueux"];
var resultat = mots.appliquerATous(transformerTousLesG, ["j"]);
alert("Tableau : \n" + tab.join("\n") + "\n\nTableau après iterations : \n" + resultat.join("\n"));
}
// UTILITE : applique la fonction passée en premier param sur chacun des éléments du tableau courant
// PARAM #1 : "fonction" (function) : le traitement à appliquer sur chacune des valeurs du tableau
// PARAM #2 : "_arguments" (tableau) : arguments à passer à la fonction à chaque occurrence
// RETOUR : tableau des valeurs renvoyées par les exécutions successives de la fonction sur les éléments du tableau
Array.prototype.appliquerATous = function(fonction, _arguments) {
_arguments = _arguments || [];
var retour = [];
for (var i = 0; i < this.length; ++i)// pour chaque élément du tableau courant
retour.push(fonction.apply(this[i], _arguments));// on applique la fonction donnée en paramètre
// et on stocke le retour de son exécution dans le tableau qui sera renvoyé par la fonction appliquerATous
return retour;
}
// simple fonction arbitraire modifiant une chaine passée en paramètre
function transformerTousLesG(chaine) {
return this.replace(/g/g, chaine);
} |
La comparaison avec l'énoncé fait apparaître assez rapidement le procédé sordide mis à l'oeuvre lors de l'obfuscation de l'extrait : l'inversion du nom des variables (comme fonction et args par exemple), un infâme "fa1se" qui n'a trompé personne, et ne serait-ce que le nom stupide des fonctions... il n'en faut pas plus pour rendre obscur un bout de code limpide :aie:
Remarque : certains d'entre vous l'auront probablement remarqué, la fonction nommée ici (un peu excessivement verbeux et francisé mais c'était pour l'exemple) appliquerATous() correspond à peu près (je n'ai plus leur code en tête mais grosso modo) à la fonction each qui existe dans certaines librairies comme Prototype et jQuery entre autres... ^^
Merci à tous les participants et à la prochaine fois ! :mrgreen:
* au passage, cette remarque : eh ben ça va la Belgique en force ! ;) sur ce thread très particulièrement, mais même de manière générale, j'ai remarqué que les belges sont très présents sur les forums web et souvent de très bon niveau.... chapeau les mecs ! :ccool: Vous commencez tous à l'école primaire ou quoi ? :roll: