Ver Mensaje Individual
  #6 (permalink)  
Antiguo 02/08/2007, 12:32
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 1 mes
Puntos: 45
Re: hora punta en una tienda sabiendo entrada y salida de los clientes

Bueno, tengo mi script burro jeje . Supongo que funciona correctamente, da solución, y parece lógica, aunque como dije el problema no lo he resuelto a mano, no puedo saber si es correcta.

Su librería de funciones es esta (básicamente operaciones con fecha). Una función para escribir y 10 funciones más: 6 para obtener datos (obtener horas, minutos, la hora formateada...), 2 funciones de asignación (poner la hora con una cadena hh:mm y sumar un minuto a la hora) y 2 funciones para saber si una hora está entre otras dos:
Código PHP:
function e(q,br) {
    
document.body.appendChilddocument.createTextNode(q) );
    if(!
brdocument.body.appendChilddocument.createElement("BR") );
}


// COMPLETAMOS CON CEROS A LA IZQUIERDA AQUELLOS VALORES QUE LO NECESITEN PARA VERLOS BONITOS
Date.prototype.getXXXzeroFilled = function(propiedad) {
    var 
dev this["get"+propiedad]();
    if( (
propiedad=="Milliseconds") && (dev<100) && (dev>9) ) dev "0"+dev;
    else if( 
dev<10 dev = (propiedad=="Milliseconds")?"00":"0"+dev;
    return 
dev.toString();
}
Date.prototype.getHoursZeroFilled = function() { return this.getXXXzeroFilled("Hours"); }
Date.prototype.getMinutesZeroFilled = function() { return this.getXXXzeroFilled("Minutes"); }
Date.prototype.getSecondsZeroFilled = function() { return this.getXXXzeroFilled("Seconds"); }
Date.prototype.getMillisecondsZeroFilled = function() { return this.getXXXzeroFilled("Milliseconds"); }


Date.prototype.queHoraEs = function() {
    return 
this.getHoursZeroFilled()+":"+this.getMinutesZeroFilled();
}
/* Coloca la hora con strHora, que tendrá formato hh:mm */
Date.prototype.ponLaHora = function(strHora) {
    
// tenemos que calcular el número de milisegundos que representa hh:mm --> es (hh-1)*60*60*1000 + mm*60*1000
    
var arrHora strHora.split(":");
    var 
ms = (arrHora[0]*1-1)*60*60*1000 arrHora[1]*60*1000;
    
this.setTime(ms);
}
/* Suma un minuto a la fecha */
Date.prototype.sumaUnMinuto = function () {
    
this.setTimethis.getTime()+60*1000 );
}
/* Mira a ver si un numero se encuentra en el intervalo (a,b) o (b,a) */
Number.prototype.estaEntre = function(a,b) {
    return ( (
Math.min(a,b)<=this) && (this<=Math.max(a,b)) );
}
/* Mira a ver si la fecha actual se encuenta en el rango de horas creado por strHora1 y strHora2 */
Date.prototype.estaEntre = function(strHora1strHora2) {
    
//creamos los milisegundos desde strHora1 y strHora2:
    
var arrHora1 strHora1.split(":"),    arrHora2 strHora2.split(":");
    var 
ms1 = (arrHora1[0]*1-1)*60*60*1000 arrHora1[1]*60*1000,    ms2 = (arrHora2[0]*1-1)*60*60*1000 arrHora2[1]*60*1000;
    
//mis milisegundos
    
var misMS this.getTime();
    
//e("ms1="+ms1+"; ms2="+ms2+"; misMS="+misMS);
    
return misMS.estaEntre(ms1,ms2);

Y el código en sí es cortito y "fácil" de entender:
Código PHP:
var inicioScript = new Date();


// REGISTRO DE LAS ENTRADAS Y SALIDAS DE LOS CLIENTES EN LA TIENDA (17:00 - 20:00)
var clientes = new Array();
clientes[0] = { entrada"17:05"salida"17:22" 
clientes[1] = { entrada"17:08"salida"17:31" 
clientes[2] = { entrada"17:11"salida"17:15" 
clientes[3] = { entrada"17:14"salida"17:42" 
clientes[4] = { entrada"17:24"salida"17:26" 
clientes[5] = { entrada"17:24"salida"17:28" 
clientes[6] = { entrada"17:29"salida"17:46" 
clientes[7] = { entrada"17:30"salida"17:58" 
clientes[8] = { entrada"17:46"salida"17:54" 
clientes[9] = { entrada"17:48"salida"18:03" 
clientes[10] = { entrada"17:49"salida"17:56" 
clientes[11] = { entrada"18:00"salida"18:23" 
clientes[12] = { entrada"18:02"salida"18:19" 
clientes[13] = { entrada"18:13"salida"18:30" 
clientes[14] = { entrada"18:33"salida"18:49" 
clientes[15] = { entrada"18:38"salida"18:47" 
clientes[16] = { entrada"18:58"salida"19:09" 
clientes[17] = { entrada"19:04"salida"19:26" 
clientes[18] = { entrada"19:07"salida"19:34" 
clientes[19] = { entrada"19:19"salida"19:27" 
clientes[20] = { entrada"19:23"salida"19:25" 
clientes[21] = { entrada"19:27"salida"19:39" 
clientes[22] = { entrada"19:31"salida"19:31" 
clientes[23] = { entrada"19:31"salida"19:45" 
clientes[24] = { entrada"19:36"salida"19:50" 
clientes[25] = { entrada"19:40"salida"19:56" 
clientes[26] = { entrada"19:43"salida"20:01" 
clientes[27] = { entrada"19:45"salida"19:49" 
clientes[28] = { entrada"19:48"salida"20:01" 
clientes[29] = { entrada"19:49"salida"20:09" }  

var 
fecha = new Date();            // Una variable de fecha para poder trabajar con ella

// RELLENADO DEL ARRAY CLIENTESDENTRO 
var clientesDentro = new Array();
for( 
fecha.ponLaHora("17:00"); fecha.queHoraEs()!="20:31"fecha.sumaUnMinuto() ) {
    
clientesDentrofecha.queHoraEs() ]=0;
    for(var 
j=0j<clientes.lengthj++) {
        if( 
fecha.estaEntreclientes[j].entradaclientes[j].salida ) ) {
            
clientesDentro[fecha.queHoraEs()]++;
        }
    }
}

// IMPRESIÓN DE LOS CLIENTES
e("CLIENTES:");
for(var 
i in clientes) {
    for( var 
j in clientes[i] ) {
        
e("clientes["+i+"]["+j+"] = "+clientes[i][j]+"   "j!="salida");
    }
}
e(""); e("");

// IMPRESIÓN DE CLIENTESDENTRO
e("CLIENTESDENTRO:");
for(var 
j in clientesDentro ) {
    
e("clientesDentro["+j+"] = "+clientesDentro[j]);
}
e(""); e(""); 

// OBTENEMOS EL MÁXIMO DE CLIENTESDENTRO
var max=0horaMax;
for( var 
i in clientesDentro ) {
    if( 
clientesDentro[i] > max ) {
        
max clientesDentro[i];
        
horaMax i;
    }
}

e("LA HORA PUNTA ES "+horaMax+" EN LA QUE HABÍA "+clientesDentro[horaMax]+" CLIENTES EN LA TIENDA.");

var 
finScript = new Date();
e("Tiempo para el cálculo: "+(finScript.getTime()-inicioScript.getTime())+" ms"); 
Tiempos de cálculo:
  • IE6 >> 282 ms.
  • FF2 >> 468 ms.

Solución:
Cita:
LA HORA PUNTA ES 19:49 EN LA QUE HABÍA 6 CLIENTES EN LA TIENDA.

Es un poco pesadito, intentemos simplificarlo. Además es limitado, ya que sólo captura la última incidencia de máximos clientes dentro de la tienda. Es decir, no sabemos si antes también hubo 6 clientes, o durante cuanto tiempo ha habido 6 (da la casualidad que sólo hay 6 durante un sólo minuto y una vez).


Bueno, vamos a seguir pensando.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.