Page 1 sur 1
[R] Compter et trié un string
Posté : mer. 03 août 2016 23:58
par ultimateheadcenter
Bonjour, je m'explique,
j'ai une liste comme celle ci : 0;1|0;1|0;2|1;2|1;2|2;2|2;2|3;2|3;2|4;2|4;2|5;2|5;2|6;2|6;2|7;2|7;2|8;2|8;2|9;2|9;3|10;3|10;4|10;4|10;5|10;5|10;6|10;6|10;7|10;7|10;8|10;8|10;9|10;9|10;10|
j'aimerais :
1 - enlever tous les doubles
2-compter le nombre total de positions (entre les | )
quelle est la meilleure solution ? une fonction en particulier peut faire ça rapidement ?
Merci d'avance et bonne soirée

Re: Compter et trié un string
Posté : jeu. 04 août 2016 00:24
par jguinch
Pour la suppression des doublons, tu peux utiliser une expression régulière de ce type (si les données sont triées comme dans ton exemple) :
$string = "0;1|0;1|0;2|1;2|1;2|2;2|2;2|3;2|3;2|4;2|4;2|5;2|5;2|6;2|6;2|7;2|7;2|8;2|8;2|9;2|9;3|10;3|10;4|10;4|10;5|10;5|10;6|10;6|10;7|10;7|10;8|10;8|10;9|10;9|10;10|"$newstring = StringRegExpReplace($string, "(\d+;\d+\|)(?=\1)", "")ConsoleWrite($string & @CRLF)ConsoleWrite($newstring)
Si les données ne sont pas triées, utilise l'expression suivante avec StringRegExpReplace :
((?<=^|\|)\d+;\d+\|)(?=(?1)*\1)
Pour compter le nom de "positions", il y a plusieurs méthodes. Celle à laquelle je pense est de compter le nombre de | tout simplement :
Re: Compter et trié un string
Posté : jeu. 04 août 2016 00:46
par ultimateheadcenter
Wow je n'aurais jamais trouver tout ça tout seul
merci ! tout fonctionne comme sur des des roulettes !
Re: [R]Compter et trié un string
Posté : jeu. 04 août 2016 06:05
par jchd
$nbPos = @extended + 1
Re: [R]Compter et trié un string
Posté : jeu. 04 août 2016 07:35
par ultimateheadcenter
Oui en effet j'ai moi même rajouté le +1
En passant, auriez vous une idée pour calculer la distance que sépare E de S ?
A vol d'oiseau sans compter les 0 etc ?
Car sur ce coup j'en ai AUCUNE idée oO
(oops mauvais sujet d'aide) sa se passe ici du coup
autre aide
Re: [R]Compter et trié un string
Posté : jeu. 04 août 2016 08:01
par mikell
Si c'est du vol d'oiseau ça sent le théorème de Pythagore
Merci de faire des ensembles [sujet/titre de sujet/questions posées dans le sujet] cohérents

Re: [R]Compter et trié un string
Posté : jeu. 04 août 2016 08:06
par jguinch
Pourquoi ajouter 1 à @extended ? La chaine se termine par un |...
Re: [R] Compter et trié un string
Posté : jeu. 04 août 2016 12:05
par jchd
Oops. Y a-t-il un ophtalmo dans la salle ?
Re: [R] Compter et trié un string
Posté : jeu. 04 août 2016 14:51
par orax
ultimateheadcenter a écrit :Wow je n'aurais jamais trouver tout ça tout seul

Il est aussi possible de faire ça d'une façon plus basique avec des fonctions simples. Mais c'est moins
jguinchesque (comme dirait mikell) et le temps d'exécution est plus élevé.
Juste pour l'exemple :
_ex
()Func _ex
() Local $newstring, $newstring2, $newstring3 Local $string = "0;1|0;1|0;2|1;2|1;2|2;2|2;2|3;2|3;2|4;2|4;2|5;2|5;2|6;2|6;2|7;2|7;2|8;2|8;2|9;2|9;3|10;3|10;4|10;4|10;5|10;5|10;6|10;6|10;7|10;7|10;8|10;8|10;9|10;9|10;10|" For $i = 1 To 10 $string &= $string Next ConsoleWrite("Longueur de la chaîne = " & StringLen($string) & @CRLF & @CRLF) ConsoleWrite("Durée d'exécution (en ms) :" & @CRLF) $t = TimerInit() $newstring = _1
($string) ConsoleWrite("_1 ($nbPos = " & @extended & ") : " & TimerDiff($t) & @CRLF) $t = TimerInit() $newstring2 = _2
($string) ConsoleWrite("_2 ($nbPos = " & @extended & ") : " & TimerDiff($t) & @CRLF) $t = TimerInit() $newstring3 = _3
($string) ConsoleWrite("_3 ($nbPos = " & @extended & ") : " & TimerDiff($t) & @CRLF);~ ConsoleWrite($string & @CRLF);~ ConsoleWrite($newstring & @CRLF);~ ConsoleWrite($newstring2 & @CRLF);~ ConsoleWrite($newstring3 & @CRLF) If Not ($newstring == $newstring2) Then ConsoleWriteError("! erreur (2)" & @CRLF) If Not ($newstring == $newstring3) Then ConsoleWriteError("! erreur (3)" & @CRLF)EndFunc ;==>_exFunc _1
($string) Local $str = StringRegExpReplace($string, "(\d+;\d+\|)(?=\1)", "") StringReplace($str, "|", "") Return SetExtended(@extended, $str)EndFunc ;==>_1Func _2
($string) Local $str, $nbPos = 0 Local $strSplit = StringSplit($string, "|") For $i = 1 To $strSplit[0] - 1 If $strSplit[$i] <> $strSplit[$i + 1] Then $str &= $strSplit[$i] & "|" $nbPos += 1 EndIf Next Return SetExtended($nbPos, $str)EndFunc ;==>_2Func _3
($string) Local $len = StringLen($string) Local $str, $prev, $current, $char, $start = 1, $nbPos = 0 While $start < $len $current = "" While 1 $char = StringMid($string, $start, 1) If $char = "|" Then ExitLoop $current &= $char $start += 1 WEnd If $prev <> $current Then $str &= $current & "|" $nbPos += 1 EndIf $prev = $current $start += 1 WEnd Return SetExtended($nbPos, $str)EndFunc ;==>_3
Re: [R] Compter et trié un string
Posté : jeu. 04 août 2016 17:03
par Tlem
Une autre possibilité :
Moins rapide que les fonctions 1 et 2, mais 2x plus rapide que la fonction 3.
Après comme les données sont en tableau, ça peux être pas mal pour le traitement suivant. ^^
Re: [R] Compter et trié un string
Posté : ven. 05 août 2016 13:47
par ultimateheadcenter
Je vais rester sur la toute première proposition qui me parait la plus simple a comprendre, merci beaucoup à tout le monde !