Foros del Web » Programando para Internet » Python »

Desafió 2014 - Semana 2

Estas en el tema de Desafió 2014 - Semana 2 en el foro de Python en Foros del Web. Problema Fuiste contratado en una de esas empresas para programar con corbata, lo que significa que te encargas del desarrollo de aplicaciones empresariales. Las personas ...
  #1 (permalink)  
Antiguo 31/01/2014, 16:19
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Desafió 2014 - Semana 2

Problema
Fuiste contratado en una de esas empresas para programar con corbata, lo que significa que te encargas del desarrollo de aplicaciones empresariales. Las personas de RH (Recursos Humanos) necesitan calcular el numero de fin de semanas (Sábado y Domingo) entre 2 fechas, para hacer cálculos de nomina.

Entrada
Dos objetos de tipo datetime.date. La fecha de inicio y la de fin en ese orden.

Salida
El numero de sábados y domingos entre esas 2 fechas de manera inclusive.

Implementa tu solución en weekdays
Código Python:
Ver original
  1. from datetime import date
  2.  
  3. def weekdays(from_date, to_date):
  4.     return 0
  5.  
  6. if __name__ == '__main__':
  7.     from time import time
  8.     t1 = time()
  9.     assert weekdays(date(2013, 9, 18), date(2013, 9, 23)) == 2, "Error en test 1"
  10.     assert weekdays(date(2013, 1, 1), date(2013, 2, 1)) == 8, "Error en test 2"
  11.     assert weekdays(date(2013, 2, 2), date(2013, 2, 3)) == 2, "Error en test 3"
  12.     assert weekdays(date(1999, 1, 1), date(2000, 1, 1)) == 105, "Error en test 4"
  13.     assert weekdays(date(2004, 2, 1), date(2004, 2, 29)) == 9, "Error en test 5"
  14.     assert weekdays(date(1980, 8, 8), date(2012, 3, 3)) == 3295, "Error en test 6"
  15.     assert weekdays(date(2001, 2, 2), date(2007, 12, 31)) == 722, "Error en test 7"
  16.     assert weekdays(date(2002, 9, 9), date(2002, 9, 10)) == 0, "Error en test 8"
  17.     assert weekdays(date(2011, 1, 1), date(2012, 2, 1)) == 114, "Error en test 9"
  18.     assert weekdays(date(1995, 3, 2), date(1999, 2, 3)) == 410, "Error en test 10"
  19.     assert weekdays(date(1992, 2, 1), date(2000, 1, 1)) == 827, "Error en test 11"
  20.     assert weekdays(date(1998, 5, 1), date(2001, 2, 22)) == 294, "Error en test 12"
  21.     assert weekdays(date(2003, 8, 2), date(2005, 3, 3)) == 166, "Error en test 13"
  22.     assert weekdays(date(2010, 2, 5), date(2010, 12, 31)) == 94, "Error en test 14"
  23.     t2 = time()
  24.  
  25.     print("Tiempo de ejecucion %0.3fs" % (t2 - t1))
  26.     print("Todos los tests completados")
  #2 (permalink)  
Antiguo 01/02/2014, 07:05
 
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 8 meses
Puntos: 18
Respuesta: Desafió 2014 - Semana 2

Hecho.

Código:
Tiempo de ejecucion 0.027s
Todos los tests completados.

Gracias por tu interés razpeitia, a ver si se anima alguien más a participar.

Saludos.
  #3 (permalink)  
Antiguo 01/02/2014, 14:50
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Desafió 2014 - Semana 2

Código:
Tiempo de ejecucion 0.000s
Todos los tests completados
Al final de cada semana publicare mi solución.
  #4 (permalink)  
Antiguo 01/02/2014, 20:27
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Desafió 2014 - Semana 2

Hola,

¿Se tiene que colocar el código aquí?

Código:
Python 2.7.2
Tiempo de ejecucion 0.000s
Todos los tests completados
Para ser sincero llevaba mucho tiempo queriendo implementar este algoritmo, pero nunca había tenido la oportunidad, mi solución es puramente matemática, así que por eso supongo que tendrá que ser muy rápida.

Saludos,
  #5 (permalink)  
Antiguo 01/02/2014, 20:54
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Desafió 2014 - Semana 2

Cita:
Iniciado por HackmanC Ver Mensaje
¿Se tiene que colocar el código aquí?
De preferencia pongan el código.
  #6 (permalink)  
Antiguo 02/02/2014, 07:14
 
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 8 meses
Puntos: 18
Respuesta: Desafió 2014 - Semana 2

