|
Página 1 de 3
|
Pues Un Reto Os Pongo Yo:
Autor |
Mensaje |
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Pues Un Reto Os Pongo Yo:
Igual que Split devuelve un array a partir de una cadena de caracteres con los separadores que le digamos, os reto a una función que devuelva una colección pasándole una serie de subcadenas.
Ejemplo (suponiendo que la llamemos stringSplit:
StringSplit( "Albacete 5000 y una vaca. Soria ni se sabe. Madrid un mogollón",["Albacete","Ciudad Real","Madrid"])
El resultado debe ser una colección que tenga los elementos "Albacete" y el valor "5000 y una vaca", "Ciudad Real" y el valor "ni se sabe", etc.
A ver esa creatividad.
Saludos.
Edito:
Para que no os sea muy complicado vamos a suponer que no puede haber valores repetidos y que los valores van en orden. Eso sí si alguien se atreve sin esos límites, le envío por correo un gorrino vivo con un saco de pienso en la caja para que no se muera por el camino.
última edición por shordi el Domingo, 28 Septiembre 2014, 15:25; editado 1 vez
|
#1 Domingo, 28 Septiembre 2014, 13:19 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Pues Un Reto Os Pongo Yo:
Luego lo veo con más tranquilidad. Hoy estarán la mayoría de domingo.
Todos con el traje de gala!.
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#2 Domingo, 28 Septiembre 2014, 13:59 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Pues Un Reto Os Pongo Yo:
No se si yo he entiedido bien lo que escribiste. De todos modos este es el mi aporte, usando solamente funciones de cadenas:
Public Sub Main()
Dim scriptum As String = "Albacete 5000 y una vaca. Soria ni se sabe. Madrid un mogollón"
Dim scripta As String[] = ["Albacete", "Soria", "Madrid"]
Dim coll As Collection
coll = StringSplit(scriptum, scripta)
Print coll[scripta[0]]
Print coll[scripta[1]]
Print coll[scripta[2]]
End
Private Function StringSplit(s As String, ss As String[]) As Collection
Dim t, r As String
Dim sh As Short
Dim conlectio As New Collection
sh = String.InStr(s, ".")
t = Left(s, sh - 1)
r = Right(s, String.Len(s) - sh)
t = Trim(Replace(t, ss[0], Null))
conlectio.Add(t, ss[0])
sh = String.InStr(r, ".")
t = Left(r, sh - 1)
r = Right(r, String.Len(r) - sh)
t = Trim(Replace(t, ss[1], Null))
conlectio.Add(t, ss[1])
t = Trim(Replace(r, ss[2], Null))
conlectio.Add(t, ss[2])
Return conlectio
End
|
#3 Domingo, 28 Septiembre 2014, 15:41 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Pues Un Reto Os Pongo Yo:
¡No vale!, te has guiado por el punto y el punto puede ir o puede no ir, no es siginificativo. Tienes que guiarte por el segundo parámetro.
|
#4 Domingo, 28 Septiembre 2014, 16:52 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Pues Un Reto Os Pongo Yo:
Tienes que guiarte por el segundo parámetro.
Ah, ok.
|
#5 Domingo, 28 Septiembre 2014, 17:42 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
Re: Pues Un Reto Os Pongo Yo:
Siempre solo usando funciones de cadenas:
Public Sub Main()
Dim scriptum As String = "Albacete 5000 y una vaca. Soria ni se sabe. Madrid un mogollón"
Dim scripta As String[] = ["Albacete", "Ciudad Real", "Madrid"]
Dim coll As Collection
coll = StringSplit(scriptum, scripta)
Print coll[scripta[0]]
Print coll[scripta[1]]
Print coll[scripta[2]]
End
Private Function StringSplit(s As String, ss As String[]) As Collection
Dim t As String
Dim tt As New String[2]
Dim i As Integer
Dim j As Byte
Dim conlectio As New Collection
i = String.InStr(s, ss[2]) - 1
t = Right(s, Len(s) - i)
tt[1] = Trim(Replace(t, ss[2], Null))
s = Left(s, 44 - 2)
For i = 1 To Len(s)
If IsPunct(Mid(s, i, 1)) Then
t = Trim(Right(s, Len(s) - i))
For j = 1 To Len(t)
If IsSpace(Mid(t, j, 1)) Then
tt[0] = Right(t, Len(t) - j)
Exit
Endif
Next
Exit
Endif
Next
s = Left(s, i - 1)
t = Trim(Replace(s, ss[0], Null))
conlectio.Add(t, ss[0])
conlectio.Add(tt[0], ss[1])
conlectio.Add(tt[1], ss[2])
Return conlectio
End
|
#6 Lunes, 29 Septiembre 2014, 00:21 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Pues Un Reto Os Pongo Yo:
Uff, muy tarde para mi ahora...
No acabé de entender bien el problema. ¿ Cual se supone que es la clave y cuales los valores ?.
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#7 Lunes, 29 Septiembre 2014, 00:39 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Pues Un Reto Os Pongo Yo:
Vuott, estamos en las mismas: te basas en el punto con la función Ispunct()
Los signos de puntuación NO son significativos, ni los espacios. Sólo los elementos del segundo parámetro, el array.
Para hacerlo más claro, prueba con ésta cadena, o con la que quieras:
Dim scriptum As String = "Albacete 5000 y una vaca Soria ni se sabe Madrid un mogollón"
|
#8 Lunes, 29 Septiembre 2014, 09:36 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Pues Un Reto Os Pongo Yo:
Shell:
En este ejemplo la colección debe devolver como clave los nombres de las ciudades y como valores la cadena que haya después del nombre hasta el siguiente nombre.
No sé si me explico.
Tienes una lista de todas las capitales de provincias españolas :
dim arprovincias as string[]=["A Coruña","Alava","Albacete","Alicante","Almería","Asturias","Avila","Badajoz","Barcelona","Burgos","Cáceres","Cádiz","Cantabria","Castellón","Ceuta","Ciudad Real","Córdoba","Cuenca","Girona","Granada","Guadalajara","Guipúzcoa","Huelva","Huesca","Illes Balears","Jaén","La Rioja","Las Palmas","León","Lleida","Lugo","Madrid","Málaga","Melilla","Murcia","Navarra","Ourense","Palencia","Pontevedra","Salamanca","Santa Cruz de Tenerife","Segovia","Sevilla","Soria","Tarragona","Teruel","Toledo","Valencia","Valladolid","Vizcaya","Zamora","Zaragoza"]
Imagina que has recibido un fichero de texto con los resultados de las impresiones de un viaje o de lo que sea, metidos caóticamente por ciudades. Ni siquiera están todas las ciudades. Ni siquiera están divididos por enter o puntos o nada identificable.
algo así:
dim sfichero as string = "A Coruña es bonita, Alava no tiene nada que envidiar.
Albacete sin cuestas
Asturias se come muy bien pero Cuenca ¡es preciosa oiga!
Lugo ...
Madrid lleno de gente. Santa Cruz de Tenerife hay que ir en barco"
La colección debe contener como clave el nombre de la ciudad y como valor el comentario del viaje. Puedes sacar las ciudades no mencionadas con valores vacíos o no sacarlas, a tu gusto.
Por la caótica entrada de datos, la función debe ser insensible a mayúsculas y minúsculas, claro.
Para no hacerlo más difícil, vamos a suponer que los nombres de ciudad no están repetidos....
....y, por supuesto, sólo puedes usar funciones de gambas, nada de editores en stream o cosas así.
última edición por shordi el Lunes, 29 Septiembre 2014, 09:53; editado 1 vez
|
#9 Lunes, 29 Septiembre 2014, 09:52 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Pues Un Reto Os Pongo Yo:
Shordi.
Creo que lo entendí, hago un ejemplo simple de las provincias y lo subo para comentar. A ver que opinas.
Pero muy simple..
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#10 Lunes, 29 Septiembre 2014, 13:22 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 3
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
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
|
|
|
|
|