Un jour j'ai fait un algorithme "assez" simple.
L'utilisateur entre une chaîne de caractères. Le but est de vérifier si la chaîne passe bien dans l'écran, on veut donc savoir si elle prend plus de 8 cases ou non.
Donc, si StrLen(Str 1)>8, on sort.
Ensuite, pour chaque caractère, on le compare à une chaîne de référence, organisée pour être optimisée ("AEIOUYSMLNFC...ZKHX"). Si le caractère n'appartient pas à la chaîne, on sort.
Le tout prenait plusieurs secondes à exécuter.
Même constat pour un autre algorithme qui séparait une chaîne selon un séparateur défini, plusieurs secondes.
Le problème c'est que les Str en Basic Casio ne permettent pas d'insérer un caractère efficacement au milieu d'une chaîne. On est obligé de "couper" la chaîne en 2, (complexité linéaire), puis de "recoller" (re-linéaire!).
Pour mon TIPE sur la compression de données (l'algorithme de Burrows-Wheeler précisément), on avait une complexité dégueulasse, quadratique, à cause de ça!
A la place on a créé une grande chaîne puis on a inséré tous les caractères un à un, et hop -> linéaire!
Sauf qu'en Basic bah... on encaisse!
Il faudrait gérer une pseudo-chaîne manuellement avec une liste et un codage astucieux, mais ce ne serait meilleur qu'asymptotiquement évidemment...
Là j'ai parlé de l'insertion mais ça doit être valable pour tout le reste...
Liste chaînée c'est-à-dire?
quadratique Qu'entends-tu par là? Bah quadratique c'est O(n^2)... Que veux-tu que je te dise....? On faisait n*(n+1)/2 insertions, donc O(n^2), complexité quadratique... Donc c'était pourri, pour un "simple" RLE! sur lequel on a galéré plusieurs semaines, pour des raisons d'universalité... Mais c'est une autre histoire...
Une liste chaînée est une structure de donnée, qui comporte la donnée en elle-même et un pointeur sur la donnée suivante.
C'est-à-dire que pour insérer un élément, tu le crées, tu fait pointer le pointeur du précédent sur lui, et son propre pointeur sur l'élément suivant. Complexité constante ! 8)
Par contre, le pointeur peut être de 1 à 4 fois plus grand en mémoire que le caractère.
Ah oui je vois, je connaissais pas le terme mais le principe si. Merci.
En fait quand je parlais d'insertion c'était plutôt modification en fait, pour changer la valeur d'un caractère au milieu. Mais oui pour la vraie insertion la liste chaînée c'est l'idéal c'est sûr!
@Ne0tux J'ai utilisé une technique assez similaire pour l'affichage des noms des Pokémons, dans la matrice liée aux stats j'ai aussi entré le nombre de caractères dans le nom du Pokémon, et aussi son rang dans la chaîne de caractère (=à quel caractère rencontre-t-on le nom du Pokémon.)
J'en arrive à un code de ce genre :
Le souci avec ta technique c'est que je devrais au final rechercher le nom de l'attaque en fonction d'une variable, ce qui me reviendra à faire :
[b][blue]If[/blue][/b] A=[maroon]1[/maroon]
[b][blue]Then[/blue][/b] StrLeft(Str [maroon]1[/maroon],[gray]"@"[/gray]→Str [maroon]2[/maroon]
StrRight(Str [maroon]2[/maroon],*je sais pas encore quoi mettre ici. XD*→Str [maroon]2[/maroon]
[b][blue]IfEnd[/blue][/b]
Et ce pour les 40 attaques, au final ce ne serait pas encore plus lourd ? Enfin après ma façon de voir les choses est peut-être différente de ce à quoi tu pensais, mais vu que la recherche de caractères est assez limitée je n'ai pas encore trouvé d'alternative !
Si tu as trop d'attaques, il suffit de faire plusieurs chaînes !
Mieux vaut deux ou trois conditions de type "A=n⇒..." que cinquante.
Bien sûr, pour ne pas à taper le même code d'extraction de caractères après chaque condition, il suffira d'utiliser une chaîne intermédiaire.
Pour en revenir au while...
Théoriquement, est-ce qu'une boucle while a une longueur infinie ? Je peux mettre un While au début du programme et un WhileEnd tout à la fin pour recommencer le programme lorsqu'un combat est fini par exemple ? Ou serait-il plus adapté d'utiliser un... Goto ?
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd