Seuls les membres ayant 30 points peuvent parler sur le chat.

Forum Casio - Autres questions


Index du Forum » Autres questions » compter le nombre de caractere dans une Str
Ti.du.du39 Hors ligne Membre de CreativeCalc Points: 1290 Défis: 0 Message

compter le nombre de caractere dans une Str

Posté le 11/09/2015 07:33

Pour un programme de décodage Vigenère sans la clé, j'aurai de savoir le caractère specifique qui revient le plus souvent dans une Str

Merci d'avance:)


Dark storm En ligne Membre d'honneur Points: 11090 Défis: 176 Message

Citer : Posté le 11/09/2015 07:41 | #


Fait un sous programme :

"A…Z"→Str 20
For 1→A To 26
0→List 1[A]
Next
For 1→A to StrLen(Str 1)
StrSrc(Str 20, StrMid(Str 1, A, 1))→C
List 1[C]+1->List 1[C]
Next
// Y'a plus qu'à chercher le max dans la liste ;)

Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Totoyo Hors ligne Membre d'honneur Points: 15989 Défis: 102 Message

Citer : Posté le 11/09/2015 09:21 | #


DS, t'as pas honte
For 1→A To 26
0→List 1[A]
Next

A remplacer par :
26->Dim List 1


Je te propose ma version qui renvoie le caractère le plus utilisé (variable D).
Petite précision, dans la situation où deux caractères apparaissent le même nombre de fois, celui qui est le plus proche de A (à vérifier) est renvoyé par l'algorithme.
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"→Str 20
Seq(.01X,X,1,26,1)→List 1
For 1→A to StrLen(Str 1)
StrSrc(Str 20, StrMid(Str 1, A, 1))→C
List 1[C]+1→List 1[C]
Next
100 Frac Max List 1->D


Voici une version qui renvoie en cas d'égalité tous les caractères (dans la liste 2):
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"→Str 20
Seq(.01X,X,1,26,1)→List 1
For 1→A to StrLen(Str 1)
StrSrc(Str 20, StrMid(Str 1, A, 1))→C
List 1[C]+1→List 1[C]
Next
SortD(List 1
Sum(Int List 1 = Int List 1[1->B
1->Dim List 2
For 1->A To B
100Frac List 1[A->List 2[A
Next

Remiweb Hors ligne Membre de CreativeCalc Points: 1040 Défis: 32 Message

Citer : Posté le 11/09/2015 17:23 | #


Je met permet d'expliquer un peu le code puisqu'il y a de bonnes astuces et que ça pourra resservir

Pour Dark Storm :
- On créer une liste de longueur 26, chaque case correspondant à une lettre (case 1->A, case 2->B, ... , case 26->Z)
- On regarde ensuite les caractères de la chaîne 1 à 1 avec StrMid :
Pour chaque caractère on regarde sa position dans l'alphabet, ce qui revient à regarder où il se trouve dans la chaine "ABCDEFGHIJKLMNOPQRSTUVWXYZ" avec StrSrc.
Puis on incrémente la case correspondante dans notre liste. Si on avait récupéré un E par exemple, sa position dans la chaine vaut 5 donc on incrément la 5e case de notre liste.

A la fin on sait donc combien de fois apparaît chaque caractère.
Le problème c'est que ça ne nous donne pas directement lequel est le plus présent.
On ne peut pas utiliser Max(List 1) qui retournerait la valeur maximale se trouvant dans la liste, donc combien de fois apparaît le caractère qui revient le plus souvent.


D'où l'intérêt de la modification de Totoyo :
- Au lieu d'avoir une liste vide au départ, on crée une liste de la forme :
{0.01 , 0.02 , 0.03 , ... , 0.26} avec la fonction Seq()
- Pour la suite on procède pareil qu'avant, on compte le nombre d'apparition de chaque caractère et on augmente la case correspondante de 1 en 1.
Chaque case garde donc la valeur après la virgule qu'on lui a donné au début.
Quand on récupère la case ayant la plus grosse valeur avec Max(List) ce qui se trouve après la virgule nous informe donc de quelle lettre il s'agit.
Par exemple si c'est la 5e lettre (soit le E) qui est la plus présente avec 12 apparitions ça retourne 12.05
Tweaks : ||||| ||||
Dark storm En ligne Membre d'honneur Points: 11090 Défis: 176 Message

Citer : Posté le 11/09/2015 17:43 | #


J'aime bien l'astuce de Totoyo, qui est bien plus complète et exploitable que la mienne
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Ti.du.du39 Hors ligne Membre de CreativeCalc Points: 1290 Défis: 0 Message

Citer : Posté le 13/09/2015 08:22 | #


Oui, je l'ai utilisé, je te citerai dans la description du prog et pour récupérer la valeur,on doit garder que la partie décimale ?
Int D->E
D-E->D
D*100->D

" L'Homme prouve son intelligence en innovant dans la connerie "
Totoyo Hors ligne Membre d'honneur Points: 15989 Défis: 102 Message

Citer : Posté le 13/09/2015 09:06 | #


C'est bien cela, c'est que la partie décimale.
Utilise Frac
100Max List 1→D


(j'ai édité le code)

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
Pour coloriser votre code, cliquez ici.
Sinon cliquez sur le bouton ci-dessous.
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2020 | Il y a 48 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

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