Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Psyke1 en 11 Marzo 2011, 10:44 am



Título: [RETO] CompWordsAlphabetically
Publicado por: Psyke1 en 11 Marzo 2011, 10:44 am
¿Qué pasa? :huh: ¿Donde están los retos que caracterizan a  esta sección? :-( :xD
A ver que os parece este:

Parte 1:

Crear una función que compare dos palabras (sin importar mayúsculas) y devuelva:
Código:
0 : Error
1 : La 1ª palabra va antes en el abecedario
2 : La 2ª palabra va antes en el abecedario
3 : Ambas palabras son iguales

Ejemplos:
Código:
"rana"        - ""		-> 0
"hola"        - "holas" -> 1
"bienvenido"  - "bienvenida" -> 2
"Ejemplo"     - "eJempLIficar"  -> 2
"igual"       - "igual"         -> 3
"PALABRA"     - "palabra"       -> 3

Espero haber sido claro...;) Si hay alguna duda preguntad.
Por supuesto vale todo y el más rápido gana :)

PD: La Parte 2 la propondré cuando esté la parte 1 finalizada... :rolleyes:

DoEvents! :P


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: 79137913 en 11 Marzo 2011, 14:09 pm
HOLA!!!

Listo!!!

Código
  1. Private Function FirstWord7913(W1 As String, W2 As String) As Long
  2.  
  3.    If LenB(W1) = 0 Then
  4.            FirstWord7913 = 0
  5.            Exit Function
  6.    End If
  7.  
  8.    If LenB(W2) = 0 Then
  9.            FirstWord7913 = 0
  10.            Exit Function
  11.    End If
  12.  
  13. Dim ST1 As Byte
  14. Dim ST2 As Byte
  15.    ST1 = LCase$(W1)
  16.    ST2 = LCase$(W2)
  17.    If LenB(ST1) = LenB(ST2) Then
  18.        If InStrB(1, ST1, ST2, vbBinaryCompare) Then
  19.            FirstWord7913 = 3
  20.            Exit Function
  21.        End If
  22.    End If
  23.  
  24. Dim B1() As Byte
  25. Dim B2() As Byte
  26. B1 = ST1
  27. B2 = ST2
  28. Dim X As Long
  29.    If UBound(B1) > UBound(B2) Then
  30.        For X = 1 To UBound(B2) Step 2
  31.            If B1(X) < B2(X) Then
  32.                FirstWord7913 = 1
  33.                Exit Function
  34.            ElseIf B1(X) > B2(X) Then
  35.                FirstWord7913 = 2
  36.                Exit Function
  37.            End If
  38.        Next
  39.        FirstWord7913 = 2
  40.        Exit Function
  41.    Else
  42.        For X = 1 To UBound(B1) Step 2
  43.            If B1(X) < B2(X) Then
  44.                FirstWord7913 = 1
  45.                Exit Function
  46.            ElseIf B1(X) > B2(X) Then
  47.                FirstWord7913 = 2
  48.                Exit Function
  49.            End If
  50.        Next
  51.        FirstWord7913 = 1
  52.        Exit Function
  53.    End If
  54.  
  55. End Function

GRACIAS POR LEER!!!


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Karcrack en 11 Marzo 2011, 15:00 pm
@79137913: No creo que esa versión sea demasiado rápida :xD
Código:
LenB(W1) / 2 = 0
:o Por que divides entre 2? :-\


Código
  1. Option Explicit
  2.  
  3. Sub Main()
  4.    Debug.Print kCompare("rana", "")
  5.    Debug.Print kCompare("hola", "holas")
  6.    Debug.Print kCompare("bienvenido", "bienvenida")
  7.    Debug.Print kCompare("Ejemplo", "eJempLIficar")
  8.    Debug.Print kCompare("igual", "igual")
  9.    Debug.Print kCompare("PALABRA", "palabra")
  10. End Sub
  11.  
  12. Public Static Function kCompare(ByRef s1 As String, ByRef s2 As String) As Long
  13.    Dim b()     As Long
  14.    If (LenB(s1) <> 0) And (LenB(s2) <> 0) Then
  15.        If (Not Not b) = False Then
  16.            ReDim b(-1 To 1)
  17.            b(-1) = 1
  18.            b(1) = 2
  19.            b(0) = 3
  20.        End If
  21.        kCompare = b(StrComp(s1, s2, vbTextCompare))
  22.    End If
  23. End Function

