elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [RETO] Alternativa a Instr()
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 3 [4] 5 Ir Abajo Respuesta Imprimir
Autor Tema: [RETO] Alternativa a Instr()  (Leído 18,740 veces)
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [RETO] Alternativa a Instr()
« Respuesta #30 en: 2 Enero 2011, 02:11 am »

.
Plagiador pense que no la hibas a poner ¬¬", es en cierta manera IGUAL a la primera que puse, solo que tu usas Len a cada rato ¬¬".

Bueno, dejo mi segunda manera de hacerlo... :)
Código
  1. Private Function InstrMrFrog02&(ByVal Start&, ByVal String1$, ByVal String2$)
  2. Dim lTemp&, lenStr1&
  3.    lenStr1& = VBA.Len(String1$)
  4.    If CBool(lenStr1&) Then
  5.        If CBool(VBA.LenB(String2$)) Then
  6.            lTemp& = Len(VBA.Split(String1$, String2$)(&H0&))
  7.            If Not (lTemp& = lenStr1&) Then
  8.                InstrMrFrog02& = (lTemp& + &H1&)
  9.            End If
  10.        End If
  11.    End If
  12. 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

Teoricamente lo que estas haciendo e slo mismo que yo hice...  ¬¬".

http://foro.elhacker.net/programacion_visual_basic/reto_alternativa_a_instr-t315420.0.html;msg1562191#msg1562191

Código
  1.  
  2. Public Function RetInstr(ByVal Start As String, ByVal String1 As String, ByVal String2 As String, Optional ByVal Compare As VbCompareMethod = VbCompareMethod.vbBinaryCompare) As Long
  3. Dim lng_ST1  As Long
  4.    lng_ST1 = Len(String1)
  5.    If Not Start > lng_ST1 Then
  6.        RetInstr = Start + Len(Split(Right$(String1, lng_ST1 - Start), String2, 2, Compare)(0)) + 1
  7.        If RetInstr > lng_ST1 Then RetInstr = 0
  8.    End If
  9. End Function
  10.  
  11.  

Temibles Lunas!¡.


« Última modificación: 2 Enero 2011, 02:12 am por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [RETO] Alternativa a Instr()
« Respuesta #31 en: 2 Enero 2011, 02:21 am »

@Black
No me fije en la tuya para hacerlo, no soy tan descarado...  :¬¬ :laugh:
Pero ahora que lo dices : sí, son practicamente iguales, esta no cuenta...  :P

@Tenient101
 :xD
Me refiero al 4 argumento que trae el Instr()  ;) :
Código
  1. Compare As VbCompareMethod

DoEvents! :P


« Última modificación: 2 Enero 2011, 03:14 am por Mr. Frog © » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [RETO] Alternativa a Instr()
« Respuesta #32 en: 2 Enero 2011, 03:10 am »

.
No hay problema el algoritmo que te dige trae errores que corregi en mi otro algoritmo

http://foro.elhacker.net/programacion_visual_basic/reto_alternativa_a_instr-t315420.0.html;msg1562386#msg1562386

Código
  1.  
  2. Public Function RetInstr(ByVal Start As Long, ByVal String1 As String, ByVal String2 As String, Optional ByVal Compare As VbCompareMethod = VbCompareMethod.vbBinaryCompare) As Long
  3. Dim lng_ST1  As Long
  4.    lng_ST1 = Len(String1)
  5.    If Not Start > lng_ST1 Then
  6.        If Start = 1 Then
  7.            RetInstr = (Start + Len(Split(Right$(String1, lng_ST1 - Start), String2, 2, Compare)(0))) + 1
  8.        Else
  9.            RetInstr = (Start + Len(Split(Right$(String1, lng_ST1 - Start + 1), String2, 2, Compare)(0)))
  10.        End If
  11.        If RetInstr > lng_ST1 Then RetInstr = 0
  12.    End If
  13. End Function
  14.  
  15.  

Temibles Lunas!¡.
.
En línea

The Dark Shadow is my passion.
raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: [RETO] Alternativa a Instr()
« Respuesta #33 en: 2 Enero 2011, 03:22 am »

Alguien deberia hacer limpieza aca :xD

Mejore el sistemita de pruebas, y agrego una prueba mas (gracias BlackZeroX) se busca un string nulo :xD (se pueden hacer mas pruebas, ej buscar "abc" en "a", etc pero habria que modificar mas, hacerlo mas personalizable xD).

Y agregue que se ordene automaticamente los resultados :)

Código:

============ RETO INSTR 01/01/2011 - 11:19:42 p.m. ============
Nº de vueltas: 250
String donde buscar: Baila baila baila como Juana, baila la cubana, parece refresco de cola, a mi me parece que estás bien buena.
3 Llamadas, cada una con los siguientes parametros en 'start': 1 10 20

