Créer une liste de chaînes de caractères.
Posté le 15/05/2016 10:52
Je vais dans ce topic parler de 3 méthodes différentes pour créer l'équivalent d'une liste de chaînes de caractères.
I) Utilisation d'une liste classique
L'idée ? Stocker les chaînes les unes après les autres dans une autre chaîne, puis rentrer la longueur de chaque chaîne dans chaque case d'une liste.
Par exemple, on a :
"BATEAU"→Str 1
"CISEAUX"→Str 2
"SEAU"→Str 3
On ajoute chaque chaîne dans une autre, par exemple Str 4:
"BATEAUCISEAUXSEAU"→Str 4.
Ensuite, on met dans chaque case de la liste (par exemple la liste 1) le numéro de positionnement dans la chaîne principale. Arrivé à la fin, on rentre le numéro de positionnement théorique d'un nouveau mot ajouté dans la chaîne.
{1,7,14,18}→List 1
Et voilà ! Pour lire ce qui est l'équivalent de Str 4[A], on fait :
StrMid(Str 4,List 1[A],List 1[A+1]-List 1[A])
II) Utilisation d'un même caractère pour démarquer chaque chaîne
Je tiens à remercier
Dark storm pour cette technique.
Le principe est assez simple : en interposant un caractère (par exemple "") entre chaque chaîne, on réussit à l'aide d'une boucle à déterminer une chaîne particulière.
Le code :
"Pierre|Feuille|Ciseaux"→Str 1
2→A // on veut le mot n°2
0→B
Str 1→Str 2 // on sauvegarde parce que la chaine 2 va être modifiée
While B < A
StrSrc(Str 1, "|") → P // on cherche le prochain séparateur
If P > 0 // on fait gaffe à ne pas aller trop loin sinon ça plante
Then StrLeft(Str 2, P-1) → Str 3 // ça c'est le mot extrait
StrRight(Str 2, StrLen(Str 2) - (P+1)) → Str 2 // ça c'est le reste de la chaine
IfEnd
B+1→B
WhileEnd
Str 3 // contient le mot extrait
III) Utilisation de caractères différents pour démarquer chaque chaîne
Cette fois ci, c'est
Lephenixnoir qui nous offre cette astuce. Le principe ressemble au précédent, à une différence près : on utilise des caractères différents entre chaque chaînes afin d'éviter l'utilisation d'une boucle.
Le code :
"&Pierre@Feuille|Ciseaux#Lézard%Spock$"→Str 1
"&@|#%$"→Str 2
3→A // On veut "Ciseaux".
StrSrc(Str1,StrMid(Str 2,A,1))→L
StrSrc(Str1,StrMid(Str 2,A+1,1))→R
StrMid(Str 1,L,R-L) // "Ciseaux"
Conclusion : que choisir ?
Chaque méthode à ses avantages et ses inconvénients.
Méthode 1 :
+ : code pour sélectionner la chaîne simple et court.
- : utilisation d'une liste, peu intuitive à remplir .
Méthode 2 :
+ : Pas de liste utilisée, séparation intuitive.
- : Un caractère devient inutilisable, boucle et code compliqué. Utilisation de plusieurs str.
Méthode 3 :
+ : Pas de liste utilisée, séparation intuitive, pas de boucle.
- : Un nombre important de caractères deviennent inutilisables.
Cependant il est à noter qu'une chaîne à une capacité limitée : Au bout d'un total de 256 caractères, voir même 128 pour des caractères spéciaux, cette astuce ne marche pas !
Citer : Posté le 15/05/2016 15:43 | #
Kirafi tu as supprimé ton message ?
Citer : Posté le 15/05/2016 17:41 | #
Il utilisait un séparateur et du StrSrc. Mais du coup faut un séparateur différent à chaque fois... non ? Donc une Str avec les séparateurs.
Citer : Posté le 15/05/2016 18:30 | #
Est-ce vraiment plus simple ?
Citer : Posté le 15/05/2016 19:38 | #
Bah c'est pas forcément plus optimisé, mais juste plus automatisé ...
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Citer : Posté le 15/05/2016 20:10 | #
C'est plus long, mais ça évite d'avoir une liste à coté.
Citer : Posté le 15/05/2016 20:38 | #
Mais du coup ça ressemblerait à quoi ? Excusez moi mais j'ai du mal à visualiser le code que ça entraînerait...
Citer : Posté le 15/05/2016 20:44 | #
2->A // on veut le mot n°2
0->B
Str 1→Str 2 // on sauvegarde parce que la chaine 2 va être modifiée
While B < A
StrSrc(Str 1, "|") → P // on cherche le prochain séparateur
If P > 0 // on fait gaffe à ne pas aller trop loin sinon ça plante
Then StrLeft(Str 2, P-1) → Str 3 // ça c'est le mot extrait
StrRight(Str 2, StrLen(Str 2) - (P+1)) → Str 2 // ça c'est le reste de la chaine
IfEnd
B+1→B
WhileEnd
Str 3 // contient le mot extrait
À quelques indices près sur l'extraction des mots (j'ai pas testé), c'est ça.
Citer : Posté le 15/05/2016 20:55 | #
Ah ben non, ça va pas ça c'est en accès linéaire. Il faut changer de séparateur à chaque fois et rechercher le séparateur adéquat.
Citer : Posté le 15/05/2016 20:56 | #
OK, merci !
Peut être serait-il intéressant de parler des deux astuces dans le topic ?
Citer : Posté le 15/05/2016 20:57 | #
Ben si tu change de séparateur, ça devient le bordel si tu veux ajouter des mots. Mais tu gagne en rapidité. Après, faut voir si la rapidité est strictement nécessaire (si c'est un mot de temps en temps, ce code reste assez rapide).
Citer : Posté le 15/05/2016 21:08 | #
Et du coup toi Lephenixnoir tu ferais comment ?
Citer : Posté le 15/05/2016 21:48 | #
Comme on est limités en taille (256 octets), on aura peu de mots. On peut donc lister des séparateurs en utilisant des caractères "exotiques" :
"&@|#%$"→Str 2
3→A // On veut "Ciseaux".
StrSrc(Str1,StrMid(Str 2,A,1))→L
StrSrc(Str1,StrMid(Str 2,A+1,1))→R
StrMid(Str 1,L,R-L) // "Ciseaux"
Ça doit être quelque chose comme ça.
Citer : Posté le 15/05/2016 22:15 | #
Cool !
Est-ce que vous accepteriez que je rajoute ces deux astuces dans le topic ?
Citer : Posté le 15/05/2016 22:16 | #
La mienne ne vaut pas grand-chose à mon avis, mais je t'en prie...
Citer : Posté le 15/05/2016 22:22 | #
Vas-y, la connaissance ça se partage
Citer : Posté le 15/05/2016 22:55 | #
Et voilà !
Citer : Posté le 15/05/2016 22:58 | #
Pourquoi mettre des spoilers ? Mets plutôt des titres de parties en combinant big, b et brown
Citer : Posté le 16/05/2016 09:34 | #
@Lephenixnoir : c'est fait !