Buscando Coincidencias En Una Palabra


Goto page 1, 2  Next

Subject: 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

Subject: 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

Last edited by Shell on Friday, 14 November 2014, 19:53; edited 2 times in total
Subject: Re: Buscando Coincidencias En Una Palabra
Elegante.

Profile PM  
Subject: 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

Profile PM  
Subject: 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.

Profile PM  
Subject: 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

Subject: 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

Profile PM  
Subject: 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

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







lambretta-pubblicita-raffaella-carra

Last edited by vuott on Sunday, 16 November 2014, 17:48; edited 2 times in total
Profile PM  
Subject: 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

Goto page 1, 2  Next

Page 1 of 2


  
You cannot post new topics
You cannot reply to topics
You cannot edit your posts
You cannot delete your posts
You cannot vote in polls
You cannot attach files
You can download files
You cannot post calendar events

   

This is a "Lo-Fi" version of our main content. To view the full version with more information, formatting and images, please click here.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Generation Time: 0.1227s (PHP: -12% SQL: 112%)
SQL queries: 25 - Debug Off - GZIP Enabled