Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

Invertir una cadena
#1

Buenas!.

¿ No creéis que invertir una cadena es algo que se puede necesitar ?. Smile

En Python existe el troceado. No creo que haya o no recuerdo una función concreta para Python que haga eso.
Normalmente no sueles ver en Python las funciones de cadenas que recuerdan al basic. Si, el troceado es bastante
potente. Aunque al principio puede parecer complejo. Con el troceado se logra invertir la cadena.

En Gambas pues es por el estilo, no la encuentro. Hice dos funciones, pero si encontráis un método mejor.

Mirando el uso de indices negativos en las funciones de cadena de Gambas (Mid por ejemplo) pues tampoco lo logré.
No uso con las funciones de cadenas de Gambas, indices negativos. Ella sola no invierte toda una cadena por lo que parece.
Quizás estoy equivocado.

Lo hice de esta forma:

GAMBAS
  1. Public Sub Main()
  2.  
  3.   Print InvierteCadena("Gambas")  
  4.   Print InvierteCadenaDos("Gambas")
  5.  
  6.  
  7. Public Function InvierteCadena(cadena As String) As String
  8.  
  9.   Dim pos As Integer
  10.   Dim cadinv As String  
  11.  
  12.   For pos = String.Len(cadena) To 1 Step -1
  13.     cadinv &= String.Mid(cadena, pos, 1)   
  14.   Next
  15.  
  16.   Return cadinv
  17.  
  18.  
  19. Public Sub InvierteCadenaDos(cadena As String) As String  
  20.   'Solo caracteres ascii
  21.  
  22.   Return (Byte[].FromString(cadena)).Reverse().ToString()
  23.  



Fijaros en el paréntesis de la segunda función, es la clave.

Saludos

"El lobo siempre será malo si sólo escuchamos a Caperucita.". El lobo.
    ¡Gracias!
#2

Usando recursividad.

GAMBAS
  1. Public Sub InvierteCadenaTres(cadena As String) As String
  2.  
  3.   If String.Len(cadena) = 1 Then
  4.     Return cadena
  5.   Else
  6.     Return InvierteCadenaTres(String.Mid(cadena, 2)) & String.Mid(cadena, 1, 1)
  7.  



Esa fue difícil. Partiendo de este enlace:

Invertir una cadena en Java usando recursividad

Añado aquí el código del ejemplo y espero eliminar el anterior.

Saludos


Archivos adjuntos
.gz OperaConCadenas-0.0.2.tar.gz Tamaño: 11.31 KB  Descargas: 0

"El lobo siempre será malo si sólo escuchamos a Caperucita.". El lobo.
    ¡Gracias!
#3

repite 10^10 veces y toma el tiempo a ver cual es mas eficiente

"Es mejor saber todo de muy poco que muy poco de todo" - anonimo
    ¡Gracias!
#4

(26-01-2021, 19:44)tercoide escribió:  repite 10^10 veces y toma el tiempo a ver cual es mas eficiente

Flaco, me he perdido. Tongue

Saludos

"El lobo siempre será malo si sólo escuchamos a Caperucita.". El lobo.
    ¡Gracias!
#5

tercoide:

Los tiempos no son muy buenos haciendo la operación que comentas. Rozan los 100uS en algunos momentos.
Si quieres más rapidez, curiosamente con la recursividad va más rápido.

GAMBAS
  1. Public Function Potencia(numero As Integer, exponente As Integer) As Long
  2.  
  3.   If exponente = 0 Then
  4.     Return 1
  5.   Else
  6.     Return numero * Potencia(numero, exponente - 1)
  7.  



Prueba.

Saludos

"El lobo siempre será malo si sólo escuchamos a Caperucita.". El lobo.
    ¡Gracias!
#6

Me referia a hacer un benchmark como este:

GAMBAS
  1. ' Gambas module file
  2.  
  3.  
  4. Public Sub Main()
  5.  
  6.   Dim i, t As Float = Timer
  7.   Dim invertida As String
  8.  
  9.   For i = 1 To 10 ^ 6
  10.     invertida = ""
  11.     invertida = InvierteCadena("Gambas y Shell")
  12.   Next
  13.   Print "Tiempo para 10^6 repeticiones: ", Timer - t, invertida
  14.  
  15.   t = Timer
  16.   For i = 1 To 10 ^ 6
  17.     invertida = ""
  18.  
  19.     invertida = InvierteCadenaDos("Gambas y Shell")
  20.   Next
  21.   Print "Tiempo para 10^6 repeticiones, metodo 2: ", Timer - t, invertida
  22.  
  23.  
  24. Public Function InvierteCadena(cadena As String) As String
  25.  
  26.   Dim pos As Integer
  27.   Dim cadinv As String
  28.  
  29.   For pos = String.Len(cadena) To 1 Step -1
  30.     cadinv &= String.Mid(cadena, pos, 1)
  31.   Next
  32.  
  33.   Return cadinv
  34.  
  35.  
  36. Public Sub InvierteCadenaDos(cadena As String) As String
  37.   'Solo caracteres ascii
  38.  
  39.   Return (Byte[].FromString(cadena)).Reverse().ToString()
  40.  




