[Reto] IsHour

Iniciado por Sanlegas, 15 Septiembre 2011, 04:16 AM

0 Miembros y 1 Visitante están viendo este tema.

Psyke1

¿Ahora mejor? :xD :-*

DoEvents! :P

raul338

Usando el mismo estilo de prueba que use en IsDate :rolleyes:

=== Reto IsHour ====
09-15-2011 18:41:27

Testeo de calidad
==============================
00:00:00 Psyke1 FAILS

Testeo de falsos
==============================
5:59:59 Psyke1 FAILS


Testeo de velocidades
==============================
300000 vueltas

413,168 msec BlackZeroX
1.198,057 msec Psyke1
572,217 msec Psyke14
215,601 msec raul338

BlackZeroX

Cita de: Psyke1 en 15 Septiembre 2011, 22:37 PM
¿Ahora mejor? :xD :-*

Sigue igual... ya que para sumar un numero a un valor guardado en una string se recurre al BadTypeConvert/EvilTypeConvert, lo digo solo por que a simple vista un "Novato/Intermedio" puede confundirse un poco y por eso no me gusta, no se digiere rapido, aun asi genial funcion!¡.

P.D.:
    Sigues en CrazedCountryRebels?, estuve en españa hace 1 mes (vacaciones) y busque ese restaurante o lo que sea no lo haye jajaja... si era españa vdd?

Dulces Lunas!¡.
The Dark Shadow is my passion.

Psyke1

#13
@BlackZero
Ahh, ok, te lo había copiado de un código tuyo de no sé donde... :silbar:
Viniste a España y no me avisas. :-( :xD
Sí, sigo en el grupo, sé que no es muy metal para ti, pero bueno... :laugh: ;)

@raul
Gracias, corregida... :)
Que listo, justo pruebas con mis funciones lentas... :rolleyes:
Si probamos con mi función más rápida IsHour_Psyke12 las cosas cambian. :silbar:


Option Explicit

Private Declare Sub RtlMoveMemory Lib "kernel32" (ByVal pDst As Long, ByVal pSrc As Long, ByVal ByteLen As Long)
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Form_Load()
Dim t As New CTiming, c As New Class1, i&, r&, a$(), b As Boolean

   Me.AutoRedraw = True
   a() = Split("34:23:45 5:59:59 10:45:67 raulfeo 00:00:00 14:57:79 111:23:4", " ")
   
   t.Reset
   For i = 0 To 200000
       For r = 0 To 6
           b = IsHour_r338(a(r))
       Next
   Next
   Me.Print t.sElapsed, "raul338"
   Sleep 1000
   
   t.Reset
   For i = 0 To 200000
       For r = 0 To 6
           b = isHour_BlackZX(a(r))
       Next
   Next
   Me.Print t.sElapsed, "Black"
   Sleep 1000
   
   t.Reset
   For i = 0 To 200000
       For r = 0 To 6
           b = c.IsHour_Psyke12(a(r))
       Next
   Next
   Me.Print t.sElapsed, , "Psyke13"

   Set c = Nothing
   Set t = Nothing
End Sub


Resultado:


DoEvents! :P


BlackZeroX

@ A mi criterio ni la de Raul338 ni la mia son legiles (me tarde un poco en entender la de Raul338, mas que nada como comprobaba los rangos, ya que esta dispersa esa region)... y la mia esta un poco ofuscada... mas aun sin comentarios, almenos que seas yo  :xD.

Para mi la funcion mas rapida y legible es la de IsHour_Psyke12, no tengo que comprobarla para saber eso.

Dulces Lunas!¡.
The Dark Shadow is my passion.

Elemental Code

Rustic Mode ON!
[Rustic]

Código (vb) [Seleccionar]
Public Function eCode(ByRef Time As String) As Boolean
    On Error GoTo Fallo
    If Len(Time) <> 8 Then Exit Function
    Dim sTime() As String
    sTime = Split(Time, ":")
    If CLng(sTime(0)) >= 0 And CLng(sTime(0)) <= 23 And _
       CLng(sTime(1)) >= 0 And CLng(sTime(1)) <= 59 And _
       CLng(sTime(2)) >= 0 And CLng(sTime(2)) <= 59 Then eCode = True
