elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [RETO] IsDate
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: [RETO] IsDate  (Leído 12,343 veces)
raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
[RETO] IsDate
« en: 28 Agosto 2011, 20:09 pm »

Bueno, para seguir con esto de los retos y hacer que haya mas actividad competitiva y cooperativa (y no tantas dudas :xD) propongo hacer la alternativa a la función IsDate con la siguiente firma

Código
  1. Function IsDate_Nombre(str As String) As Boolean
  2. Function IsDate_Nombre_vX(str As String) As Boolean
  3. 'Ejemplos
  4. Function IsDate_r338(str As String) As Boolean
  5. Function IsDate_r338_v2(str As String) As Boolean
  6. Function IsDate_7913(str As String) As Boolean
  7.  

Tienen hasta el 5/09/2011 para proponer sus funciones bien pulidas y ahí las pondré a prueba  ::)

  • Para medir los tiempos se utilizará la clase CTiming utilizada en otros retos (Ver ejemplo de como se utiliza)
  • Se recomiendan usar API's, otras funciones, ASM, lo que se les ocurra
  • No te inhibes, mientras mas concursantes participen, mejor!
  • No es estrictamente necesario que sea igual que IsDate (como paso con IsNumeric que "1..2..3" era un numero, WTF!) tan solo debe validar fechas
  • Debe aceptar desde 01/01/0000 hasta 31/12/9999
  • La fecha DEBE ser valida, deben fijarse si el año es bisiesto, no debe devolver TRUE en un dia 31 con un mes que solo tiene 30 dias
  • Puede aceptar en distintos formatos, pero la mayoría de las pruebas las haré con "DD/MM/YYYY" para no presionar tanto
    • 1/1/2000
    • 01/01/2000
    • 1/1/00
    • 01/01/00
  • Sobre los separadores y el formato por default tomare "DD/MM/YYYY" con "/" como separador, aunque hay rutinas para obtener el formato y el separador :P
Código
  1. Private Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long
  2.  
  3. Function GetDateSeparator() As String
  4.    Dim strLen As Long
  5.    GetDateSeparator = String$(5, 0)
  6.    strLen = GetProfileString("Intl", "sDate", "", GetDateSeparator, Len(GetDateSeparator))
  7.    GetDateSeparator = Left$(GetDateSeparator, strLen)
  8. End Function
  9.  
  10. Function GetDateFormat() As String
  11.    Dim strLen As Long
  12.    GetDateFormat = String$(11, 0)
  13.    strLen = GetProfileString("Intl", "sShortDate", "", GetDateFormat, Len(GetDateFormat))
  14.    GetDateFormat = Left$(GetDateFormat, strLen)
  15. End Function
  16.  


Por el momento con estas fechas debe devolver true
Código:
31/07/2000
30/07/2000
01/02/2000
25/05/2002
15/07/2000
28/02/2001
31/05/2001
30/12/2011
29/02/2004

Y con estas false
Código:
01/00/2011 ' No existe Mes 00
31/04/2001 ' Abril no tiene 31 xD
00/12/2011 ' Dia 00, WTF
00/00/2011 ' Dia 00, Mes 00, WTF x2
01/13/2011 ' Mes 13, WTF!
30/02/2001 ' Febrero NUNCA tendra 30
29/02/2003 ' 2003 No es bisiesto :3

Suerte a todos  ;D ;-) y repito

No te inhibes, mientras mas concursantes participen, mejor!


« Última modificación: 28 Agosto 2011, 22:31 pm por raul338 » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [RETO] IsDate
« Respuesta #1 en: 28 Agosto 2011, 21:37 pm »

.
Espacios en blanco?... = valen o se descartan...

Dulces Lunas!¡.


En línea

The Dark Shadow is my passion.
ignorantev1.1


Desconectado Desconectado

Mensajes: 617


/\ Así acabo cuando quiero programar...


Ver Perfil WWW
Re: [RETO] IsDate
« Respuesta #2 en: 28 Agosto 2011, 21:44 pm »

Código
  1. Function heyIgnorante_isDate(ByVal sDate As String) As Boolean
  2.    Dim elemts() As String
  3.    Dim D As Integer, M As Integer, A As Integer
  4.  
  5.    sDate = Trim$(sDate)
  6.    elemnts = Split(sDate, "/")
  7.  
  8.    If UBound(elemnts) <> 2 Then Exit Function
  9.  
  10.    D = Val(elemnts(0)): M = Val(elemnts(1)): A = Val(elemnts(2))
  11.  
  12.    If D > 31 Or D < 1 Or M > 12 Or M < 1 Or A > 9999 Or A < 0 Then Exit Function
  13.  
  14.    If ((M < 8 And M Mod 2 = 0) Or (M > 7 And M Mod 2 = 1)) And D > 30 Then Exit Function
  15.  
  16.    If (A Mod 4 <> 0 And M = 2 And D > 28) Or _
  17.    (A Mod 100 = 0 And A Mod 400 <> 0) Then
  18.         Exit Function
  19.    End If
  20.    heyIgnorante_isDate = True
  21. End Function
  22.  

