Buenas!.
¿ No creéis que invertir una cadena es algo que se puede necesitar ?.
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
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
repite 10^10 veces y toma el tiempo a ver cual es mas eficiente
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
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
(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.
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
[code]
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.
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.
Tarda mucho en este caso la recursividad.

Y el consumo que tiene de cpu...se puso a 50º la cpu.
Saludos
Otra funcion que nunca use...
Con el tercer metodo, me arden los ojos ....no es casual que sea el mas lento