Bueno, hecho de dos formas:

Código Python:
Ver original
  1. from datetime import date
  2.  
  3. def weekdays(from_date, to_date):
  4.     correccion = 0
  5.     diferencia = (to_date - from_date).days + 1
  6.     dia_inicio = date.weekday(from_date)
  7.     diferencia_corregida = diferencia + dia_inicio
  8.     if dia_inicio == 6 :
  9.         correccion += -1
  10.     if diferencia_corregida % 7 == 6:
  11.         correccion += 1
  12.  
  13.     return diferencia_corregida / 7 * 2 + correccion
  14.  
  15. if __name__ == '__main__':
  16.     from time import time
  17.     t1 = time()
  18.     assert weekdays(date(2013, 9, 18), date(2013, 9, 23)) == 2, "Error en test 1"
  19.     assert weekdays(date(2013, 1, 1), date(2013, 2, 1)) == 8, "Error en test 2"
  20.     assert weekdays(date(2013, 2, 2), date(2013, 2, 3)) == 2, "Error en test 3"
  21.     assert weekdays(date(1999, 1, 1), date(2000, 1, 1)) == 105, "Error en test 4"
  22.     assert weekdays(date(2004, 2, 1), date(2004, 2, 29)) == 9, "Error en test 5"
  23.     assert weekdays(date(1980, 8, 8), date(2012, 3, 3)) == 3295, "Error en test 6"
  24.     assert weekdays(date(2001, 2, 2), date(2007, 12, 31)) == 722, "Error en test 7"
  25.     assert weekdays(date(2002, 9, 9), date(2002, 9, 10)) == 0, "Error en test 8"
  26.     assert weekdays(date(2011, 1, 1), date(2012, 2, 1)) == 114, "Error en test 9"
  27.     assert weekdays(date(1995, 3, 2), date(1999, 2, 3)) == 410, "Error en test 10"
  28.     assert weekdays(date(1992, 2, 1), date(2000, 1, 1)) == 827, "Error en test 11"
  29.     assert weekdays(date(1998, 5, 1), date(2001, 2, 22)) == 294, "Error en test 12"
  30.     assert weekdays(date(2003, 8, 2), date(2005, 3, 3)) == 166, "Error en test 13"
  31.     assert weekdays(date(2010, 2, 5), date(2010, 12, 31)) == 94, "Error en test 14"
  32.     t2 = time()
  33.  
  34.     print("Tiempo de ejecucion %0.3fs" % (t2 - t1))
  35.     print("Todos los tests completados")

Y.

Código Python:
Ver original
  1. from datetime import date, timedelta
  2.  
  3. def weekdays(from_date, to_date):
  4.  
  5.     diferencia = (to_date - from_date).days +1
  6.     count = 0
  7.     for i in xrange(diferencia):
  8.         if date.weekday(from_date) > 4:
  9.             count +=  1
  10.         from_date += timedelta(days=1)
  11.     return count
  12.  
  13. if __name__ == '__main__':
  14.     from time import time
  15.     t1 = time()
  16.     assert weekdays(date(2013, 9, 18), date(2013, 9, 23)) == 2, "Error en test 1"
  17.     assert weekdays(date(2013, 1, 1), date(2013, 2, 1)) == 8, "Error en test 2"
  18.     assert weekdays(date(2013, 2, 2), date(2013, 2, 3)) == 2, "Error en test 3"
  19.     assert weekdays(date(1999, 1, 1), date(2000, 1, 1)) == 105, "Error en test 4"
  20.     assert weekdays(date(2004, 2, 1), date(2004, 2, 29)) == 9, "Error en test 5"
  21.     assert weekdays(date(1980, 8, 8), date(2012, 3, 3)) == 3295, "Error en test 6"
  22.     assert weekdays(date(2001, 2, 2), date(2007, 12, 31)) == 722, "Error en test 7"
  23.     assert weekdays(date(2002, 9, 9), date(2002, 9, 10)) == 0, "Error en test 8"
  24.     assert weekdays(date(2011, 1, 1), date(2012, 2, 1)) == 114, "Error en test 9"
  25.     assert weekdays(date(1995, 3, 2), date(1999, 2, 3)) == 410, "Error en test 10"
  26.     assert weekdays(date(1992, 2, 1), date(2000, 1, 1)) == 827, "Error en test 11"
  27.     assert weekdays(date(1998, 5, 1), date(2001, 2, 22)) == 294, "Error en test 12"
  28.     assert weekdays(date(2003, 8, 2), date(2005, 3, 3)) == 166, "Error en test 13"
  29.     assert weekdays(date(2010, 2, 5), date(2010, 12, 31)) == 94, "Error en test 14"
  30.     t2 = time()
  31.  
  32.     print("Tiempo de ejecucion %0.3fs" % (t2 - t1))
  33.     print("Todos los tests completados")