A ver, aquí esta mi archirecontraultrasupermegavegetarianamarcianarobotpirata función...
Bastante básica, pero pasó las pruebas que pusiste y solo a eso se limita.

No mencionaste sobre... los... emmm... no sé como llamarlos, los caracteres que dividen día, mes, año: "/" <---- así que solo acepta este...

Saludos!

Edite: ¡JUM! :¬¬, @BlackZeroX▓▓▒▒░░
« Última modificación: 3 Septiembre 2011, 05:22 am por ignorantev1.1 » En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: [RETO] IsDate
« Respuesta #3 en: 28 Agosto 2011, 22:15 pm »

bueno yo creo que la funcion debe de tener las misma caracteristicas de la funcion isdate :P sino no se llamara del todo reemplazo de la funcion :P y pienso que raul338 dio informacion adicional acerca de la funcion isdate :P y no creo que no se referia a restricciones o adiciones a nuestra funcion :P
En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: [RETO] IsDate
« Respuesta #4 en: 28 Agosto 2011, 22:18 pm »

Espacios en blanco?... = valen o se descartan...
Sin espacios.. solo numeros y "/"

bueno yo creo que la funcion debe de tener las misma caracteristicas de la funcion isdate :P sino no se llamara del todo reemplazo de la funcion :P
Pero no puse que sea "reemplazo" :xD

Ahi agrego un edit sobre el "/"
En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: [RETO] IsDate
« Respuesta #5 en: 28 Agosto 2011, 22:26 pm »

Sin espacios.. solo numeros y "/"
Pero no puse que sea "reemplazo" :xD


"Bueno, para seguir con esto de los retos y hacer que haya mas actividad competitiva y cooperativa (y no tantas dudas ) propongo hacer el reemplazo a la función IsDate con la siguiente firma"

 :¬¬

v_v'
En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: [RETO] IsDate
« Respuesta #6 en: 28 Agosto 2011, 22:32 pm »

@Raul100: No era la intencion :xD

Ahi puse un codigo para obtener el formato y el separador, por si alguien quiere experimentar a  futuro
En línea

79137913


Desconectado Desconectado

Mensajes: 1.169


4 Esquinas


Ver Perfil WWW
Re: [RETO] IsDate
« Respuesta #7 en: 28 Agosto 2011, 22:44 pm »

HOLA!!!

Me puse a ver que podia hacer y salio esto:
Uso GoTos no me reten :P
/Ofuscando codigo :P/

VERSION 2.0
Código
  1. Private Function IsDate_7913_v2(str As String) As Boolean
  2. On Error GoTo Fin
  3. Dim Partes(2) As Long
  4. Dim Primer() As String
  5.    Primer = Split(str, "/")
  6.    If UBound(Primer) <> 2 Then GoTo Fin
  7.    Partes(0) = Primer(0): Partes(1) = Primer(1): Partes(2) = Primer(2)
  8.    If Partes(2) > 9999 Then GoTo Fin
  9.    Select Case Partes(1) 'verificamos el mes
  10.        Case 0
  11.            GoTo Fin
  12.        Case 1, 3, 5, 7, 8, 10, 12 'si es de 31 dias
  13.            Select Case Partes(0) 'verificamos el dia
  14.                Case Is > 31
  15.                    GoTo Fin 'si es mayor que 31 es false
  16.                Case Is < 1
  17.                    GoTo Fin 'si es menor que 1 es false
  18.                Case Else
  19.                    IsDate_7913_v2 = True : GoTo Fin 'sino true
  20.            End Select
  21.        Case 4, 6, 9, 11 'si es de 30 dias
  22.            Select Case Partes(0)
  23.                Case Is > 30
  24.                    GoTo Fin
  25.                Case Is < 1
  26.                    GoTo Fin
  27.                Case Else
  28.                    IsDate_7913_v2 = True : GoTo Fin
  29.            End Select
  30.        Case 2 'si es febrero
  31.            Select Case Partes(0)
  32.                Case Is > 29 'si es mayor que 29
  33.                    GoTo Fin
  34.                Case Is < 1 ' si es menor a 1
  35.                    GoTo Fin
  36.                Case 29
  37.                    If Partes(2) Mod 4 = 0 Then
  38.                        If Partes(2) Mod 100 = 0 Then
  39.                            If Partes(2) Mod 400 = 0 Then IsDate_7913_v2 = True 'si es biciesto multiplo de 100 y 400
  40.                        Else
  41.                            IsDate_7913_v2 = True : GoTo Fin  'si es biciesto
  42.                        End If
  43.                    End If
  44.                Case Else
  45.                    IsDate_7913_v2 = True : GoTo Fin
  46.            End Select
  47.        End Select
  48. Fin:
  49. End Function
  50.  

