Page 1 sur 1
Comparaison de 2 chaines & limitation à 63 caracteres
Publié : lun. 15/juin/2009 13:42
par Ganagyre
Bonjour.
Avec le code suivant, je compare 2 chaines de caractères ne contenant que des 1 ou 0.
Ensuite je fait le compte des "positions" commune des valeurs 1.
Je butte sur une limitation de 63 caractères .
Comment proceder pour aller jusqu'à 100 caractères en 1 seul passage ?
Code : Tout sélectionner
;
;Chaines de caractères longues de 63
; = 1 2 3 4 5 6 7
; = 1234567890123456789012345678901234567890123456789012345678901234567890
Valeur1.s = "100101010100110101010101010101111111111101010101010000000000011"
Valeur2.s = "100000000000000000000000000000000000000100000000000000000001001"
test.d = Val("%"+Valeur1) & Val("%"+Valeur2)
; nombre de 1 Communs entre Valleur1 & Valeurs2
Resultat.d = CountString(Bin(test),"1")
; nombre de 1 Communs entre Valeur1 & Valeurs2
resulte.d = CountString(Bin(Val("%"+Valeur1) & Val("%"+Valeur2)),"1")
;
Debug"Longueur Chaine Valeur1 = " + Str(Len(Valeur1))
Debug"Longueur Chaine Valeur2 = " + Str(Len(Valeur2))
Debug"======================================================================="
Debug Valeur1
Debug Valeur2
Debug Bin(test)
Debug "Communs au 2 Chaines = " +Str(Resultat)
Debug "Communs au 2 Chaines (formule) = " +Str(resulte)
Debug"======================================================================="
Debug Val("%"+Valeur1)
Debug Val("%"+Valeur2)
Debug test
Debug"======================================================================="
Debug Bin(Val("%"+Valeur1)) ; Bin Valeur1
Debug Bin(Val("%"+Valeur2)) ; Bin Valeur2
Debug Bin(test)
Debug"======================================================================="
Publié : lun. 15/juin/2009 14:09
par Cool Dji
Salut,
J'ai pas de solutions en un seul passage, désolé
Pour faire ça, j'utiliserai la méthode lourde

,
Je pense que tu connais mais zaucazou :
Code : Tout sélectionner
nombre de 1 communs=0
for i = 1 to 100
If (Mid(Text1$,i,1)=Mid(Texte2$,i,1)) and (Mid(Text1$,i,1)='1')
;ce sont les 2 des 1
nombre de 1 communs+1
endif
next
Pas forcément classe

, mais l'essentiel n'est pas toujours dans l'apparence

