Page 1 sur 1
[R] Comparaison de variable
Posté : dim. 27 juil. 2014 02:16
par lacnia
Bonsoir tout le monde ! ( Bonjour s'il fait jour )
Alors voila, un problème tout bête me bloque ces derniers temps, la comparaison de variable :
Code : Tout sélectionner
$a = "Je suis un chat et je n'aime pas les chiens !"
$b = "Je suis un chient et je n'aime pas les chats !"
J'aimerais par exemple qu'une fonction miracle compare ses deux variables et me retourne 1 s'il détecte un point commun de plus de x caractères (disons 10), ici il y aurait deux point commun par exemple, "Je suis un " et " et je n'aime pas les ".
Quelqu'un ne connaitrait pas par hasard un UDF proposant cette fameuse fonction miracle ?

Re: [..] Comparaison de variable
Posté : dim. 27 juil. 2014 04:34
par jchd
Voir peut-être
de ce côté-là à appliquer récursivement. Je ne citerai aucun nom de peur de voir mikell ramener sa fraise pour m'infliger des supplices inavouables

Re: [..] Comparaison de variable
Posté : dim. 27 juil. 2014 11:09
par mikell
jc tu n'as aucune pitié pour les non-matheux
ça veut dire quoi B(j) ? blowjob ?
@lacnia
En fait il y a bien plus de 2 solutions dans ton exemple
► Afficher le texte
Code : Tout sélectionner
$a = "Je suis un chat et je n'aime pas les chiens !"
$b = "Je suis un chient et je n'aime pas les chats !"
$x = 10
$res = ""
For $i = 1 to StringLen($a)-$x
$str = StringMid($a, $i, $x)
If StringInStr($b, $str) Then $res &= $str & @crlf
Next
Msgbox(0,"", $res)
Maintenant si tu veux plus de précisions dans la chaîne de plus de x caractères (par exemple qu'elle ne contienne que des mots entiers) il faut affiner
► Afficher le texte
Code : Tout sélectionner
$a = "Je suis un chat et je n'aime pas les chiens !"
$b = "Je suis un chien et je n'aime pas les chats !"
_Compare($a, $b, 10)
Func _Compare($str1, $str2, $x)
Local $test, $tmp = "", $res = ""
For $i = 0 to StringLen($str1)-$x
$test = StringRegExp($str1, '^.{' & $i & '}\s*\b([^''].{'& $x-1 & '}\S*)', 3)
If IsArray($test) and $test[0] <> $tmp Then
If StringRegExp($str2, '\b\Q' & $test[0] & '\E\b') Then $res &= $test[0] & @crlf
$tmp = $test[0]
EndIf
Next
If $res <> "" Then Return Msgbox(0,"", $res)
Return 0
EndFunc
Ces codes sont très faciles à adapter pour retourner un booléen
Re: [..] Comparaison de variable
Posté : dim. 27 juil. 2014 16:50
par lacnia
Merci pour vos réponse, je vais tester sa en rentrant !
PS : jchd je ne comprends pas trop cet algorithme x)
Re: [R] Comparaison de variable
Posté : lun. 28 juil. 2014 16:33
par jchd
Laisse tomber, c'est une approche un peu byzantine pour tes besoins.
Essaye ceci :
► Afficher le texte
Code : Tout sélectionner
Local $a = "Alors voici la vérité : je suis un chat et je n'aime pas les chiens, mais alors pas du tout du tout !"
Local $b = "Je suis un chien et je n'aime pas du tout les chats, voilà la vérité !"
Local $x = 10
Local $min = $a, $max = $b, $swapped = False
If StringLen($a) > StringLen($b) Then
$min = $b
$max = $a
$swapped = True
EndIf
_ConsoleWrite("Chaîne 1 : <" & $min & ">" & @LF)
_ConsoleWrite("Chaîne 2 : <" & $max & ">" & @LF & @LF)
;~ Local $res[0][3] ; peut recevoir les résultats
Local $pos[3]
Local $sub, $j, $iPosInMax, $match
For $i = 1 to StringLen($min) - $x
$sub = StringMid($min, $i, $x)
$iPosInMax = StringInStr($max, $sub)
If $iPosInMax Then
; on a trouvé une correspondance de longueur $x
; cherchons la correspondance maximum
$j = 0
While StringInStr($max, StringMid($min, $i, $x + $j + 1), Default, 1, $iPosInMax)
$j += 1
WEnd
$match = StringMid($min, $i, $x + $j)
_ConsoleWrite('La chaîne "' & $match & _
'" figure en position ' & StringInStr($min, $match) & ' de la chaîne ' & ($swapped ? 1 : 2) & _
' et en position ' & StringInStr($max, $match) & ' de la chaîne ' & ($swapped ? 2 : 1) & @LF)
$i += $j
EndIf
Next
;~ _ArrayDisplay($res)
Func _ConsoleWrite($s)
ConsoleWrite(BinaryToString(StringToBinary($s, 4), 1))
EndFunc