[RETO] CompWordsAlphabetically

Iniciado por Psyke1, 11 Marzo 2011, 10:44 AM

0 Miembros y 2 Visitantes están viendo este tema.

Edu

#10
Che Fran, me parece a mi o haces un tipo de trampa? xD es decir q es eso de dividir entre 2 xD?

@Karcrack fijate con esto a ver si anda tu funcion..


Private Sub Form_Load()

    Debug.Print kCompare("elfo", "elefante")
    Debug.Print kCompare("ave", "zorro")
    Debug.Print kCompare("hola", "")
    Debug.Print kCompare("zero", "zerocool")
    Debug.Print kCompare("feo", "    ")
    Debug.Print kCompare("frog", "frog")
    Debug.Print kCompare("faso", "fasa")
    Debug.Print kCompare("JOJO", "jojo")
   
   
End Sub

79137913

HOLA!!!

Cita de: XXX-ZERO-XXX en 11 Marzo 2011, 16:43 PM
Che *Fran :¬¬ :¬¬, me parece a mi o haces un tipo de trampa? xD es decir q es eso de dividir entre 2 xD?

*Nick PLZ...

Nah, no es trampa el tema es que lenb devuelve el espacio en memoria  que es igual a el doble de caracteres.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

Karcrack

@79137913:Reparado, habia un problema con la comprobación de tamaños :xD

raul338

Cita de: Karcrack en 11 Marzo 2011, 15:00 PM
Código (vb) [Seleccionar]

       If (Not Not b) = False Then
           ReDim b(-1 To 1)
           b(-1) = 1
           b(1) = 2
           b(0) = 3
       End If


Porque esa comprobacion? No es que ese array ya tiene algo :-/ lo inicializas de una y listo :P, o sino mas facil con Choose (aunque no se si mas rapido :P)

Edu


Karcrack

@raul338:Lo que hace esa linea If (Not Not b) = False Then es comprobar si el array ha sido rellenado... si no lo rellenará... No lo hago ni con un Choose() ni rellenando siempre el array por cuestión de velocidad.

raul338

Tramposo, no sabia que se podian hacer funciones estaticas :xD :xD

Psyke1

#17
Cita de: raul338 en 11 Marzo 2011, 22:33 PM
Tramposo, no sabia que se podian hacer funciones estaticas :xD :xD
Dije al principio que valía todo... :silbar:

ATENCIÓN : No tiene porque devolver los números del primer post!!!

Aquí dejo la mía:

Código (vb) [Seleccionar]

Option Explicit
Option Compare Text

Private Declare Function lstrcmpW Lib "kernel32.dll" (ByVal lpString1 As Long, ByVal lpString2 As Long) As Long

' -1 > Error
' 1  > Iguales
' 0  > primera palabra
' 2  > segunda palabra
Public Static Function CompareMrFrog(ByRef strWord1$, ByRef strWord2$) As Long
   If LenB(strWord1) = 0 Or LenB(strWord2) = 0 Then
       CompareMrFrog = -1
       Exit Function
   End If
   
   If strWord1 = strWord2 Then
       CompareMrFrog = 1
       Exit Function
   End If
   
   CompareMrFrog = lstrcmpW(StrPtr(strWord1), StrPtr(strWord2)) + 1
End Function


@Karcrack


DoEvents! :P

Karcrack


TRAMPOOOOOOOOSOOOOOO!!
Anda que modificar las normas a tu gusto... ya te vale :¬¬

Psyke1

#19
Jajajajaja :laugh:
Si te fijas, en ningún momento dije que debia que devolver esos números... :silbar: :-*

Tu función devuelve un resultado erróneo aquí:
   Debug.Print kCompare("feo", "    ")
Debería devolver la segunda y devuelve la primera... :rolleyes:

Ahora dejo mi versión 2:
Código (vb) [Seleccionar]
Option Explicit
Option Base 0

Private Declare Sub PutMem4 Lib "msvbvm60.dll" (ByVal Ptr As Long, ByVal Value As Long)
Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Ptr() As Any) As Long
Private Declare Function IsCharUpperW Lib "user32.dll" (ByVal lngChar As Long) As Long

Private lngAscHeader1&(5), lngAscHeader2&(5)
Private intAsc1%(), intAsc2%()

' 0 -> Error
' 1 -> First Word
' 2 -> Equal
' 3 -> Secon Word
Friend Static Function Compare(ByRef strWord1$, ByRef strWord2$) As Long
Dim Q&, L&

   L = LenB(strWord1) \ 2
   If L = 0 Or LenB(strWord2) = 0 Then Exit Function
   
   lngAscHeader1(3) = StrPtr(strWord1)
   lngAscHeader2(3) = StrPtr(strWord2)

   For Q = 0 To L
       If IsCharUpperW(intAsc1(Q)) Then
           intAsc1(Q) = intAsc1(Q) + 32
       End If
       
       If IsCharUpperW(intAsc2(Q)) Then
           intAsc2(Q) = intAsc2(Q) + 32
       End If
       
       If intAsc2(Q) > intAsc1(Q) Then
           Compare = 1
           Exit Function
       ElseIf intAsc2(Q) < intAsc1(Q) Then
           Compare = 3
           Exit Function
       ElseIf Q = L Then
           Compare = 2
           Exit Function
       End If
   Next Q
End Function

Private Sub Class_Initialize()
   lngAscHeader1(0) = &H1&
   lngAscHeader1(1) = &H2&
   lngAscHeader1(4) = &H7FFFFFFF
   PutMem4 VarPtrArray(intAsc1), VarPtr(lngAscHeader1(0))
   
   lngAscHeader2(0) = &H1&
   lngAscHeader2(1) = &H2&
   lngAscHeader2(4) = &H7FFFFFFF
   PutMem4 VarPtrArray(intAsc2), VarPtr(lngAscHeader2(0))
End Sub

Private Sub Class_Terminate()
   PutMem4 VarPtrArray(intAsc1), 0&
   PutMem4 VarPtrArray(intAsc2), 0&
End Sub


Ejemplos:
Código (vb) [Seleccionar]
Private Sub Form_Load()
Dim c As New Class1

   Debug.Print "---------------------------------------------"
   Debug.Print c.Compare("rana", "")
   Debug.Print c.Compare("hola", "holas")
   Debug.Print c.Compare("bienvenido", "bienvenida")
   Debug.Print c.Compare("Ejemplo", "eJempLIficar")
   Debug.Print c.Compare("igual", "igual")
   Debug.Print c.Compare("PaLaBrA", "palabra")
   Debug.Print "---------------------------------------------"
   Debug.Print c.Compare("elfo", "elefante")
   Debug.Print c.Compare("ave", "zorro")
   Debug.Print c.Compare("hola", "")
   Debug.Print c.Compare("zero", "zerocool")
   Debug.Print c.Compare("feo", "    ")
   Debug.Print c.Compare("frog", "frog")
   Debug.Print c.Compare("faso", "fasa")
   Debug.Print c.Compare("JOJO", "jojo")
End Sub


Resultado:
---------------------------------------------
0
1
3
3
2
2
---------------------------------------------
3
1
0
1
3
2
3
2




DoEvents! :P