Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Buscando Coincidencias En Una Palabra
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Viernes, 14 Noviembre 2014, 19:53; editado 2 veces 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Buscando Coincidencias En Una Palabra 
 
Elegante.   
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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

 



 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Buscar Coincidencias En Una Palabra Shell Retos de programación 9 Jueves, 23 Octobre 2014, 00:08 Ver último mensaje
Shell
No hay nuevos mensajes Buscando Nombres De Archivos Por Coinciden... Shell General 13 Sabado, 07 Marzo 2015, 10:45 Ver último mensaje
Shell
No hay nuevos mensajes Mostrar Lista De Coincidencias En Un Combo... v3ctor Controles/Librerías/Componentes 6 Lunes, 21 Septiembre 2015, 23:59 Ver último mensaje
shordi
No hay nuevos mensajes Buscando Opinión imagomundi Bases de Datos 5 Miercoles, 01 Agosto 2018, 07:56 Ver último mensaje
calcena
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
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



  

 

cron