GRACIAS POR LEER!!!
« Última modificación: 1 Septiembre 2011, 15:22 pm por 79137913 » En línea

"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

 79137913                          *Shadow Scouts Team*
$Edu$


Desconectado Desconectado

Mensajes: 1.842



Ver Perfil
Re: [RETO] IsDate
« Respuesta #8 en: 28 Agosto 2011, 22:50 pm »

Aca va el mio a ver que tal, no se si sera lento, pero lo intente hacer con mejor funcionalidad.

Código
  1. Option Explicit
  2.  
  3. Private Sub Form_Load()
  4. Debug.Print "------CORRECTAS-------"
  5. Debug.Print isDate_edu("31/07/2000")
  6. Debug.Print isDate_edu("30/07/2000")
  7. Debug.Print isDate_edu("01/02/2000")
  8. Debug.Print isDate_edu("25/05/2002")
  9. Debug.Print isDate_edu("15/07/2000")
  10. Debug.Print isDate_edu("28/02/2001")
  11. Debug.Print isDate_edu("31/05/2001")
  12. Debug.Print isDate_edu("30/12/2011")
  13. Debug.Print isDate_edu("29/02/2004")
  14.  
  15. Debug.Print "------FALSAS----------"
  16. Debug.Print isDate_edu("01/00/2011")
  17. Debug.Print isDate_edu("31/04/2001")
  18. Debug.Print isDate_edu("00/12/2011")
  19. Debug.Print isDate_edu("00/00/2011")
  20. Debug.Print isDate_edu("01/13/2011")
  21. Debug.Print isDate_edu("30/02/2001")
  22. Debug.Print isDate_edu("29/02/2003")
  23.  
  24. End Sub
  25.  
  26. Function isDate_edu(str As String) As Boolean
  27.  
  28.    Dim dato() As String
  29.    Dim anno, mes, dia As String
  30.  
  31. str = Trim$(str)
  32.  
  33. dato = Split(str, "/")
  34.  
  35. If UBound(dato) <> 2 Then Exit Function
  36.  
  37. dia = Val(dato(0))
  38. mes = Val(dato(1))
  39. anno = Val(dato(2))
  40.  
  41. If anno < 1 Or mes < 1 Or dia < 1 Then Exit Function
  42. If mes > 12 Or dia > 31 Then Exit Function
  43.  
  44. If (Not mes And 1) And (mes <> 8) And (dia > 30) Then Exit Function
  45.  
  46. If (mes = 2 And dia > 28) And Not (anno Mod 4 = 0 And Not (anno Mod 100 = 0 And anno Mod 400 <> 0)) Then Exit Function
  47.  
  48. isDate_edu = True
  49. End Function
  50.  

Acuerdense que hay una exepcion para lo de los años biciestros, pueden mirar mi codigo y despues eso que pusiste ignore.. un año mayor que 9999 no puede ser? xD
« Última modificación: 28 Agosto 2011, 22:52 pm por $Edu$ » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [RETO] IsDate
« Respuesta #9 en: 28 Agosto 2011, 23:27 pm »

un dato a añadir...

Un año es bisiesto si es divisible entre 4, excepto el último de cada siglo (aquel divisible por 100), salvo que este último sea divisible por 400.

Dulces Lunas!¡.
« Última modificación: 29 Agosto 2011, 00:44 am por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Reto ;)
Ingeniería Inversa
NeoKiller 3 3,232 Último mensaje 15 Agosto 2004, 23:12 pm
por NeoKiller
Reto!!
Ingeniería Inversa
HaCkZaTaN 2 3,248 Último mensaje 10 Septiembre 2004, 09:30 am
por Ðevastador
Reto vB
Ingeniería Inversa
nhouse 2 3,736 Último mensaje 16 Marzo 2005, 09:41 am
por 4rS3NI(
reto en VB6
Ingeniería Inversa
ellolo 1 2,843 Último mensaje 15 Abril 2005, 10:03 am
por UnpaCker!
Un reto !!! « 1 2 3 »
Programación Visual Basic
VirucKingX 24 9,311 Último mensaje 8 Mayo 2006, 23:36 pm
por Kizar
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines