Comunidad Gambas-es

Versión completa: Invertir una cadena
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2
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
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
repite 10^10 veces y toma el tiempo a ver cual es mas eficiente
(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
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
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
(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
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
(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
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
Páginas: 1 2