Buscando Coincidencias En Una Palabra


Ir a la página 1, 2  Siguiente

Objetivo: Buscando Coincidencias En Una Palabra
Hola.

Hace tiempo propuse un reto de buscar una letra en una palabra, debía intentarse en una sola linea.
He hecho otro tipo de ejemplos, pretendía usar distintas formas para hacer lo mismo, pero con un código mayor.

En el primer ejemplo, devuelve un array con las posiciones donde se encuentra la letra.
Y en los restantes, he usado recursividad, el segundo ejemplo no acaba de convencerme, pero es sin usar una función de busqueda.
Y en el tercero he usado recursividad y una función para buscar las posiciones donde esta la letra.

Naturalmente el tercer ejemplo con recursividad es más rápido que el segundo.

Public Sub Main()

Dim posletra As New Integer[]

'encontrar_coincidencias1

'posletra = encontrar_coincidencias1("arboleda", "a")
'Mostrar_Array(posletra)

'encontrar_coincidencias2("gambas", "a", 1)
'encontrar_coincidencias2("esternocleidomastoideo", "e", 1)

encontrar_coincidencias3("esternocleidomastoideo", "e", 1)

End

Public Sub Mostrar_Array(lista As Integer[])

Dim elemento As Integer

For Each elemento In lista
Print elemento
Next

End

Public Function encontrar_coincidencias1(s As String, l As String) As Integer[]

Dim posiciones As New Integer[]
Dim x As Integer

For x = 1 To Len(s)
If Mid$(s, x, 1) = l Then
posiciones.Add(x)
Endif
Next
Return posiciones

End

Public Sub encontrar_coincidencias2(s As String, l As String, pos As Integer)

If pos > Len(s) Then
Return
Else
If Mid$(s, pos, 1) = l Then
Print pos
Endif
encontrar_coincidencias2(s, l, (pos + 1))
Endif

End

Public Sub encontrar_coincidencias3(s As String, l As String, pos As Integer)

pos = InStr(s, l, pos)
If pos <> 0 Then
Print pos
encontrar_coincidencias3(s, l, (pos + 1))
Else
Return
Endif

End


Como veis, he tenido que usar un parámetro para decirle que comience en la posición 1. No lo puedo hacer opcional.
Podría haber creado una variable global, pero no es bueno acostumbrarse a esto.

Ahora pregunto, ¿ Cómo haríais sin usar una variable global que las funciones recursivas devuelvan una array con las posiciones donde se encuentra la letra a buscar ?.

Saludos

Objetivo: Re: Buscando Coincidencias En Una Palabra
Hice esto:

Public Sub Main()

Dim posletra As New Integer[]

encontrar_coincidencias4("esternocleidomastoideo", "e", posletra, 1)
Mostrar_Array(posletra)

End

Public Sub Mostrar_Array(lista As Integer[])

Dim elemento As Integer

For Each elemento In lista
Print elemento
Next

End

Public Sub encontrar_coincidencias4(s As String, l As String, alista As Integer[], pos As Integer)

pos = InStr(s, l, pos)
If pos <> 0 Then
alista.Add(pos)
encontrar_coincidencias4(s, l, alista, (pos + 1))
Else
Return
Endif

End



¿ Qué opináis ?.


Saludos

última edición por Shell el Viernes, 14 Noviembre 2014, 19:53; editado 2 veces
Objetivo: Re: Buscando Coincidencias En Una Palabra
Elegante.

Perfil MP  
Objetivo: Re: Buscando Coincidencias En Una Palabra
Elegante? Vale, no digo que no, pero es una malísima práctica usar variables de un sólo carácter, y mucho peor cuando se trata de una 'ele' que puede confundirse con la i mayúscula o el uno.

Rapapolvos para shell!!

Saludos

Perfil MP  
Objetivo: Re: Buscando Coincidencias En Una Palabra
¡Qué malo eres, Jesús! No hay que confundir las "funciones de uso" con las "funciones de laboratorio". Yo suelo tener un formulario llamado Form1 sin contenido claro en mis aplicaciones. En él hago "experimentos" cuando no tengo claro lo que quiero hacer o cuando no quiero "enredar" con uno "de verdad". Sólo hay que ponerle aquello de "Establecer como clase de inicio" y palante. Está lleno de funciones como éstas.

Por cierto, estoy enredando en hacer un "filebox", a semejanza del nuevo dirBox. Ya veremos, si alguien tiene algún consejo...

