[R] Compter et trié un string

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
ultimateheadcenter
Niveau 2
Niveau 2
Messages : 21
Enregistré le : sam. 30 juil. 2016 15:35
Status : Hors ligne

[R] Compter et trié un string

#1

Message 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 :)
Modifié en dernier par ultimateheadcenter le jeu. 04 août 2016 00:46, modifié 1 fois.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: Compter et trié un string  

#2

Message 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)
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
ultimateheadcenter
Niveau 2
Niveau 2
Messages : 21
Enregistré le : sam. 30 juil. 2016 15:35
Status : Hors ligne

Re: Compter et trié un string

#3

Message par ultimateheadcenter »

Wow je n'aurais jamais trouver tout ça tout seul :!: 8)
merci ! tout fonctionne comme sur des des roulettes !
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2282
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R]Compter et trié un string

#4

Message par jchd »

$nbPos = @extended + 1
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
ultimateheadcenter
Niveau 2
Niveau 2
Messages : 21
Enregistré le : sam. 30 juil. 2016 15:35
Status : Hors ligne

Re: [R]Compter et trié un string

#5

Message 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
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R]Compter et trié un string

#6

Message 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:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [R]Compter et trié un string

#7

Message par jguinch »

Pourquoi ajouter 1 à @extended ? La chaine se termine par un |...
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2282
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Compter et trié un string

#8

Message par jchd »

Oops. Y a-t-il un ophtalmo dans la salle ?
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [R] Compter et trié un string

#9

Message 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
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [R] Compter et trié un string

#10

Message 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. ^^
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
ultimateheadcenter
Niveau 2
Niveau 2
Messages : 21
Enregistré le : sam. 30 juil. 2016 15:35
Status : Hors ligne

Re: [R] Compter et trié un string

#11

Message par ultimateheadcenter »

Je vais rester sur la toute première proposition qui me parait la plus simple a comprendre, merci beaucoup à tout le monde !
Répondre