Tiempo para 10^6 repeticiones:  1,37095072399825        llehS y sabmaG
Tiempo para 10^6 repeticiones, metodo 2:        0,692488271000912       llehS y sabmaG

"Es mejor saber todo de muy poco que muy poco de todo" - anonimo
    ¡Gracias!
#7

(27-01-2021, 05:05)tercoide escribió:  Me referia a hacer un benchmark como este

Ahora lo entiendo mejor. Si me hubieras hecho una referencia. Wink

Por ejemplo, recuerdo tu último benchmark en ejemplos cuando estuviste comentando el tema de que Cairo era más rápido que Paint.
Pero eso es otra historia...(así queda con aire de misterio ). 

Gracias, tomaré como costumbre esta técnica.

Saludos

"El lobo siempre será malo si sólo escuchamos a Caperucita.". El lobo.
    ¡Gracias!
#8

GAMBAS
  1. (Byte[].FromString(cadena)).Reverse().ToString()




Ahi hay 3 funciones que no sabia ni que existían, aun Gambas nos sorprende cada tanto con su poder

"Es mejor saber todo de muy poco que muy poco de todo" - anonimo
    ¡Gracias!
#9

(27-01-2021, 22:24)tercoide escribió:  Ahi hay 3 funciones que no sabia ni que existían, aun Gambas nos sorprende cada tanto con su poder

He añadido algo más al test. ¿ Qué te parece pasar como parámetro una función ?. Y ademas eliminamos repetición de código.
GAMBAS
  1. Public Sub Main()  
  2.  
  3.   TestBenchMark("InvierteCadena", "Gambas y Shell")
  4.   TestBenchMark("InvierteCadenaDos", "Gambas y Shell")
  5.   TestBenchMark("InvierteCadenaTres", "Gambas y Shell")
  6.  
  7.  
  8. Public Function TestBenchMark(nombrefuncion As String, cadena As String)
  9.  
  10.   Dim i, t As Float
  11.   Dim cadenainvertida As String
  12.   Dim ob As Object
  13.  
  14.   ob = Me
  15.  
  16.   t = Timer
  17.   For i = 1 To 10 ^ 6
  18.     cadenainvertida = ""
  19.     cadenainvertida = Object.Call(ob, nombrefuncion, [cadena])    
  20.   Next
  21.  
  22.   Print "Tiempo para 10^6 repeticiones, método: " & nombrefuncion & " = "; Format(Timer - t, "0.######") & "s" & "\t" & " Cadena invertida: "; cadenainvertida
  23.  
  24.  
  25. Public Function InvierteCadena(cadena As String) As String
  26.  
  27.   Dim pos As Integer
  28.   Dim cadinv As String  
  29.  
  30.   For pos = String.Len(cadena) To 1 Step -1
  31.     cadinv &= String.Mid(cadena, pos, 1)   
  32.   Next
  33.  
  34.   Return cadinv
  35.  
  36.  
  37. Public Sub InvierteCadenaDos(cadena As String) As String  
  38.   'Solo caracteres ascii
  39.  
  40.   Return (Byte[].FromString(cadena)).Reverse().ToString()
  41.  
  42.  
  43. Public Sub InvierteCadenaTres(cadena As String) As String
  44.  
  45.   If String.Len(cadena) = 1 Then
  46.     Return cadena
  47.   Else
  48.     Return InvierteCadenaTres(String.Mid(cadena, 2)) & String.Mid(cadena, 1, 1)
  49.  


Cita:Tiempo para 10^6 repeticiones, método: InvierteCadena = 1,188117s        Cadena invertida: llehS y sabmaG
Tiempo para 10^6 repeticiones, método: InvierteCadenaDos = 0,617942s     Cadena invertida: llehS y sabmaG
Tiempo para 10^6 repeticiones, método: InvierteCadenaTres = 2,3332s      Cadena invertida: llehS y sabmaG

La salida a gusto del consumidor. Wink

Tarda mucho en este caso la recursividad. Sad
 Y el consumo que tiene de cpu...se puso a 50º la cpu.

Saludos

"El lobo siempre será malo si sólo escuchamos a Caperucita.". El lobo.
    ¡Gracias!
#10

Código:
Object.Call

Otra funcion que nunca use...
Idea

Con el tercer metodo, me arden los ojos ....no es casual que sea el mas lento

"Es mejor saber todo de muy poco que muy poco de todo" - anonimo
    ¡Gracias!


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)