=== PRUEBA 1 ================
String a buscar: col
============ COMPROBACION ============
InStr: 67 67 67
Los siguientes no devuelven los mismos valores, seguido de su devolucion
============ VELOCIDAD ============
00 InStr               00,526022
01 Tenient101          02,011307
02 Tokes v2            02,248696
03 BlackZeroX          02,377656
04 Mr Frog(BlackZeroX) 02,381506
05 Raul338             02,476462
06 79137913            02,662523
07 Miseryk             03,857809
08 Tokes               03,988052
09 gaston93            06,426102
10 krabby              06,745615


=== PRUEBA 2 ================
String a buscar: la
============ COMPROBACION ============
InStr: 4 10 34
Los siguientes no devuelven los mismos valores, seguido de su devolucion
Mr. Frog(b0x) 4 4 4
============ VELOCIDAD ============
00 InStr               00,507416
01 Tenient101          02,110754
02 BlackZeroX          02,410378
03 Mr Frog(BlackZeroX) 02,412944 ' No paso la comprobacion
04 Tokes v2            02,450156
05 Raul338             02,522015
06 79137913            02,820355
07 Miseryk             03,936725
08 Tokes               04,002167
09 gaston93            05,453448
10 krabby              07,029840


=== PRUEBA 3 ================
String a buscar: Ñ
============ COMPROBACION ============
InStr: 0 0 0
Los siguientes no devuelven los mismos valores, seguido de su devolucion
============ VELOCIDAD ============
00 InStr               00,742880
01 Mr Frog(BlackZeroX) 02,393055
02 BlackZeroX          02,406528
03 gaston93            02,632368
04 krabby              02,923010
05 Raul338             22,377361
06 Tokes v2            22,565989
07 79137913            27,793681
08 Tenient101          28,396136
09 Tokes               45,295668
10 Miseryk             87,607375


=== PRUEBA 4 ================
String a buscar:
============ COMPROBACION ============
InStr: 1 10 20
Los siguientes no devuelven los mismos valores, seguido de su devolucion
Miseryk 0 0 0
gaston93 0 0 0
Mr. Frog(b0x) 0 0 0
Tokes 0 0 0
79137913 0 0 0
Tokes(raul338) -1 -1 -1
Tenient101 -1 -1 -1
BlackZeroX 0 0 0
krabby 0 0 0
============ VELOCIDAD ============
00 Miseryk             00,173146 ' No paso la comprobacion
01 79137913            00,206509 ' No paso la comprobacion
02 Raul338             00,216133
03 Tenient101          00,232173 ' No paso la comprobacion
04 krabby              00,333544 ' No paso la comprobacion
05 Mr Frog(BlackZeroX) 00,381664 ' No paso la comprobacion
06 Tokes v2            00,406686
07 InStr               00,425934
08 BlackZeroX          01,805356 ' No paso la comprobacion
09 gaston93            02,109471 ' No paso la comprobacion
10 Tokes               36,895304 ' No paso la comprobacion

Test made by Raul338. Thanks to BlackZeroX

http://www.mediafire.com/?sws0gx764h4xake

Modifique 2 lineas de mi funcion tambien! :)
En línea

krabby

Desconectado Desconectado

Mensajes: 22



Ver Perfil
Re: [RETO] Alternativa a Instr()
« Respuesta #34 en: 2 Enero 2011, 03:51 am »

propongo que para no estar codeando a cada rato haciendo pequeñas mejoras, mejor averiguamos todo lo que hace el instr , luego ponemos a prueba el instr en distintos casos para ver lo que resulta, por ejmplo: que es lo que devuelve cuando se busca cadenas vacias, o que devuelve cuando se le pasa una posicion mayor a la cadena de busqueda, etc... y luego tratamos de igualar, o mejor dicho imitar al instr y despues vemos cual de todos los codes es el mejor.


editado: Mr Frog. anda pensando en otro reto, y lo lanzas despues de este.
 ;D ;D ;D ;D
« Última modificación: 2 Enero 2011, 03:54 am por krabby » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [RETO] Alternativa a Instr()
« Respuesta #35 en: 2 Enero 2011, 07:28 am »

.
* Si String1 = "" y String2 = "" entonces se retorna 0
* Si String1 <> "" y String = "" entonces; Segun el siguiente caso
   Si Start = 1  se retorna Start
   Si Start > 1 se retorna Start
* Si string1 = "" y String2 <> "" entonces se retorna 0
* El Caso que falta Son por logica y ya esta hecho... es decir la busqueda pertiente y Retornar 0 si no se encontro o retornar la posicion donde se encontro.

