23/09 : Énigme Mathématiques
J'ai du une nouvelle fois répondre à l'appel à l'aide de mon frère, naufragé du grand serpent marin, Je lui ai donc proposé un coup de main pour dissiper ses tourments numériques, n'est pas Erik le Rouge qui veut ! Il essayait de refaire son sujet d'examen qui l'avait laissé dans l'incompréhension et la confusion la plus complète.
Le but de l'interrogation était de deviner un message secret à partir d'une longue séquence de lettres et de nombres, du type "erfvfdf4kdja5sbdbd7dhdbgei22dg" . Le principe était d'ajouter chaque nombre au total s'il était précédé d'une consonne et de le multiplier au total s'il étaitprécédé d'une voyelle.
Dans notre exemple, l'on part de zéro, le premier nombre est 4, précédé d'une consonne "f" , on l'ajoute donc au total : 0+4=4, le nouveau total est 4.
Puis vient le 5, précédé d'une voyelle a, on multiplie donc le total : 4*5 = 20.
Ensuite on tombe sur un 7, précédé d'une consonne (d), on le somme donc: 20+7 =27.
Enfin, le dernier nombre est un 22, précédé d'une voyelle (i) , multiplions en conséquence le total pour obtenir : 27*22 = 594.
Dans le cas de l'examen de mon cher frère, la chaîne de caractères était plus alogue, si bien que l'on obtenait comme résultat un nombre à douze chiffres : dont les 6 premiers formaient la longitude, les 6 derniers la latitude (ou l'inverse je en sais plus ^^') d'un mystérieux lieu à découvrir !
Le benjamin de ma fratrie avait compris le principe de la solution, mais n'avait point réussi à l'implémenter. Il en était ainsi resté à la première étape de la résolution : la solution naïve mais inefficace :
Il voulait parcourir toute la chaîne et stocker à chaque fois en mémoire le dernier caractère que l'on avait visiter, puis d'ajouter ou de multiplier au total si l'on tombait sur un nombre...
En fait seuls ces derniers sont utiles, les voyelles et les consonnes sont secondaires (seuls celles qui précèdent un nombre nous intéressent vraiment). Il n'avait également pas abordé le cas où l'on tombe sur un nombre un plusieurs chiffres ("25", "352"...) : C'est la deuxième partie de la résolution : l'optimisation, la recherche de l'efficacité, pour avoir un programme robuste, rapide et sans gaspillage .
La troisième étape est le test, la validation du programme ainsi que la gestion des erreurs ou des effets de bord : par exemple si le premier caractère de la chaîne est un nombre, l'on ne peut pas regarder le caractère précédent pour savoir si on doit l’additionner ou le multiplier, et donc le programme plante logiquement.
Une fois le total à douze chiffre obtenu, comment le "séparer" en deux ( c'est à dire sectionner "123456789012" en "123456" et "789012") ? Élémentaire mon cher Newton,
Pour obtenir les 6 derniers chiffres, il suffit de prendre le reste de la division euclidienne du total par un million (10 puissance 6) , c'est à dire que 123456789012= 1 000 000*1 + 789012, nous avons bien les 6 derniers chiffres !
Pour obtenir ensuite les 6 premiers chiffres, l'on soustrait les 6 derniers chiffres obtenus au total initial : 123 456 789 012 - 789012 = 123 456 000 000; puis de diviser ce résultat par un million : 123 456 000 000/ 1 000 000 = 123 456 (cela revient à enlever les 6 zéros ) .
Et voilà, nous avons résolu l'énigme ! (Je ne sais pas si j'ai été très clair, on me dit souvent que j'explique mal ^^' )
Si je retouve la chaîne de base je l'écrirai içi pour que vous puissiez la résoudre à votre tour ;)
Annotations
Versions