(ça m'arrange bien de dire ça

)
Publié : lun. 15/juin/2009 14:15
par cha0s
-premièrement tu utilise des flottant pour calculer des entier.
-je voie pas en quoi tu est limité a 63 caractères
-une autre façon de voir :
Code : Tout sélectionner
EnableExplicit
Define n.w, result.w
#Valeur1 = "10010101010011010101010101010111111111110101010101000000000001100000000000000001111111111111111111110"
#Valeur2 = "10000000000000000000000000000000000000010000000000000000000100100000000000000000000000000000010000000"
For n = 1 To Len(#Valeur1)
If Mid(#Valeur1, n, 1) = "1" And Mid(#Valeur1, n, 1) = Mid(#Valeur2, n, 1)
result+1
EndIf
Next n
Debug "Occurence : " + Str(result)
Debug "Taille : " + Str(Len(#Valeur1))
Edit : je suis trop lent :p
Publié : lun. 15/juin/2009 14:30
par Cool Dji
cha0s a écrit :Edit : je suis trop lent :p
cha0s, t'as pris le temps de faire un joli code

Publié : lun. 15/juin/2009 14:33
par cha0s
Cool Dji a écrit :chaos a écrit :Edit : je suis trop lent :p
cha0s, t'as pris le temps de faire un joli code

Je suis surtout très maniaque sur le code ! (pas comme sur le français ^^')
Publié : lun. 15/juin/2009 15:06
par Backup
cha0s a écrit :
Code : Tout sélectionner
If Mid(#Valeur1, n, 1) = "1" And Mid(#Valeur1, n, 1) = Mid(#Valeur2, n, 1)
tu pouvais faire ça aussi
ou ça :
Publié : lun. 15/juin/2009 15:07
par Cool Dji
cha0s a écrit :Je suis surtout très maniaque sur le code !
T'inquiète, ça doit se soigner

Publié : lun. 15/juin/2009 19:00
par erix14
Voici une solution qui utilise les pointeurs pour éviter la fonction Mid, cela permet de gagner énormément de temps CPU.
Code : Tout sélectionner
EnableExplicit
Define Valeur1.s, Valeur2.s, *Char1.Character, *Char2.Character, result.w
Valeur1 = "10010101010011010101010101010111111111110101010101000000000001100000000000000001111111111111111111110"
Valeur2 = "10000000000000000000000000000000000000010000000000000000000100100000000000000000000000000000010000000"
*Char1 = @Valeur1
*Char2 = @Valeur2
result = 0
Repeat
If(*Char1\c='1' And *Char2\c='1') : result+1 : EndIf
*Char1+1 : *Char2+1
Until Not *Char1\c Or Not *Char2\c
Debug "Occurence : " + Str(result)
Debug "Taille : " + Str(*Char1-@Valeur1)
Publié : mar. 16/juin/2009 13:04
par Ganagyre
Merci à tous pour vos exemples.
Apres un petit moment à triturer le tout, et moult reflexions une autre possibilité :
Code : Tout sélectionner
;
T1.s = "10010101010011010101010101010111111111110101010101000000000001100000000000000001000001000000010000011"
T2.s = "10000000000000000000000000000000000111010000000000000000000100100000000000000000000000000000010000001"
Debug T1
Debug T2
Debug"====================================================================================================="
T1 = T2
Debug T1
Resultat.w = CountString(T1,"1")
Debug"====================================================================================================="
Debug"Resultat : " + Str(Resultat)
Simple et efficace, dans ce cas de figure.
Publié : mar. 16/juin/2009 13:31
par Backup
@Ganagyre : excellent !!

Publié : mar. 16/juin/2009 13:47
par Cool Dji
Ganagyre a écrit :Merci à tous pour vos exemples.
Apres un petit moment à triturer le tout, et moult reflexions une autre possibilité :
Code : Tout sélectionner
;
T1.s = "10010101010011010101010101010111111111110101010101000000000001100000000000000001000001000000010000011"
T2.s = "10000000000000000000000000000000000111010000000000000000000100100000000000000000000000000000010000001"
Debug T1
Debug T2
Debug"====================================================================================================="
T1 = T2
Debug T1
Resultat.w = CountString(T1,"1")
Debug"====================================================================================================="
Debug"Resultat : " + Str(Resultat)
Simple et efficace, dans ce cas de figure.
Comprends-pas !!
T'as pas le nombre de 1 commun entre T1 et T2 avec ton truc...
Tu as juste compter le nombre de 1 dans T1, non
Bon, si c'est pas ça, je vais faire la sieste

Publié : mar. 16/juin/2009 15:08
par Backup
HA bah oui !!
Code : Tout sélectionner
T1 = T2 ; tu met T2 dans T1
Debug T1
Resultat.w = CountString(T1,"1") ; tu teste seulement T1 !!
pffff ! je fatigue moi , j'avais meme pas vu la bourde !!

Publié : mer. 17/juin/2009 13:09
par Ganagyre
Mince !
en effet : AND est un ET logique (binaire) cet opérateur ne peut être utilisé avec une variable de type chaine.
a.w = %1000 & %0101 ; Le résultat sera 0
b.w = %1100 & %1010 ; Le résutlat sera %1000
bits = a & b ; Effectue un ET bit à bit entre a et b et utilise le résultat avec l'opérateur =
a & b ; Effectue un ET bit à bit entre a et b et place le résultat directement dans la variable "a"
Apparement on ne peu dépasser une chaine de 62 Caracteres transcodé en binaire pour faire une comparaison.
Code : Tout sélectionner
; Chaines de caracteres longues de 62 caracteres
; = 1 2 3 4 5 6 7
; = 1234567890123456789012345678901234567890123456789012345678901234567890
Valeur1.s = "10010101010011010101010101010111111111110101010101000000000001"
Valeur2.s = "10000000000000001000000010000010010000010000000000000000000001"
test = Val("%"+Valeur1) & Val("%"+Valeur2)
; nombre de 1 Communs entre Valleur1 & Valeurs2
Resultat.w = CountString(Bin(test),"1")
; nombre de 1 Communs entre Valeur1 & Valeurs2
resulte.w = CountString(Bin(Val("%"+Valeur1) & Val("%"+Valeur2)),"1")
Debug"======================================================================="
Debug"Longueur Chaine Valeur1 = " + Str(Len(Valeur1))
Debug"Longueur Chaine Valeur2 = " + Str(Len(Valeur2))
Debug"======================================================================="
Debug Valeur1
Debug Valeur2
Debug Bin(test)
Debug "Communs au 2 Chaines = " +Str(Resultat)
Debug "Communs au 2 Chaines (formule) = " +Str(resulte)
Debug"======================================================================="
Debug Val("%"+Valeur1)
Debug Val("%"+Valeur2)
Debug test
Debug"======================================================================="
Debug Bin(Val("%"+Valeur1)) ; Bin Valeur1
Debug Bin(Val("%"+Valeur2)) ; Bin Valeur2
Debug Bin(test)
Debug"======================================================================="
En mettant :
Valeur1.s = "100101010100110101010101010101111111111101010101010000000000001"
Valeur2.s = "100000000000000010000000100000100100000100000000000000000000001"
La comparaison ne fonctionne plus .
Reste la solution de couper les chaines à comparer pour faire un seul passage sans boucle.