Código
  1.  
  2. Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
  3.  
  4. Public Function RetInstr2(ByVal Start As Long, ByVal String1 As String, ByVal String2 As String, Optional ByVal Compare As VbCompareMethod = VbCompareMethod.vbBinaryCompare) As Long
  5. Dim lng_ST1  As Long
  6. Dim lng_ST2  As Long
  7.    lng_ST1 = lstrlenW(StrPtr(String1))
  8.    lng_ST2 = lstrlenW(StrPtr(String2))
  9.    If Start < 0 Then Start = 0
  10.    If lng_ST2 > 0 Then
  11.        If Not Start > lng_ST1 Then
  12.            If Start = 1 Then
  13.                If lng_ST2 > 1 Then
  14.                    RetInstr2 = (Start + lstrlenW(StrPtr(Split(Right$(String1, lng_ST1 - Start), String2, 2, Compare)(0)))) + 1
  15.                Else
  16.                    RetInstr2 = (Start + lstrlenW(StrPtr(Split(Right$(String1, lng_ST1), String2, 2, Compare)(0))))
  17.                End If
  18.            Else
  19.                RetInstr2 = (Start + lstrlenW(StrPtr(Split(Right$(String1, lng_ST1 - Start + 1), String2, 2, Compare)(0))))
  20.            End If
  21.            If RetInstr2 > lng_ST1 Then RetInstr2 = 0
  22.        End If
  23.    ElseIf lng_ST1 > 0 Then
  24.        RetInstr2 = Start
  25.    Else
  26.        RetInstr2 = 0
  27.    End If
  28. End Function
  29.  
  30.  

editado: Mr Frog. anda pensando en otro reto, y lo lanzas despues de este.

tengo uno y se llama zig zag mañana lo pongo...
« Última modificación: 2 Enero 2011, 08:21 am por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
krabby

Desconectado Desconectado

Mensajes: 22



Ver Perfil
Re: [RETO] Alternativa a Instr()
« Respuesta #36 en: 2 Enero 2011, 08:36 am »

Bien pues ... ya son las 2:35 am por aki y me kgo de sueño, mañana espero el reto zig zag (me suena a encriptacion) , pero weno qué será? qué será?
hasta mañana.
En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [RETO] Alternativa a Instr()
« Respuesta #37 en: 2 Enero 2011, 14:53 pm »

@BlackZeroX▓▓▒▒░░: Hasta donde yo se usar la funcion Len() de VB es mucho mas rapido, ya que VB automaticamente mete un DWORD con el tamaño de la cadena antes de ella :)

Y para todos aquellos que utilizamos un Array... recordad compilar desactivando la comprobacion de seguridad en los Arrays... si no cada vez que haces cualquier acceso al Array comprueba que el tamaño sea mayor que el indice... y eso relentiza mucho ;)
En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [RETO] Alternativa a Instr()
« Respuesta #38 en: 2 Enero 2011, 20:08 pm »

@Black
Tiene razón Karcry... testeé velocidad y se nota un ligera tardanza usando api lstrlenW() respecto a Len() de vb. :-\

@karcry
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=30761&lngWId=1
Citar
This code runs as much as 5000 times faster than VB's InStr function!
:silbar:
Jamas podreis superar a InStr()!!! >:D
Te lo dedico :-* >:D :laugh: :laugh: :laugh: :laugh:


Fue divertido el reto, a ver si retomamos los retos poco a poco en esta sección, que es una forma divertida de pasar el rato y mejorar/aprender... ;D
Ahora a por el de Black! :)
http://goo.gl/7Wkqb

DoEvents! :P
« Última modificación: 2 Enero 2011, 20:13 pm por Mr. Frog © » En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: [RETO] Alternativa a Instr()
« Respuesta #39 en: 3 Enero 2011, 00:28 am »

Veo que varios usaron Split, sin embargo creo recordar que habiamos puesto un reto tratando de reemplazar a Split :xD

Nose si podriamos juntarlos (no encuetro el thread) :P nose , se me ocurre :)
En línea

Páginas: 1 2 3 [4] 5 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[AYUDA] Usar INSTR 2 veces
Programación Visual Basic
Rudy21 5 2,897 Último mensaje 9 Julio 2008, 04:01 am
por cassiani
como cargar 100 KBs en una variable; problema con InStr
Programación Visual Basic
drakolive 5 3,047 Último mensaje 31 Diciembre 2008, 15:20 pm
por Dessa
Instr para byte arrays [src]
Programación Visual Basic
cobein 3 2,315 Último mensaje 31 Mayo 2009, 12:42 pm
por cobein
Alternativa a pow? [c] « 1 2 »
Programación C/C++
flacc 10 11,784 Último mensaje 11 Diciembre 2010, 15:25 pm
por pucheto
[ANSI C] Split(), strlen(), mid(), Instr(), strcpy(). « 1 2 »
Programación C/C++
BlackZeroX 11 10,275 Último mensaje 14 Enero 2011, 02:35 am
por Littlehorse
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines