[RETO] Alternativa a Instr()

Iniciado por Psyke1, 31 Diciembre 2010, 21:14 PM

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

krabby

#20
Bien pues el resultado que me dio:


RESULTADOS PRUEBA 1:


============ RETO INSTR 31/12/10 ============
String a buscar:            col
String donde buscar:        Baila baila baila como Juana, baila la cubana, parece refresco de cola, a mi me parece que estás bien buena.
Nº de vueltas:               250          

3 Offsets:     1             10            20
============ COMPROBACION ============
Valores de InStr:                          67            67            67


============ VELOCIDAD ============
InStr          0.477649485502989
Raul338        10.0386183350126
Miseryk        16.4880727613527
gaston93       2.41434061336485
Mr Frog        5.18079225155567
Tokes          16.6270077772112
79137913       11.2904333267657
Tokes v2       9.7320513982567
Tenient101     10.14500686101
BlackZeroX     3.33684112168503
krabby         4.56310886870851

____________________________________________________________________________________________________________________________________________

RESULTADOS PRUEBA 2:
============ RETO INSTR 31/12/10 ============
String a buscar:            la
String donde buscar:        Baila baila baila como Juana, baila la cubana, parece refresco de cola, a mi me parece que estás bien buena.
Nº de vueltas:               250          

3 Offsets:     1             10            20
============ COMPROBACION ============
Valores de InStr:                          4             10            34
BlackZeroX no devuelve los mismos valores  4             16            34


============ VELOCIDAD ============
InStr          0.284480818743699
Raul338        1.87330946357435
Miseryk        2.6841720120485
gaston93       3.54192950290311
Mr Frog        3.34420082794071
Tokes          2.48609337482952
79137913       2.04759066734653
Tokes v2       1.64408418552059
Tenient101     1.47925196267583
BlackZeroX     3.07158023007219
krabby         4.22855545029469


___________________________________________________________________________________________________________________________________________

RESULTADOS PRUEBA 3:
============ RETO INSTR 31/12/10 ============
String a buscar:            Ñ
String donde buscar:        Baila baila baila como Juana, baila la cubana, parece refresco de cola, a mi me parece que estás bien buena.
Nº de vueltas:               250          

3 Offsets:     1             10            20
============ COMPROBACION ============
Valores de InStr:                          0             0             0


============ VELOCIDAD ============
InStr          0.368475259943215
Raul338        13.7436827438161
Miseryk        49.2554028048075
gaston93       1.92160775460367
Mr Frog        0.345727713266124
Tokes          25.6878945605716
79137913       15.5823844398382
Tokes v2       13.4906600323155
Tenient101     16.8831941475112
BlackZeroX     2.26947023763487
krabby         2.08259039262616



en la tercera prueba de la "Ñ" en ambos resultados sale que Mr. Frog le gana al instr, :D :D :D

BlackZeroX

#21
...