Fallo:
End Function


[/Rustic]

I CODE FOR $$$
Programo por $$$
Hago tareas, trabajos para la facultad, lo que sea en VB6.0

Mis programas

Sanlegas

Bueno aqui el mio...  ;D

Código (vb) [Seleccionar]
Public Function IsHour(ByRef Expresion As String) As Boolean
Dim C()         As Byte
Dim L           As Integer
Dim P           As Integer
Dim F           As Boolean

L = Len(Expresion)
If (L And &H8) Then
    L = (L - &H8)
    If (L Or &H0) = &H0 Then
        C = StrConv(Expresion, vbFromUnicode)
        P = &H2
Sig0:
        L = C(P)
        If (L And &H20) Then
            L = (L - &H20)
            If (L And &H10) Then
                L = (L - &H10)
                If (L And &H8) Then
                    L = (L - &H8)
                    If (L And &H2) Then
                        L = (L - &H2)
                        If (L Or &H0) = &H0 Then
                            If (P And &H4) Then
                                GoTo Sig
                            Else
                                P = &H5
                                GoTo Sig0
                            End If
                        End If
                    End If
                End If
            End If
        End If
        Exit Function
Sig:
        L = C(0)
        L = (L - &H33)
        If (L And &H40) Then
            L = (C(0) - &H30)
            If (L And &H40) Then
                Exit Function
            Else
                If (L And &H2) Then F = True
                GoTo Sig2
            End If
        End If
        Exit Function
Sig2:
        L = C(1)
        L = (L - &H3A)
        If (L And &H40) Then
            L = (-&HB - L)
            If (L And &H10) Then
                L = ((Not L) - &H4)
                If (L And &H4) Then
                    GoTo Sig3
                Else
                    If Not F Then GoTo Sig3
                End If
            End If
        End If
        Exit Function
Sig3:
        P = &H3
Sig4:
        L = C(P)
        L = (L - &H36)
        If (L And &H40) Then
            L = (-L - &H7)
            If (L And &H8) Then
                P = (P + &H3)
                If (P And &H8) Then
                    P = &H4
                    GoTo Sig5
                Else
                    GoTo Sig4
                End If
            End If
        End If
        Exit Function
Sig5:
        L = C(P)
        L = (L - &H3A)
        If (L And &H40) Then
            L = (-L - &HB)
            If (L And &H10) Then
                P = (P + &H3)
                If (P And &H8) Then IsHour = True Else GoTo Sig5
            End If
        End If
    End If
End If
End Function


Alguien puede subir el proyecto completo del reto?, salu2 !

BlackZeroX

#17
Cita de: Psyke1 en 16 Septiembre 2011, 00:43 AM
@BlackZero
Ahh, ok, te lo había copiado de un código tuyo de no sé donde... :silbar:

lo se pero yo lo hacia de la manera (Solo en/para numeros).

TipoNumerico1 = (TipoNumerico1.2 + TipoNumerico2)

Donde: TipoNumerico1.2 es del mismo tipo que TipoNumerico1 pero con valor 0... y el tipo resultante sera del tipo TipoNumerico1.2, mas no del TipoNumerico2...

ej.:

Código (vb) [Seleccionar]


dim lVal as long
dim bVal as byte

lval = (&H0 + bVal)



y tu lo haces de una manera un poco mas ofuscada... ya que como sabras si pones

Código (vb) [Seleccionar]


dim lVal as long
Const VAL as string = "10"

VAL
lval = (&H0 + VAL) ' // mas no (VAL + &H0)



Realizara su trabajo, pero le das mas trabajo independiente a el lenguaje y sabra solo el que resultados salgan... ya que como sabras "10" se deberia transformar a un valor de tipo numerico (Lo que yo hago en mi codigo y que seguro Raul338 me copio..  :xD :xD na no te creas es un gran programador  ;) :))
The Dark Shadow is my passion.