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 :
StringReplace($newstring, "|", "")
$nbPos = @extended
ConsoleWrite("Nombre de positions : " & $nbPos & @CRLF)

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 :!: 8)
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 :wink:

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 :!: 8)
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   ;==>_ex


Func _1($string)
   Local $str = StringRegExpReplace($string, "(\d+;\d+\|)(?=\1)", "")
   StringReplace($str, "|", "")
   Return SetExtended(@extended, $str)
EndFunc   ;==>_1

Func _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   ;==>_2

Func _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é :
#include <array.au3>

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|"
If StringRight($string, 1) = "|" Then $string = StringTrimRight($string, 1)

Local $aArrayUnique = _ArrayUnique(StringSplit($string, "|"))
_ArrayDisplay($aArrayUnique)
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 !