Páginas (2): 1 2   
Shell   26-01-2021, 01:25
#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:

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
Última modificación: 26-01-2021, 16:00 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shell   26-01-2021, 16:00
#2
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
Archivos adjuntos
.gz
OperaConCadenas-0.0.2.tar.gz (Tamaño: 11.31 KB Descargas: 0)

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
tercoide   26-01-2021, 19:44
#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
Shell   26-01-2021, 21:26
#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 conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shell   26-01-2021, 22:35
#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.

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

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
tercoide   27-01-2021, 05:05
#6
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

"Es mejor saber todo de muy poco que muy poco de todo" - anonimo
Shell   27-01-2021, 21:19
#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 conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
tercoide   27-01-2021, 22:24
#8
[code]


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
Shell   27-01-2021, 23:09
#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.
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
Última modificación: 27-01-2021, 23:14 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
tercoide   28-01-2021, 01:37
#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
Última modificación: 28-01-2021, 01:39 por tercoide.

"Es mejor saber todo de muy poco que muy poco de todo" - anonimo
Páginas (2): 1 2   
  
Usuarios navegando en este tema: 3 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.