Ninguno de ustedes a compilado el proyecto de comprobacion, esos resultados son invalidos ( me acabe de bajar el proyecto y todo esta en el Debug... ¬¬# )...

Miren cual es el mas rapido... inclusive le gano a InStr(), por hay un aguafiestas dijo que no podria...

Edito No habia visto que eran 3 prubas aqui las dejo...

Código (Vb) [Seleccionar]


============ RETO INSTR 01/01/2011 - 02:42:29 p.m. ============
String a buscar: Ñ
String donde buscar: Baila baila baila como Juana, baila la cubana, parece refresco de cola, a mi me parece que estás bien buena.
Nº de vueltas: 250
3 Offsets: 1 10 20
============ COMPROBACION ============
Valores de InStr: 0 0 0

============ VELOCIDAD ============
0 Mr Frog 0.2237288
1 InStr 0.4316488
2 gaston93 2.2926488
3 krabby 2.5124888
4 BlackZeroX 3.2794088
5 Tokes v2 16.1948888
6 79137913 21.6315688
7 Tenient101 23.6759288
8 Tokes 45.0908488
9 Raul338 49.8016088
10 Miseryk 159.0136088


============ RETO INSTR 01/01/2011 - 02:43:11 p.m. ============
String a buscar: la
String donde buscar: Baila baila baila como Juana, baila la cubana, parece refresco de cola, a mi me parece que estás bien buena.
Nº de vueltas: 250
3 Offsets: 1 10 20
============ COMPROBACION ============
Valores de InStr: 4 10 34

============ VELOCIDAD ============
0 InStr 0.470288
1 79137913 2.211208
2 Raul338 3.088048
3 Tokes v2 3.368368
4 BlackZeroX 3.379128
5 Miseryk 4.264168
6 Mr Frog 4.569008
7 Tokes 5.908088
8 Tenient101 6.049528
9 krabby 6.238808
10 gaston93 6.480928


============ RETO INSTR 01/01/2011 - 02:44:06 p.m. ============
String a buscar: col
String donde buscar: Baila baila baila como Juana, baila la cubana, parece refresco de cola, a mi me parece que estás bien buena.
Nº de vueltas: 250
3 Offsets: 1 10 20
============ COMPROBACION ============
Valores de InStr: 67 67 67

============ VELOCIDAD ============
0 InStr 1.6597832
1 gaston93 2.4199032
2 BlackZeroX 3.6896232
3 Mr Frog 4.1875432
4 krabby 5.9086232
5 Raul338 13.7212632
6 Tokes v2 11.0735032
7 Tenient101 12.4469832
8 79137913 14.7459032
9 Tokes 26.1060232
10 Miseryk 26.8289832



Descargar Proyecto de Pruebas

Temibles Lunas!¡.
The Dark Shadow is my passion.

krabby

#22
bueno si tienes razon hay veces que el vb da un resultado en debug y otro cuando es compilado, e incluso falla en uno y en el otro no.
ehhh pero segun veo el q le gana al instr es Mr Frog.



edito: mmm :C :C quede tercer puesto .

BlackZeroX

#23
Aqui dejo el proyecto modificado para que solo lo ejecuten y les salte el notepad con la informacion y el RANKING de las 3 pruebas, ya que en el anterior no vi que eran 3 strings a buscar...

Update Reto.rar

Código (vb) [Seleccionar]


============ RETO INSTR 01/01/2011 - 03:12:25 p.m. ============
String a buscar: col
String donde buscar: Baila baila baila como Juana, baila la cubana, parece refresco de cola, a mi me parece que estás bien buena.
Nº de vueltas: 250
3 Offsets: 1 10 20
============ COMPROBACION ============
Valores de InStr: 67 67 67

============ VELOCIDAD ============
0 InStr 0.5725008
1 BlackZeroX 2.1983408
2 Mr Frog 3.7716608
3 gaston93 4.0096208
4 krabby 5.6024608
5 Raul338 15.4459808
6 Miseryk 24.8291408
7 Tokes v2 10.7238208
8 Tenient101 13.9761008
9 79137913 16.4519408
10 Tokes 26.5471408



============ RETO INSTR 01/01/2011 - 03:12:25 p.m. ============
String a buscar: la
String donde buscar: Baila baila baila como Juana, baila la cubana, parece refresco de cola, a mi me parece que estás bien buena.
Nº de vueltas: 250
3 Offsets: 1 10 20
============ COMPROBACION ============
Valores de InStr: 4 10 34

============ VELOCIDAD ============
0 InStr 0.477224
1 Raul338 1.764424
2 Tokes v2 1.775824
3 Tenient101 1.779824
4 BlackZeroX 2.195464
5 Miseryk 3.082744
6 79137913 2.465384
7 Tokes 3.249304
8 Mr Frog 3.814264
9 gaston93 4.428424
10 krabby 7.093384



============ RETO INSTR 01/01/2011 - 03:12:25 p.m. ============
String a buscar: Ñ
String donde buscar: Baila baila baila como Juana, baila la cubana, parece refresco de cola, a mi me parece que estás bien buena.
Nº de vueltas: 250
3 Offsets: 1 10 20
============ COMPROBACION ============
Valores de InStr: 0 0 0

============ VELOCIDAD ============
0 Mr Frog 0.2846228
1 BlackZeroX 1.7433028
2 gaston93 1.7897028
3 krabby 1.9981428
4 InStr 3.2337828
5 Raul338 16.1140228
6 Tokes v2 16.0697828
7 79137913 20.9785428
8 Tenient101 24.8553428
9 Tokes 38.0149428
10 Miseryk 84.9994228



Mi funcion actualizada

Código (Vb) [Seleccionar]


Public Function RetInstr(ByVal Start As Long, ByVal String1 As String, ByVal String2 As String, Optional ByVal Compare As VbCompareMethod = VbCompareMethod.vbBinaryCompare) As Long
Dim lng_ST1  As Long
    lng_ST1 = Len(String1)
    If Not Start > lng_ST1 Then
        If Start = 1 Then
            RetInstr = (Start + Len(Split(Right$(String1, lng_ST1 - Start), String2, 2, Compare)(0))) + 1
        Else
            RetInstr = (Start + Len(Split(Right$(String1, lng_ST1 - Start + 1), String2, 2, Compare)(0)))
        End If
        If RetInstr > lng_ST1 Then RetInstr = 0
    End If
End Function



La Funcion de la RANA Explota cuando se busca una String VACIA

Código (Vb) [Seleccionar]


============ RETO INSTR 01/01/2011 - 03:17:23 p.m. ============
String a buscar:
String donde buscar: Baila baila baila como Juana, baila la cubana, parece refresco de cola, a mi me parece que estás bien buena.
Nº de vueltas: 250
3 Offsets: 1 10 20
============ COMPROBACION ============
Valores de InStr: 1 10 20
Raul338 no devuelve los mismos valores 0 0 0
Miseryk no devuelve los mismos valores 0 0 0
gaston93 no devuelve los mismos valores 0 0 0
Tokes no devuelve los mismos valores 0 0 0
79137913 no devuelve los mismos valores 0 0 0
Tokes(raul338) no devuelve los mismos valores -1 -1 -1
Tenient101 no devuelve los mismos valores -1 -1 -1
BlackZeroX no devuelve los mismos valores 0 0 0
krabby no devuelve los mismos valores 0 0 0

============ VELOCIDAD ============
0 InStr 0.7140104
1 Miseryk 0.7450104
2 Mr Frog 0.7569704   <---- Exploto No se considera...
3 Tenient101 0.7956504
4 Raul338 0.8776904
5 krabby 0.8335704
6 gaston93 7.0439704
7 Tokes v2 0.9286504
8 79137913 1.4048904
9 BlackZeroX 5.6635304
10 Tokes 73.4917704



Temibles Lunas!¡.
The Dark Shadow is my passion.

Karcrack

Jamas podreis superar a InStr()!!! >:D

Yo estoy cerca.. pero me falta el empujonzito del ASM inline... me dejais? :-[

BlackZeroX

#25
.
La funcion de la Rana al buscar la Letra Ñ No la busca.... por eso es rapida... trabaja con Array's asi que debe ser mayor o Igual a 0 ¬¬# y CBool() toma como true cualquier numero distinto de 0, ya que 0 es false y al buscar una letra...

Código (vb,8) [Seleccionar]


' Mr. Frog ©
Private Function myInstrMrFrog(ByVal Start&, ByVal String1$, ByVal String2$)
Dim bvString1() As Byte, bvString2() As Byte
Dim ls2Len&, lLimit&
Dim Q&, C&
   ls2Len& = ((Len(String2$)) - &H1)
   If CBool(ls2Len&) Then
       lLimit& = ((Len(String1$)) - ls2Len&)
       If lLimit& > 1 Then
           bvString1 = (VBA.StrConv(String1$, vbFromUnicode))
           bvString2 = (VBA.StrConv(String2$, vbFromUnicode))
           Q& = (Start& - &H1)
           Do While (Q& < lLimit&)
               Do While (bvString1(Q& + C&) = bvString2(C&))
                   'Put int_ff , ,ChrW$(bvString1(Q& + C&)); ChrW$(bvString2(C&))
                   C& = C& + &H1
                   If ((C& - &H1) = ls2Len&) Then
                       myInstrMrFrog = Q& + &H1
                       Exit Function
                   End If
               Loop
               Q& = (Q& + C&) + &H1
               C& = &H0
           Loop
       End If
   End If
End Function



Corrigiendo dicha linea... Con esto se arregla que Explote la funcion al buscar una string Vacia.

Código (Vb,8) [Seleccionar]


' Mr. Frog ©
Private Function myInstrMrFrog(ByVal Start&, ByVal String1$, ByVal String2$)
Dim bvString1() As Byte, bvString2() As Byte
Dim ls2Len&, lLimit&
Dim Q&, C&
   ls2Len& = ((Len(String2$)) - &H1)
   If ls2Len& > -1 Then
       lLimit& = ((Len(String1$)) - ls2Len&)
       If lLimit& > 1 Then
           bvString1 = (VBA.StrConv(String1$, vbFromUnicode))
           bvString2 = (VBA.StrConv(String2$, vbFromUnicode))
           Q& = (Start& - &H1)
           Do While (Q& < lLimit&)
               Do While (bvString1(Q& + C&) = bvString2(C&))
                   'Put int_ff , ,ChrW$(bvString1(Q& + C&)); ChrW$(bvString2(C&))
                   C& = C& + &H1
                   If ((C& - &H1) = ls2Len&) Then
                       myInstrMrFrog = Q& + &H1
                       Exit Function
                   End If
               Loop
               Q& = (Q& + C&) + &H1
               C& = &H0
           Loop
       End If
   End If
End Function




Código (Vb) [Seleccionar]


============ RETO INSTR 01/01/2011 - 03:49:20 p.m. ============
String a buscar: col
String donde buscar: Baila baila baila como Juana, baila la cubana, parece refresco de cola, a mi me parece que estás bien buena.
Nº de vueltas: 250
3 Offsets: 1 10 20
============ COMPROBACION ============
Valores de InStr: 67 67 67

============ VELOCIDAD ============
0 InStr 0.5884212
1 gaston93 2.8621812
2 Mr Frog 4.4889812
3 Raul338 15.8145412
4 BlackZeroX 5.0922212
5 krabby 7.1112212
6 Miseryk 27.8807812
7 Tenient101 15.0253412
8 Tokes v2 15.6543412
9 79137913 17.5959812
10 Tokes 30.6114212



============ RETO INSTR 01/01/2011 - 03:49:20 p.m. ============
String a buscar: la
String donde buscar: Baila baila baila como Juana, baila la cubana, parece refresco de cola, a mi me parece que estás bien buena.
Nº de vueltas: 250
3 Offsets: 1 10 20
============ COMPROBACION ============
Valores de InStr: 4 10 34

============ VELOCIDAD ============
0 InStr 1.1657844
1 79137913 1.8203044
2 Tenient101 1.9081844
3 BlackZeroX 2.0457044
4 Raul338 2.0655044
5 Tokes v2 2.4687044
6 Tokes 2.7844644
7 Miseryk 3.3320644
8 Mr Frog 3.7709044
9 gaston93 4.8395844
10 krabby 5.6555444



============ RETO INSTR 01/01/2011 - 03:49:20 p.m. ============
String a buscar: Ñ
String donde buscar: Baila baila baila como Juana, baila la cubana, parece refresco de cola, a mi me parece que estás bien buena.
Nº de vueltas: 250
3 Offsets: 1 10 20
============ COMPROBACION ============
Valores de InStr: 0 0 0

============ VELOCIDAD ============
0 InStr 0.4920232
1 gaston93 1.8135032
2 BlackZeroX 1.8769032
3 krabby 2.1987032
4 Mr Frog 3.8963832
5 Raul338 18.0244632
6 Tokes v2 17.9593432
7 79137913 22.1435432
8 Tenient101 23.3084632
9 Tokes 42.3355032
10 Miseryk 82.4681032



Temibles Lunas!¡.
The Dark Shadow is my passion.

Psyke1

#26
Cita de: Karcrack en  1 Enero 2011, 22:23 PM
Jamas podreis superar a InStr()!!! >:D
============ VELOCIDAD ============
0 Mr Frog 0.2237288
1 InStr 0.4316488

Aunque fuera en solo un test, le saco el doble... ::) :xD
Cita de: Karcrack en  1 Enero 2011, 22:23 PM
Yo estoy cerca.. pero me falta el empujonzito del ASM inline... me dejais? :-[
Tramposo! :¬¬
Ook, puedes ponerlo, así de paso aprendo... :P

@BlackZer0x
Oops, se me escapo lo de CBool() tienes razón... :silbar:

DoEvents! :P

krabby

mmmmm se me paso ese detalle de q si se busca cadena vacia el instr siempre devuelve la posicion que le indicamos, black zero nos dio un jalon de orejas, ahora todos a mejorar nuestros codes.

Psyke1

#28
Bueno, dejo mi segunda manera de hacerlo... :)
Código (vb) [Seleccionar]
Private Function InstrMrFrog02&(ByVal Start&, ByVal String1$, ByVal String2$)
Dim lTemp&, lenStr1&
   lenStr1& = VBA.Len(String1$)
   If CBool(lenStr1&) Then
       If CBool(VBA.LenB(String2$)) Then
           lTemp& = Len(VBA.Split(String1$, String2$)(&H0&))
           If Not (lTemp& = lenStr1&) Then
               InstrMrFrog02& = (lTemp& + &H1&)
           End If
       End If
   End If
End Function




Creo que sería conveniente no testear casi a cada función que se añade, mejor esperar al final y hacerlo todo de una vez, ¿no? :huh:

DoEvents! :P

Sanlegas

Esto no quedó muy claro
(En principio sin contar con métodos de compración)
si te refieres a que no se debe usar estructuras de decisión entonces todos perdimos por usar el if  :P, pero bueno si no es asi se puede usar otra función parecida a la instr  ;D
Código (vb) [Seleccionar]
Public Function InstrNew2(Start As Integer, Str1 As String, Str2 As String) As Integer
InstrNew2 = Len(Str1) - InStrRev(StrReverse(Str1), StrReverse(Str2), Start - 2) + 1
End Function

http://pastebin.ca/2036231
Aún así no le gana al instr  :¬¬  :xD