La primera es más rápida, la segunda la encuentro mas lógica.

Saludos.
  #7 (permalink)  
Antiguo 02/02/2014, 13:24
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 9 meses
Puntos: 260
Sonrisa Respuesta: Desafió 2014 - Semana 2

Hola,

Mi versión de la solución:

Código Python:
Ver original
  1. def weekdays(from_date, to_date):
  2.     from time import mktime
  3.    
  4.     a = mktime(from_date.timetuple())
  5.     b = mktime(to_date.timetuple())
  6.    
  7.     cuatro_dias = 345600
  8.     sa = int((a + cuatro_dias) / 60 / 60 / 24 / 7)
  9.     sb = int((b + cuatro_dias) / 60 / 60 / 24 / 7)
  10.     ra = int(a / 60 / 60 / 24 % 7)
  11.     rb = int(b / 60 / 60 / 24 % 7)
  12.     c = (sb - sa) * 2
  13.    
  14.     if sa == sb:
  15.         if ra == 2 or ra == 3:
  16.             c += 1
  17.         if ra != rb and (rb == 2 or rb == 3):
  18.             c += 1
  19.     else:
  20.         if ra == 3:
  21.             c += 1
  22.         if rb == 2:
  23.             c += 1
  24.    
  25.     return c

Saludos,
  #8 (permalink)  
Antiguo 02/02/2014, 14:01
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Desafió 2014 - Semana 2

Mi versión.

Código Python:
Ver original
  1. from datetime import date
  2. from datetime import timedelta
  3.  
  4.  
  5. def next_day(some_date, day):
  6.     "day: 0 - monday ... 6 - sunday"
  7.     offset = ((7 + day) - some_date.weekday()) % 7
  8.     return some_date + timedelta(days=offset)
  9.  
  10. def count_days(from_date, to_date, day):
  11.     new_from_date = next_day(from_date, day)
  12.     if new_from_date > to_date:
  13.         return 0
  14.     else:
  15.         return ((to_date - new_from_date).days / 7 + 1)
  16.  
  17. def weekdays(from_date, to_date):
  18.     """
  19.        Count the days of rest
  20.    """
  21.     sats = count_days(from_date, to_date, 5)
  22.     suns = count_days(from_date, to_date, 6)
  23.     return sats + suns
  24.  
  25. if __name__ == '__main__':
  26.     from time import time
  27.     t1 = time()
  28.     assert weekdays(date(2013, 9, 18), date(2013, 9, 23)) == 2, "Error en test 1"
  29.     assert weekdays(date(2013, 1, 1), date(2013, 2, 1)) == 8, "Error en test 2"
  30.     assert weekdays(date(2013, 2, 2), date(2013, 2, 3)) == 2, "Error en test 3"
  31.     assert weekdays(date(1999, 1, 1), date(2000, 1, 1)) == 105, "Error en test 4"
  32.     assert weekdays(date(2004, 2, 1), date(2004, 2, 29)) == 9, "Error en test 5"
  33.     assert weekdays(date(1980, 8, 8), date(2012, 3, 3)) == 3295, "Error en test 6"
  34.     assert weekdays(date(2001, 2, 2), date(2007, 12, 31)) == 722, "Error en test 7"
  35.     assert weekdays(date(2002, 9, 9), date(2002, 9, 10)) == 0, "Error en test 8"
  36.     assert weekdays(date(2011, 1, 1), date(2012, 2, 1)) == 114, "Error en test 9"
  37.     assert weekdays(date(1995, 3, 2), date(1999, 2, 3)) == 410, "Error en test 10"
  38.     assert weekdays(date(1992, 2, 1), date(2000, 1, 1)) == 827, "Error en test 11"
  39.     assert weekdays(date(1998, 5, 1), date(2001, 2, 22)) == 294, "Error en test 12"
  40.     assert weekdays(date(2003, 8, 2), date(2005, 3, 3)) == 166, "Error en test 13"
  41.     assert weekdays(date(2010, 2, 5), date(2010, 12, 31)) == 94, "Error en test 14"
  42.     t2 = time()

Etiquetas: ip, semana
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:23.