Si no hubieses elegido esos numeros todo seria mas fácil :xD


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: 79137913 en 11 Marzo 2011, 15:11 pm
HOLA!!!

XD se me paso Karcrack, lo vi despues :P

De a poco la voy a ir optimizando

Funcion actualizada:
Cambiado Asc por AscW
Funcion convertida a Long
Agregada comparacion por InstrB

GRACIAS POR LEER!!!


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Edu en 11 Marzo 2011, 15:54 pm
Cuando aprendere a programar como ustedes :( no se rien q todavia q lo hago jaja:

Código
  1. Option Explicit
  2.  
  3. Private Sub Form_Load()
  4.  
  5.    Debug.Print CheckWord("elfo", "elefante")
  6.    Debug.Print CheckWord("ave", "zorro")
  7.    Debug.Print CheckWord("hola", "")
  8.    Debug.Print CheckWord("zero", "zerocool")
  9.    Debug.Print CheckWord("feo", "    ")
  10.    Debug.Print CheckWord("frog", "frog")
  11.    Debug.Print CheckWord("faso", "fasa")
  12.    Debug.Print CheckWord("JOJO", "jojo")
  13.  
  14.  
  15. End Sub
  16.  
  17. Function CheckWord(sFirst As String, sSecond As String) As Long
  18.    Dim i       As Integer
  19.    Dim max     As Integer
  20.  
  21.    sFirst = LCase$(Trim$(sFirst))
  22.    sSecond = LCase$(Trim$(sSecond))
  23.  
  24. ' Verificar error
  25.    If sFirst = "" Or sSecond = "" Then
  26.        CheckWord = 0: Exit Function
  27.    End If
  28.  
  29. ' Establecer valor maximo del bucle
  30.    If Len(sFirst) < Len(sSecond) Then
  31.        max = Len(sFirst)
  32.    Else
  33.        max = Len(sSecond)
  34.    End If
  35.  
  36. 'Bucle
  37. For i = 1 To max
  38.  
  39.    If (Left(sFirst, i) < Left(sSecond, i)) Then
  40.        CheckWord = 1
  41.        Exit Function
  42.  
  43.    ElseIf (Left(sFirst, i) > Left(sSecond, i)) Then
  44.        CheckWord = 2
  45.        Exit Function
  46.  
  47. ' Si por ahora es igual..
  48.    ElseIf (Left(sFirst, i) = Left(sSecond, i)) Then
  49.  
  50.        If i = max Then ' Si ya termina el bucle comprobamos..
  51.  
  52.            If Len(sFirst) > Len(sSecond) Then
  53.                CheckWord = 2
  54.                Exit Function
  55.            End If
  56.  
  57.            If Len(sFirst) < Len(sSecond) Then
  58.                CheckWord = 1
  59.                Exit Function
  60.            End If
  61.  
  62. ' Por descarte..
  63.  
  64.            CheckWord = 3
  65.            Exit Function
  66.  
  67.        End If
  68.    End If
  69.  
  70. Next i
  71.  
  72. End Function
  73.  


Salida:

Código:
 2 
 1
 0
 1
 1
 3
 2
 3

Edit: Ahora veo q me falto lo de comparar con las mayusculas fuck, conrazon se mataban ustedes jaja, no creo q me den las bolas para hacer :)


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: 79137913 en 11 Marzo 2011, 15:56 pm
HOLA!!!

Jajaja, no me habia percatado del strcomp XD ya fue voy a seguir viendo, GRANDE Karcrack :P

GRACIAS POR LEER!!!


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Edu en 11 Marzo 2011, 15:58 pm
Ma q asco q das Karcrack xD !!


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Karcrack en 11 Marzo 2011, 16:12 pm
(http://www.cibercronicas.com/wp-content/uploads/2010/11/cool-face.jpg)
PROBLEM? :xD :xD

PD: Quien haga las pruebas de velocidad que sea bondadoso y desactive la comprobacion de tamaño del buffer y esas cositas para que todo sea mas rapido y divertido :laugh:


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Psyke1 en 11 Marzo 2011, 16:32 pm
 :¬¬ :¬¬ :¬¬ :¬¬ :¬¬ :¬¬ :¬¬ :¬¬ :¬¬ :¬¬ :¬¬ :¬¬ :¬¬ :¬¬ :¬¬ :¬¬ :¬¬ :¬¬ :¬¬ :¬¬ :¬¬
Mi forma era igual que la tuya! :(
Te odio, pero me buscaré la vida para hacerlo diferente, quizás no más rapido pero si diferente. :P
Asi que no testeeis aun... >:(
Por la tarde posteo la parte 2 del reto :)

Gracias por participar... :-*

DoEvents! :P


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: 79137913 en 11 Marzo 2011, 16:34 pm
HOLA!!!

Con razon el "Por supuesto vale todo"  :¬¬

GRACIAS POR LEER!!!


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Edu 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?

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

Código:
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


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: 79137913 en 11 Marzo 2011, 17:14 pm
HOLA!!!

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!!!


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Karcrack en 11 Marzo 2011, 19:40 pm
@79137913:Reparado, habia un problema con la comprobación de tamaños :xD


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: raul338 en 11 Marzo 2011, 19:56 pm
Código
  1.        If (Not Not b) = False Then
  2.            ReDim b(-1 To 1)
  3.            b(-1) = 1
  4.            b(1) = 2
  5.            b(0) = 3
  6.        End If
  7.  

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)


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Edu en 11 Marzo 2011, 20:28 pm
Ah claro, ya entendi xD


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Karcrack en 11 Marzo 2011, 21:40 pm
@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.


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: raul338 en 11 Marzo 2011, 22:33 pm
Tramposo, no sabia que se podian hacer funciones estaticas :xD :xD


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Psyke1 en 12 Marzo 2011, 03:03 am
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
  1. Option Explicit
  2. Option Compare Text
  3.  
  4. Private Declare Function lstrcmpW Lib "kernel32.dll" (ByVal lpString1 As Long, ByVal lpString2 As Long) As Long
  5.  
  6. ' -1 > Error
  7. ' 1  > Iguales
  8. ' 0  > primera palabra
  9. ' 2  > segunda palabra
  10. Public Static Function CompareMrFrog(ByRef strWord1$, ByRef strWord2$) As Long
  11.    If LenB(strWord1) = 0 Or LenB(strWord2) = 0 Then
  12.        CompareMrFrog = -1
  13.        Exit Function
  14.    End If
  15.  
  16.    If strWord1 = strWord2 Then
  17.        CompareMrFrog = 1
  18.        Exit Function
  19.    End If
  20.  
  21.    CompareMrFrog = lstrcmpW(StrPtr(strWord1), StrPtr(strWord2)) + 1
  22. End Function

@Karcrack
(http://st-listas.20minutos.es/images/2011-03/279093/2911201_640px.jpg?1299698127)

DoEvents! :P


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Karcrack en 12 Marzo 2011, 13:43 pm
(http://images1.memegenerator.net/ImageMacro/4389154/you-win-this-time.jpg?imageSize=Medium&generatorName=Pissed-off-Obama)
TRAMPOOOOOOOOSOOOOOO!!
Anda que modificar las normas a tu gusto... ya te vale :¬¬


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Psyke1 en 12 Marzo 2011, 14:51 pm
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í:
Código:
    Debug.Print kCompare("feo", "    ")
Debería devolver la segunda y devuelve la primera... :rolleyes:

Ahora dejo mi versión 2:
Código
  1. Option Explicit
  2. Option Base 0
  3.  
  4. Private Declare Sub PutMem4 Lib "msvbvm60.dll" (ByVal Ptr As Long, ByVal Value As Long)
  5. Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Ptr() As Any) As Long
  6. Private Declare Function IsCharUpperW Lib "user32.dll" (ByVal lngChar As Long) As Long
  7.  
  8. Private lngAscHeader1&(5), lngAscHeader2&(5)
  9. Private intAsc1%(), intAsc2%()
  10.  
  11. ' 0 -> Error
  12. ' 1 -> First Word
  13. ' 2 -> Equal
  14. ' 3 -> Secon Word
  15. Friend Static Function Compare(ByRef strWord1$, ByRef strWord2$) As Long
  16. Dim Q&, L&
  17.  
  18.    L = LenB(strWord1) \ 2
  19.    If L = 0 Or LenB(strWord2) = 0 Then Exit Function
  20.  
  21.    lngAscHeader1(3) = StrPtr(strWord1)
  22.    lngAscHeader2(3) = StrPtr(strWord2)
  23.  
  24.    For Q = 0 To L
  25.        If IsCharUpperW(intAsc1(Q)) Then
  26.            intAsc1(Q) = intAsc1(Q) + 32
  27.        End If
  28.  
  29.        If IsCharUpperW(intAsc2(Q)) Then
  30.            intAsc2(Q) = intAsc2(Q) + 32
  31.        End If
  32.  
  33.        If intAsc2(Q) > intAsc1(Q) Then
  34.            Compare = 1
  35.            Exit Function
  36.        ElseIf intAsc2(Q) < intAsc1(Q) Then
  37.            Compare = 3
  38.            Exit Function
  39.        ElseIf Q = L Then
  40.            Compare = 2
  41.            Exit Function
  42.        End If
  43.    Next Q
  44. End Function
  45.  
  46. Private Sub Class_Initialize()
  47.    lngAscHeader1(0) = &H1&
  48.    lngAscHeader1(1) = &H2&
  49.    lngAscHeader1(4) = &H7FFFFFFF
  50.    PutMem4 VarPtrArray(intAsc1), VarPtr(lngAscHeader1(0))
  51.  
  52.    lngAscHeader2(0) = &H1&
  53.    lngAscHeader2(1) = &H2&
  54.    lngAscHeader2(4) = &H7FFFFFFF
  55.    PutMem4 VarPtrArray(intAsc2), VarPtr(lngAscHeader2(0))
  56. End Sub
  57.  
  58. Private Sub Class_Terminate()
  59.    PutMem4 VarPtrArray(intAsc1), 0&
  60.    PutMem4 VarPtrArray(intAsc2), 0&
  61. End Sub

Ejemplos:
Código
  1. Private Sub Form_Load()
  2. Dim c As New Class1
  3.  
  4.    Debug.Print "---------------------------------------------"
  5.    Debug.Print c.Compare("rana", "")
  6.    Debug.Print c.Compare("hola", "holas")
  7.    Debug.Print c.Compare("bienvenido", "bienvenida")
  8.    Debug.Print c.Compare("Ejemplo", "eJempLIficar")
  9.    Debug.Print c.Compare("igual", "igual")
  10.    Debug.Print c.Compare("PaLaBrA", "palabra")
  11.    Debug.Print "---------------------------------------------"
  12.    Debug.Print c.Compare("elfo", "elefante")
  13.    Debug.Print c.Compare("ave", "zorro")
  14.    Debug.Print c.Compare("hola", "")
  15.    Debug.Print c.Compare("zero", "zerocool")
  16.    Debug.Print c.Compare("feo", "    ")
  17.    Debug.Print c.Compare("frog", "frog")
  18.    Debug.Print c.Compare("faso", "fasa")
  19.    Debug.Print c.Compare("JOJO", "jojo")
  20. End Sub

Resultado:
Código:
---------------------------------------------
 0
 1
 3
 3
 2
 2
---------------------------------------------
 3
 1
 0
 1
 3
 2
 3
 2

(http://gamersmafia.com/storage/comments/547/47/maximum_trolling.jpg)

DoEvents! :P


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Karcrack en 12 Marzo 2011, 16:06 pm
Tu función devuelve un resultado erróneo aquí:
Código:
    Debug.Print kCompare("feo", "    ")
Debería devolver la segunda y devuelve la primera... :rolleyes:
Ummm... En abecedario el [espacio] no esta incluido, asi que "feo" va antes que " feo"... >:D


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Psyke1 en 12 Marzo 2011, 16:34 pm
Ummm... En abecedario el [espacio] no esta incluido, asi que "feo" va antes que " feo"... >:D
:xD
Tan sutil como siempre... :¬¬

Me temo que lógico sería:
1.-Signos y símbolos
2.-Números
3.-Letras

Además el vb me apoya, si hago esto:
Código
  1. Private Sub Form_Load()
  2.    With List1
  3.        .AddItem "4paleto"
  4.        .AddItem "paleto"
  5.        .AddItem " paleto"
  6.    End With
  7. End Sub

Y pongo la propiedad Sorted en el List1 (para ordenar el contenido del mismo) este es el resultado:
(http://img218.imageshack.us/img218/2161/nuevaimagendemapadebitsgs.png)

Quizás quieras revisar tu función. :rolleyes:

DoEvents! :P


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Karcrack en 12 Marzo 2011, 16:49 pm
VB NO te apoya... StrComp() :silbar:


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Psyke1 en 12 Marzo 2011, 17:01 pm
 :xD
Y QuickSort tambien ¿no? :¬¬
Código
  1. Private Sub Form_Load()
  2. Dim a() As String
  3. Dim vItem
  4.    a = Split("karcrack es un pesado 4ejemplo %ejemplo", " ")
  5.    QuickSort a
  6.  
  7.    For Each vItem In a
  8.        Debug.Print vItem
  9.    Next
  10. End Sub

Resultado:
Código:
%ejemplo
4ejemplo
es
karcrack
pesado
un

No insistas, todos los ejemplos (menos el tuyo :xD) lo ordenan así... :silbar:

DoEvents! :P


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: 79137913 en 12 Marzo 2011, 17:22 pm
HOLA!!!

Mmm, lamentablemente en este caso creo que tiene que devolver error si comparas una palabra con una cadena de espacios, pero al comparar "palabra" con" palabra" tiene que devolver iguales, pero es necesario que tome en cuenta los espacios, ya que "hola como andas" va antes que "holacomoestas" no se si me entienden... Seria lo mas correcto.

GRACIAS POR LEER!!!


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Edu en 12 Marzo 2011, 18:36 pm
Pero 7913, eso seria para otra cosa, esto es sobre palabras nomas xD y si usas el mio creo q anda ya para eso pero la idea es con palabras solamente.

Quien gano entonces? Frog haciendo trampa o Karcrack con errores? xD jajaj


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Psyke1 en 12 Marzo 2011, 18:57 pm
Pero 7913, eso seria para otra cosa, esto es sobre palabras nomas xD y si usas el mio creo q anda ya para eso pero la idea es con palabras solamente.

Quien gano entonces? Frog haciendo trampa o Karcrack con errores? xD jajaj
Yo no hice trampa en ningún momento. :¬¬
Yo soy el que planteó el reto, así que os tendréis que adaptar a las normas del mismo al igual que hago yo cuando participo en otro.
Cuando la función de Karcrack devuelva resultados "correctos" lo testearé.
Y después propondré la Parte 2 del reto...

DoEvents! :P


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Karcrack en 12 Marzo 2011, 19:30 pm
Pues entonces me da la sensación de que planteas mal el reto... Si lo que quieres es que las ordene siguiendo el orden de cada carácter en la Tabla Ascii esta mal planteado.
Tu pides alfabeticamente... Y el alfabeto no contempla el espacio... luego lógicamente debería ser situado después de todas las letras del alfabeto...
Código:
http://es.wikipedia.org/wiki/Alfabeto_latino

Aún así StrComp() compara según el Ascii Code... así que teóricamente mi función ha de seguir tus directrices...


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Psyke1 en 12 Marzo 2011, 19:33 pm
Lo siento tienes razón, lo planteé mal entonces... :silbar:
Según la tabla ascii :)

DoEvents! :P


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Edu en 12 Marzo 2011, 19:46 pm
Bueno pero no te enojes Frog xD, hace los test q me interesa saber si mi codigo esta demasiadoo lento o q


Título: Re: [RETO] CompWordsAlphabetically
Publicado por: Karcrack en 12 Marzo 2011, 20:11 pm
Lo siento tienes razón, lo planteé mal entonces... :silbar:
Según la tabla ascii :)

DoEvents! :P
(http://plethorapress.typepad.com/photos/uncategorized/i_win_1.gif)