Page 1 sur 1
[R] Occurence
Posté : jeu. 07 août 2014 20:12
par sozary
Bonjour à tous!
Pour la réalisation de l'algorithme de Huffman, je nécessiterais l’occurrence des lettres dans une phrase, tel que:
--> Phrase: salut a toi
tableau occurrence: S:1; A:2; L:1; U:1; T: 2; O:1; I:1.
Y a il une fonction qui existe déjà? Merci d'avance!
Re: [..] Occurence
Posté : jeu. 07 août 2014 22:35
par timmalos
Voici une fonction qui retourne le nombre de fois qu'un caractère est trouvé dans une chaine (Insensible à la case contrairement à StringSplit)
Il vous suffira de créer un tableau contenant tous les caractères que vous souhaitez calculer les occurences (Uniquement les 26 lettres de l'alphabet dans votre cas) et d'appeler cette fonction pour chacune.
Code : Tout sélectionner
Func _Occurrence($s_text, $s_char)
Return StringLen($s_text) - StringLen(StringReplace($s_text, $s_char, ''))
EndFunc ;==>_Occurrence1
Re: [..] Occurence
Posté : jeu. 07 août 2014 22:49
par PandiPanda
Bonsoir,
Il manquerai l'espace non ?
j'ai fait ceci vite fait ...
► Afficher le texte
Code : Tout sélectionner
#include <Array.au3>
Local $s = 'salut a toi'
Local $res = getArray($s)
_ArrayDisplay($res)
Func getArray($str)
Local $map = ObjCreate("Scripting.Dictionary")
Local $res = ""
Local $arr = StringSplit($str,"",3)
For $i = 0 To UBound($arr)-1
If $map.Exists($arr[$i]) Then
$map.Item($arr[$i]) += 1
Else
$map.ADD($arr[$i],1)
$res&=$arr[$i]&Chr(0)
EndIf
Next
Local $tmp = StringSplit(StringTrimRight($res,1),chr(0),3)
Local $final[UBound($tmp)][2]
For $i = 0 To UBound($tmp)-1
$final[$i][0] = $tmp[$i]
$final[$i][1] = $map.Item($tmp[$i])
Next
Return $final
EndFunc
Re: [..] Occurence
Posté : jeu. 07 août 2014 22:50
par mikell
► Afficher le texte
Code : Tout sélectionner
#include <Array.au3>
$string = "salut a toi mon ami"
$array = _Occurences($string)
_ArrayDisplay($array)
Func _Occurences($str)
Local $txt = StringLower(StringStripWS($str, 8))
Local $res[StringLen($txt)][2], $n = 1, $a
While 1
$a = StringSplit($txt, "")
$txt = StringReplace($txt, $a[1], "")
$res[$n-1][0] = $a[1]
$res[$n-1][1] = @extended
If $txt = "" Then ExitLoop
$n += 1
Wend
Redim $res[$n][2]
Return $res
EndFunc

Re: [..] Occurence
Posté : ven. 08 août 2014 00:02
par jguinch
Même principe, à peine différent :
► Afficher le texte
Code : Tout sélectionner
#Include <Array.au3>
$string = "Salut a toi mon ami !"
$array = _Occurences($string)
_ArrayDisplay($array)
Func _Occurences($sText)
Local $aLetters[0][2], $sLetter, $iCount
While $sText <> ""
$sLetter = StringLeft($sText, 1)
$sText = StringReplace($sText, $sLetter, "", 0, 1)
$iCount = @Extended
Redim $aLetters[ UBound($aLetters) + 1][2]
$aLetters[ UBound($aLetters) - 1][0] = $sLetter
$aLetters[ UBound($aLetters) - 1][1] = $iCount
WEnd
Return $aLetters
EndFunc
Edit : en fait, je viens de m'apercevoir que mon code est quasiment le même que le tien Mikell !

Re: [..] Occurence
Posté : ven. 08 août 2014 01:01
par orax
► Afficher le texte???
Code : Tout sélectionner
#include <Array.au3>
$string = "salut à toi mon ami α"
$occ = _Occurrence($string & @CRLF)
_ArrayDisplay($occ)
$occ_a = $occ[AscW("a")]
$occ_alpha = $occ[AscW("α")]
ConsoleWrite($occ_a & @CRLF)
ConsoleWrite($occ_alpha & @CRLF)
Func _Occurrence($s_text)
Local $occurences[0xFFFF]
For $i = 1 To StringLen($s_text)
$c = StringMid($s_text, $i, 1)
$occurences[AscW($c)] += 1
Next
Return $occurences
EndFunc ;==>_Occurrence
Arfff !! Visiblement le mien ne semble pas bien rapide… 
Re: [..] Occurence
Posté : ven. 08 août 2014 10:20
par sozary
Ah! Merci à tous pour vos réponses! J'ai pris le code de jguinch car c'est celui que j'ai le mieux compris! Par contre le code d'Orax, j'ai vraiment rien compris, mais bon, c'est l'intention qui compte

!
Merci encore!
Re: [R] Occurence
Posté : ven. 08 août 2014 15:28
par jguinch
Autre variante avec tri intégré (croissant par nombre d'occurences)
► Afficher le texte
Code : Tout sélectionner
#Include <Array.au3> ; Uniquement pour _ArrayDisplay
$string = "Salut a toi mon ami ! Comment ça va chez toi ?"
$array = _Occurences($string, 1)
_ArrayDisplay($array)
Func _Occurences($sText, $iOrder = 0)
Local $aLetters[1][2] = [[ 0 ]], $sLetter, $iCount
While $sText <> ""
$sLetter = StringLeft($sText, 1)
$sText = StringReplace($sText, $sLetter, "", 0, 1)
$iCount = @Extended
Redim $aLetters[ UBound($aLetters) + 1][2]
If $iOrder Then
For $i = UBound($aLetters) - 1 To 1 Step -1
If $aLetters[$i - 1][1] > $iCount Then
$aLetters[$i][0] = $aLetters[$i - 1][0]
$aLetters[$i][1] = $aLetters[$i - 1][1]
Else
$aLetters[$i][0] = $sLetter
$aLetters[$i][1] = $iCount
ExitLoop
EndIf
Next
Else
$aLetters[ UBound($aLetters) - 1][0] = $sLetter
$aLetters[ UBound($aLetters) - 1][1] = $iCount
EndIf
WEnd
$aLetters[0][0] = UBound($aLetters) - 1
Return $aLetters
EndFunc