Saludos.

Perfil MP  
Objetivo: Re: Buscando Coincidencias En Una Palabra
Jajaja

Estoy acostumbrado.
¿ Y ya está ?.¿ No mejorarías algo más ?.

Me refiero. ¿ Debería mejorar algo del ejemplo? ( además de los nombres de las variables)
Por ejemplo:

- Si es correcto el uso que he hecho de un tipo.
- Si en recursividad es correcto ese modo de trabajar. ( Estoy loco por hacer algo con combinatoria).

En cuanto a los nombres de las variables. Lo se, no suelo usar variables con un carácter. En vez de "l o L" debí usar letra.
Son cosas de las primeras pruebas.

Lo más curioso es que este tipo de nombres que veis tan cortos dado a una variable se ve mucho en las practicas para enseñar,
que es lo peor que se puede hacer , para no tardar mas tiempo escribiendo un nombre más correcto. (vagancia ?)

Y lo peor, es que acostumbras a una forma de hacer las cosas al que lee el ejemplo.
En otras épocas, era típico ver variables de un solo carácter. ( era según, en el Spectrum se daba mucho ).

--->[Comienzo de off-topic/]<---
Lo cierto es que Jesús tiene bastante razón. En comparación nos portamos peor los que llevamos algo de más tiempo
con la programación que los que comienzan. ( como mas golfos vamos!) ..malos vicios, malos vicios.

No podemos o no debemos cometer errores de principiante. Me parece escuchar a Jesús diciendo "Ahora preguntáis eso ?. Es que eso debías saberlo ya!." ,
...seguido de..."Parece mentira!."

Estaba pensando en escribir un mensaje a Benoit para que se pudiera tildar las variables..mmmm..Cachis no se puede con la internacionalización!.

Variables peligrosas y confusas:
Quiero que incluyan la ñ como parte del nombre de las variables, que no me gusta escribir ano. Y year no queda igual.
Mezclando churras con merinas ( son ovejas..tomaaa yaaa.. )
--->[/Fin de off-topic]<---

Saludos

Objetivo: Re: Buscando Coincidencias En Una Palabra
Mi aporte...
......perdonad, yo tambien uso unas variables de un sólo carácter:

Public Sub Main()
Dim positio As Byte[]
Dim n As Byte

positio = Rapapolvo("esternocleidomastoideo")

For Each n In positio
Print n
Next

End


Public Sub Rapapolvo(scriptum As String) As Byte[]

Dim b, j As Byte
Dim bb, pos As New Byte[]

bb = Byte[].FromString(scriptum)

Do
pos.Add(CByte(bb.Find(101, j)) + 1)
j = pos[b]
Inc b
Loop Until j = bb.Max

Return pos

End

Perfil MP  
Objetivo: Re: Buscando Coincidencias En Una Palabra
vuott escribió: [Ver mensaje]

......perdonad, yo tambien uso unas variables de un sólo carácter:





Link


Esta tarde pruebo tu ejemplo.

P.d Tengo un vecino que le dio una temporada por poner todos los días a nuestro cacho cantante RafaelI!!. ( incluso un domingo a las 9 de la mañanaaaa!!).

Saludos

Objetivo: Re: Buscando Coincidencias En Una Palabra
Shell escribió: [Ver mensaje]







lambretta-pubblicita-raffaella-carra

última edición por vuott el Domingo, 16 Noviembre 2014, 17:48; editado 2 veces
Perfil MP  
Objetivo: Re: Buscando Coincidencias En Una Palabra
Vuott:

Sabía que era "La bomba italiana", tan explosiva como siempre.

No generalizaste para una letra cualquiera en los parámetros de la función.
Fuiste directamente por el carácter "e" (101).

Podías haber usado:

..
pos.Add(CByte(bb.Find(Asc("e"), j)) + 1)
...


Directamente 101 es un poco para computadoras mas que para humanos. Se nota que vienes de "C".

Buscando el método que usaste con el array del tipo Byte. Ese método solo se incluye en Byte[]
No aparece en otros tipos de arrays dinámicos o matrices nativas. Ni siquiera en Variant[]

Byte[].FromString

Algo exclusivo. Enrevesado...pero funciona!.

Saludos

Ir a la página 1, 2  Siguiente

Página 1 de 2


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.4577s (PHP: -67% SQL: 167%)
Consultas SQL: 47 - Debug off - GZIP Activado