De Scratch Wiki en français

m (« »)
 
(8 versions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
{{AFinir}}
+
{{Titre|Séparer les mots d'une suite de caractères}}
{{Titre|Différencier les mots d'une suite de caractères}}
 
  
 
Hey !
 
Hey !
  
Vous avez compris le titre ? Non ? Ah.
+
Vous avez compris le titre ? Non ? Ah bon.
  
Disons que dans ce tuto, nous allons prendre une '''suite de caractères''' (par exemple, "''ceci est une suite de caractères''", bref, un texte), et nous allons mettre chaque mot de cette suite dans une variable. Ca peut sembler inutile, mais je vous assure qu'on peut en avoir besoin, alors autant savoir le faire !
+
Disons que dans ce tuto, nous allons prendre une '''suite de caractères''' (par exemple, « ''ceci est une suite de caractères'' », bref un texte) et nous allons mettre chaque mot de cette suite dans une [[liste]]. Ça peut sembler inutile, mais je vous assure qu'on peut en avoir besoin alors autant savoir le faire !
  
== Exemple ==
+
== Principe ==
  
Vous avez créé un projet permettant d'exécuter une commande entrée par l'utilisateur. C'est-à-dire que si vous écrivez "''dire Bonjour''" dans une entrée, le sprite va dire "''Bonjour''" (oui, vu comme ça, ça sert à rien, je sais, mais c'est pratique pour créer un '''langage de programmation dans Scratch''').
+
Normalement, votre texte contient plusieurs mots. Si ces derniers sont séparés par une espace (ce qui est assez courant, non ?) il va falloir que le script repère ceux-ci. Il doit donc parcourir le texte lettre par lettre en stockant celles-ci jusquarriver à une espace, transférer alors les lettres stockées jusque-là et qui forment un mot dans une liste, puis recommencer jusqula fin du texte.
  
Voilà les commandes que vous avez faites :
+
== Création du script ==
 
 
<scratchblocks>
 
demander [Entrer une commande] et attendre
 
si <(réponse) = [dire Bonjour]> alors
 
dire [Bonjour]
 
end
 
si <(réponse) = [dire Ça va]> alors
 
dire [Ça va]
 
end
 
si <(réponse) = [dire Bonjour, ça va ?]> alors
 
dire [Bonjour, ça va ?]
 
end
 
</scratchblocks>
 
 
 
Bref, vous avez compris. Il va falloir faire '''un script par réponse''', et autant dire qu'il existe des millions de millions de réponses possibles (je ne connais pas la longueur maximale d'une entrée, mais c'est pas mal, croyez-moi).
 
 
 
On ne va pas s'ennuyer à faire des millions de conditions, et de toute façon, Scratch ne supporterais pas et crasherais.
 
 
 
Donc il vous faut un script pour savoir que le premier mot est "''dire''". Déjà, ça permet de savoir l'action que vous voulez que votre sprite exécute. Car vous pouvez parfaitement avoir créé plus d'actions, comme "''avancer''", "''sauter''", "''penser''"...
 
 
 
On va voir ça tout de suite !
 
 
 
== Stockage du premier mot ==
 
 
 
Normalement, votre variable contient plusieurs mots.
 
 
 
Si ces derniers sont séparés par un espace (ce qui est assez courant, non ?) il va falloir que Scratch stocke tous les caractères présents avant cet espace.
 
  
 
=== Les variables ===
 
=== Les variables ===
Ligne 46 : Ligne 18 :
  
 
<scratchblocks>
 
<scratchblocks>
(x) // parce que j'ai pas d'idée de nom
+
(compteur) // servira à indiquer quelle lettre du texte il faut examiner
(résultat)
+
(résultat) // servira à stocker les lettres examinées
(mots :: list) // la liste dans laquelle seront tous les mots obtenus
+
(mots :: list) // la liste dans laquelle seront mis tous les mots obtenus
 
</scratchblocks>
 
</scratchblocks>
 
Donc vous avez deux variables et une liste. Jusque là, tout ça bien.
 
 
''x'' va servir à passer d'une lettre à l'autre dans la variable.
 
 
''résultat'' va stocker le mot obtenu à chaque fois.
 
 
''mots'' va contenir tous les mots de la variable, dans l'ordre.
 
  
 
=== Lettre par lettre ===
 
=== Lettre par lettre ===
  
Vous devez créer un script permettant d'attribuer à ''x'' une lettre. Vous allez comprendre.
+
Nous devons créer un script qui va tester lettre par lettre le texte. D'abord la première, puis la deuxième, la troisième, etc. Tant qu'il ne s'agit pas d'une espace, il la place dans la variable ''résultat'' et continue. Vous allez comprendre. Prenons comme exemple la phrase = « ''Bonjour ami scratcheur'' ». Donc, avec cette phrase exemple, ''résultat'' doit valoir « ''Bonjour'' » après la première espace.
 
 
Donc déjà, on s'occupe de ''résultat''.
 
 
 
<scratchblocks>
 
mettre [résultat v] à (regrouper (résultat) et (lettre (x) de (réponse)))
 
</scratchblocks>
 
 
 
Donc ''résultat'' va regrouper sa valeur de base ainsi qu'une lettre en plus.
 
  
Voilà un petit tableau pour comprendre l'utilité de ''x'', avec réponse = "''Bonjour Scratch''".
+
Voilà un petit tableau pour comprendre l'utilité de ''compteur''.
  
 
{| class="wikitable unsortable"
 
{| class="wikitable unsortable"
!x
+
!compteur
!lettre x
+
!lettre correspondante
 
!résultat
 
!résultat
 
|-
 
|-
Ligne 107 : Ligne 63 :
 
|}
 
|}
  
Ah, avec x = 8, vous tombez sur un espace. C'est donc la fin du mot.
+
''compteur'' commence à 1 et augmente de 1 à chaque fois. Ah, avec ''compteur'' = 8, vous tombez sur une espace. C'est donc la fin du mot.
  
Pour le moment, c'est un peu dans le désordre. Pas grave. Vous avez donc ce script :
+
<scratchblocks>
 +
ajouter (1) à [compteur v]
 +
</scratchblocks>
 +
 
 +
Le script va se répéter lettre par lettre jusqu'à la fin du texte. Il nous faut donc une boucle et nous avons donc besoin du bloc [[(longueur_de_())_(bloc)|longueur de ()]] qui donne le nombre de caractères dans une chaîne donnée.
  
 
<scratchblocks>
 
<scratchblocks>
mettre [résultat v] à (regrouper (résultat) et (lettre (x) de (réponse)))
+
répéter (longueur de [Bonjour ami scratcheur]) fois
 +
ajouter (1) à [compteur v]
 
</scratchblocks>
 
</scratchblocks>
  
Il faut désormais faire une boucle. Si vous avez tout compris (ce dont je doute un peu...) vous devriez savoir pourquoi cette boucle :
+
Nous allons utiliser le bloc [[(lettre_()_de_())_(bloc)|lettre () de ()]] pour indiquer au script quel caractère du texte examiner. Si on regarde le tableau, la deuxième colonne correspond à :
  
 
<scratchblocks>
 
<scratchblocks>
répéter jusqu'à ce que <(lettre (x) de (réponse)) = [ ]>
+
(lettre (compteur) de [Bonjour ami scratcheur])
end
 
 
</scratchblocks>
 
</scratchblocks>
  
Donc, si on regarde le tableau, la deuxième colonne correspond à :
+
Soit ce caractère est une espace, soit ce n'en est pas un. Il nous faut donc le bloc [[Si_()_alors_sinon_(bloc)|Si () alors sinon]] pour que le script décide quoi faire ensuite selon le cas.
  
 
<scratchblocks>
 
<scratchblocks>
(lettre (x) de (réponse))
+
répéter (longueur de [Bonjour ami scratcheur]) fois
 +
si <(lettre (compteur) de [Bonjour ami scratcheur]) = [ ]> alors
 +
sinon
 +
fin
 +
ajouter (1) à [compteur v]
 
</scratchblocks>
 
</scratchblocks>
  
Ce qui veut dire que le script s'arrête quand cette colonne contient " " (espace), et que ''résultat'' cesse de se remplir.
+
Nous allons maintenant utiliser le bloc [[(regrouper_()_et_())_(bloc)|regrouper () et ()]] pour ajouter le caractère à la variable ''résultat'' dans le cas où ce n'est pas une espace.
 
 
Donc, avec cette phrase exemple, ''résultat'' doit valoir "''Bonjour''" à la fin du script. Voyons le script.
 
  
 
<scratchblocks>
 
<scratchblocks>
répéter jusqu'à ce que <(lettre (x) de (réponse)) = [ ]>
+
répéter (longueur de [Bonjour ami scratcheur]) fois
mettre [résultat v] à (regrouper (résultat) et (lettre (x) de (réponse)))
+
si <(lettre (compteur) de [Bonjour ami scratcheur]) = [ ]> alors
end
+
sinon
 +
mettre [résultat v] à (regrouper (résultat) et (lettre (compteur) de [Bonjour ami scratcheur]))
 +
fin
 +
ajouter (1) à [compteur v]
 
</scratchblocks>
 
</scratchblocks>
  
Si on regarde la première colonne, ''x'' augmente tout le temps d'1. Donc :
+
Par contre, dans le cas où le caractère examiné est une espace, il faut transférer le contenu de la variable dans la liste avant de la réinitialiser. Sans oublier de transférer une dernière fois le contenu de la variable lorsque le script arrive en fin de texte parce qu'en général un texte ne se termine pas par une espace.
  
 
<scratchblocks>
 
<scratchblocks>
répéter jusqu'à ce que <(lettre (x) de (réponse)) = [ ]>
+
répéter (longueur de [Bonjour ami scratcheur]) fois
mettre [résultat v] à (regrouper (résultat) et (lettre (x) de (réponse)))
+
si <(lettre (compteur) de [Bonjour ami scratcheur]) = [ ]> alors
ajouter (1) à [x v]
+
ajouter (résultat) à [mots v]
 +
mettre [résultat v] à []
 +
sinon
 +
mettre [résultat v] à (regrouper (résultat) et (lettre (compteur) de [Bonjour ami scratcheur]))
 +
fin
 +
ajouter (1) à [compteur v]
 
end
 
end
 +
ajouter (résultat) à [mots v]
 
</scratchblocks>
 
</scratchblocks>
  
Il ne reste qu'à ajouter les scripts d'initialisation des variables :
+
Il ne reste qu'à ajouter les blocs d'initialisation des variables :
  
 
<scratchblocks>
 
<scratchblocks>
mettre [x v] à [1]
+
supprimer tous les éléments de la liste [mots v]
 
mettre [résultat v] à []
 
mettre [résultat v] à []
répéter jusqu'à ce que <(lettre (x) de (réponse)) = [ ]>
+
mettre [compteur v] à [1]
mettre [résultat v] à (regrouper (résultat) et (lettre (x) de (réponse)))
+
répéter (longueur de [Bonjour ami scratcheur]) fois
ajouter (1) à [x v]
+
si <(lettre (compteur) de [Bonjour ami scratcheur]) = [ ]> alors
 +
ajouter (résultat) à [mots v]
 +
mettre [résultat v] à []
 +
sinon
 +
mettre [résultat v] à (regrouper (résultat) et (lettre (compteur) de [Bonjour ami scratcheur]))
 +
fin
 +
ajouter (1) à [compteur v]
 
end
 
end
 +
ajouter (résultat) à [mots v]
 
</scratchblocks>
 
</scratchblocks>
  
Ca marche ! Vous n'avez qu'à tester ;)
+
Ça marche ! Vous n'avez qu'à tester ;)
 +
 
 +
{{Projet|527712547}}
  
Bon, le problème, c'est que ça ne stocke que le premier mot. On va corriger ça.
+
== Utilisation ==
  
=== Autres mots ===
+
Une utilisation très fréquente de cette technique est le déchiffrement des [[Liste_cloud_(tutoriel)|listes cloud]].
  
Une autre boucle va être nécessaire ici. Elle va permettre de répéter l'action ''x'' + 1 '''autant de fois qu'il y a de lettres'''.
 
  
'''''En cours d'écriture'''''
 
 
{{Tuto}}
 
{{Tuto}}

Version actuelle datée du 25 mai 2021 à 16:49


Séparer les mots d'une suite de caractères


Hey !

Vous avez compris le titre ? Non ? Ah bon.

Disons que dans ce tuto, nous allons prendre une suite de caractères (par exemple, « ceci est une suite de caractères », bref un texte) et nous allons mettre chaque mot de cette suite dans une liste. Ça peut sembler inutile, mais je vous assure qu'on peut en avoir besoin alors autant savoir le faire !

Principe

Normalement, votre texte contient plusieurs mots. Si ces derniers sont séparés par une espace (ce qui est assez courant, non ?) il va falloir que le script repère ceux-ci. Il doit donc parcourir le texte lettre par lettre en stockant celles-ci jusqu'à arriver à une espace, transférer alors les lettres stockées jusque-là et qui forment un mot dans une liste, puis recommencer jusqu'à la fin du texte.

Création du script

Les variables

C'était prévisible, il faut des variables. Voilà celles que vous devrez créer :

(compteur) // servira à indiquer quelle lettre du texte il faut examiner
(résultat) // servira à stocker les lettres examinées
(mots :: list) // la liste dans laquelle seront mis tous les mots obtenus

Lettre par lettre

Nous devons créer un script qui va tester lettre par lettre le texte. D'abord la première, puis la deuxième, la troisième, etc. Tant qu'il ne s'agit pas d'une espace, il la place dans la variable résultat et continue. Vous allez comprendre. Prenons comme exemple la phrase = « Bonjour ami scratcheur ». Donc, avec cette phrase exemple, résultat doit valoir « Bonjour » après la première espace.

Voilà un petit tableau pour comprendre l'utilité de compteur.

compteur lettre correspondante résultat
1 B B
2 o B + o = Bo
3 n Bo + n = Bon
4 j Bon + j = Bonj
5 o Bonj + o = Bonjo
6 u Bonjo + u = Bonjou
7 r Bonjou + r = Bonjour

compteur commence à 1 et augmente de 1 à chaque fois. Ah, avec compteur = 8, vous tombez sur une espace. C'est donc la fin du mot.

ajouter (1) à [compteur v]

Le script va se répéter lettre par lettre jusqu'à la fin du texte. Il nous faut donc une boucle et nous avons donc besoin du bloc longueur de () qui donne le nombre de caractères dans une chaîne donnée.

répéter (longueur de [Bonjour ami scratcheur]) fois
ajouter (1) à [compteur v]

Nous allons utiliser le bloc lettre () de () pour indiquer au script quel caractère du texte examiner. Si on regarde le tableau, la deuxième colonne correspond à :

(lettre (compteur) de [Bonjour ami scratcheur])

Soit ce caractère est une espace, soit ce n'en est pas un. Il nous faut donc le bloc Si () alors sinon pour que le script décide quoi faire ensuite selon le cas.

répéter (longueur de [Bonjour ami scratcheur]) fois
si <(lettre (compteur) de [Bonjour ami scratcheur]) = [ ]> alors
sinon
fin
ajouter (1) à [compteur v]

Nous allons maintenant utiliser le bloc regrouper () et () pour ajouter le caractère à la variable résultat dans le cas où ce n'est pas une espace.

répéter (longueur de [Bonjour ami scratcheur]) fois
si <(lettre (compteur) de [Bonjour ami scratcheur]) = [ ]> alors
sinon
mettre [résultat v] à (regrouper (résultat) et (lettre (compteur) de [Bonjour ami scratcheur]))
fin
ajouter (1) à [compteur v]

Par contre, dans le cas où le caractère examiné est une espace, il faut transférer le contenu de la variable dans la liste avant de la réinitialiser. Sans oublier de transférer une dernière fois le contenu de la variable lorsque le script arrive en fin de texte parce qu'en général un texte ne se termine pas par une espace.

répéter (longueur de [Bonjour ami scratcheur]) fois
si <(lettre (compteur) de [Bonjour ami scratcheur]) = [ ]> alors
ajouter (résultat) à [mots v]
mettre [résultat v] à []
sinon
mettre [résultat v] à (regrouper (résultat) et (lettre (compteur) de [Bonjour ami scratcheur]))
fin
ajouter (1) à [compteur v]
end
ajouter (résultat) à [mots v]

Il ne reste qu'à ajouter les blocs d'initialisation des variables :

supprimer tous les éléments de la liste [mots v]
mettre [résultat v] à []
mettre [compteur v] à [1]
répéter (longueur de [Bonjour ami scratcheur]) fois
si <(lettre (compteur) de [Bonjour ami scratcheur]) = [ ]> alors
ajouter (résultat) à [mots v]
mettre [résultat v] à []
sinon
mettre [résultat v] à (regrouper (résultat) et (lettre (compteur) de [Bonjour ami scratcheur]))
fin
ajouter (1) à [compteur v]
end
ajouter (résultat) à [mots v]

Ça marche ! Vous n'avez qu'à tester ;)


Utilisation

Une utilisation très fréquente de cette technique est le déchiffrement des listes cloud.


Cet article fait partie de la catégorie des tutos
Tous les articles de cette catégorie :
Les cookies nous aident à fournir nos services. En utilisant nos services, vous acceptez notre utilisation des cookies.