Comunidad Gambas-es
Invertir una cadena - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: General (https://gambas-es.org/forum-4.html)
+--- Tema: Invertir una cadena (/thread-246.html)

Páginas: 1 2


Invertir una cadena - Shell - 26-01-2021

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:

Código:
Public Sub Main()
 
  Print InvierteCadena("Gambas")  
  Print InvierteCadenaDos("Gambas")
 
End

Public Function InvierteCadena(cadena As String) As String
 
  Dim pos As Integer
  Dim cadinv As String  
 
  For pos = String.Len(cadena) To 1 Step -1
    cadinv &= String.Mid(cadena, pos, 1)   
  Next
 
  Return cadinv
 
End

Public Sub InvierteCadenaDos(cadena As String) As String  
  'Solo caracteres ascii
 
  Return (Byte[].FromString(cadena)).Reverse().ToString()
 
End

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

Saludos


RE: Invertir una cadena - Shell - 26-01-2021

Usando recursividad.

Código:
Public Sub InvierteCadenaTres(cadena As String) As String
 
  If String.Len(cadena) = 1 Then
    Return cadena
  Else
    Return InvierteCadenaTres(String.Mid(cadena, 2)) & String.Mid(cadena, 1, 1)
  Endif
 
End

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


RE: Invertir una cadena - tercoide - 26-01-2021

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


RE: Invertir una cadena - Shell - 26-01-2021

(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


RE: Invertir una cadena - Shell - 26-01-2021

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.

Código:
Public Function Potencia(numero As Integer, exponente As Integer) As Long
 
  If exponente = 0 Then
    Return 1
  Else
    Return numero * Potencia(numero, exponente - 1)
  Endif
 
End

Prueba.

Saludos


RE: Invertir una cadena - tercoide - 27-01-2021

Me referia a hacer un benchmark como este:

Código:
' Gambas module file


Public Sub Main()

  Dim i, t As Float = Timer
  Dim invertida As String

  For i = 1 To 10 ^ 6
    invertida = ""
    invertida = InvierteCadena("Gambas y Shell")
  Next
  Print "Tiempo para 10^6 repeticiones: ", Timer - t, invertida

  t = Timer
  For i = 1 To 10 ^ 6
    invertida = ""

    invertida = InvierteCadenaDos("Gambas y Shell")
  Next
  Print "Tiempo para 10^6 repeticiones, metodo 2: ", Timer - t, invertida

End

Public Function InvierteCadena(cadena As String) As String

  Dim pos As Integer
  Dim cadinv As String

  For pos = String.Len(cadena) To 1 Step -1
    cadinv &= String.Mid(cadena, pos, 1)
  Next

  Return cadinv

End

Public Sub InvierteCadenaDos(cadena As String) As String
  'Solo caracteres ascii

  Return (Byte[].FromString(cadena)).Reverse().ToString()

End


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


RE: Invertir una cadena - Shell - 27-01-2021

(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


RE: Invertir una cadena - tercoide - 27-01-2021

[code]


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


RE: Invertir una cadena - Shell - 27-01-2021

(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.
Código:
Public Sub Main()  
 
  TestBenchMark("InvierteCadena", "Gambas y Shell")
  TestBenchMark("InvierteCadenaDos", "Gambas y Shell")
  TestBenchMark("InvierteCadenaTres", "Gambas y Shell")
 
End

Public Function TestBenchMark(nombrefuncion As String, cadena As String)

  Dim i, t As Float
  Dim cadenainvertida As String
  Dim ob As Object
 
  ob = Me
 
  t = Timer
  For i = 1 To 10 ^ 6
    cadenainvertida = ""
    cadenainvertida = Object.Call(ob, nombrefuncion, [cadena])    
  Next
 
  Print "Tiempo para 10^6 repeticiones, método: " & nombrefuncion & " = "; Format(Timer - t, "0.######") & "s" & "\t" & " Cadena invertida: "; cadenainvertida
 
End

Public Function InvierteCadena(cadena As String) As String
 
  Dim pos As Integer
  Dim cadinv As String  
 
  For pos = String.Len(cadena) To 1 Step -1
    cadinv &= String.Mid(cadena, pos, 1)   
  Next
 
  Return cadinv
 
End

Public Sub InvierteCadenaDos(cadena As String) As String  
  'Solo caracteres ascii
 
  Return (Byte[].FromString(cadena)).Reverse().ToString()
 
End

Public Sub InvierteCadenaTres(cadena As String) As String
 
  If String.Len(cadena) = 1 Then
    Return cadena
  Else
    Return InvierteCadenaTres(String.Mid(cadena, 2)) & String.Mid(cadena, 1, 1)
  Endif
 
End
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


RE: Invertir una cadena - tercoide - 28-01-2021

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