Foros del Web » Programando para Internet » Javascript »

hora punta en una tienda sabiendo entrada y salida de los clientes

Estas en el tema de hora punta en una tienda sabiendo entrada y salida de los clientes en el foro de Javascript en Foros del Web. Hola. Se me ha ocurrido un problema que no sé muy bien cómo cogerlo (bueno, se me ha ocurrido una idea un poco bruta). El ...
  #1 (permalink)  
Antiguo 02/08/2007, 07:54
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
hora punta en una tienda sabiendo entrada y salida de los clientes

Hola.

Se me ha ocurrido un problema que no sé muy bien cómo cogerlo (bueno, se me ha ocurrido una idea un poco bruta).


El planteamiento es este. Tenemos una tienda a la que entran clientes. Registramos la hora de entrada y la hora de salida de cada cliente en ese día. Lo que queremos obtener es el(los) minuto(s) en los que ha habido máximo de clientes dentro de la tienda. El esquema sería este:

Código PHP:
var clientes = new Array();
clientes[0] = { entrada:"16:45"salida:"16:54" }
clientes[1] = { entrada:"17:02"salida:"17:05" }
clientes[3] = { entrada:"18:12"salida:"18:26" }
... 
Y haciendo operaciones habría que saber que, por ejemplo, entre las 18:24 y las 18:27 hubo el máximo de clientes dentro de la tienda en ese día, y que fue de 7 clientes.


¿Cómo se puede hacer de una manera cómoda? De momento ideas sólo, no os esmeréis con el código


OPCIÓN 1:
La opción burra que comentaba antes se trataba de hacer un array tipo
Código PHP:
clientesDentro["16:00"] = 0;
clientesDentro["16:01"] = 0;
clientesDentro["16:02"] = 1;
... 
E irlo rellenando con los clientes que entran y salen, una especie de gráfica textual al minuto. Luego seleccionar los valores que sean máximos.

Claro que, es una idea un poco bruta...



Por eso os pregunto cuáles serían vuestras ideas para llevar a cabo el script.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.

Última edición por derkenuke; 02/08/2007 a las 07:55 Razón: clietnes en vez de clientes...
  #2 (permalink)  
Antiguo 02/08/2007, 08:25
 
Fecha de Ingreso: enero-2007
Mensajes: 405
Antigüedad: 17 años, 4 meses
Puntos: 3
Re: hora punta en una tienda sabiendo entrada y salida de los clientes

Lo estoy pensando todavia pero dejo algo...

Un cliente entra y aumenta un contador...

si el contador es mayor al que estaba antes... lo actualiza y guarda la HORA

y cuando el contador baje ... se guarda la hora...

entra cliente: ++contador
comparar:
Código PHP:
if ( contador actual){
         
actual contador;
         
hora1 "la hora que sea";
}else if(
contador actual){
         
actual contador;
         
hora2 "hora de salida";

cuando contador == actual no se hace nada

No se si sera buena la idea.... lo que me ha venio, jejeje


Saludos
  #3 (permalink)  
Antiguo 02/08/2007, 08:37
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: hora punta en una tienda sabiendo entrada y salida de los clientes

En ese caso, ¿cómo diferenciaríamos a qué hora entraron el número máximo de clientes? Al final tendremos un contador con un valor = 0 (todos los que entraron salieron) y un almacén de horas de entrada y salida que ya teníamos en el array clientesDentro. No veo manera de saber cuándo contador llega a su máximo en el día.

Un saludo y gracias por responder.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #4 (permalink)  
Antiguo 02/08/2007, 09:09
 
Fecha de Ingreso: enero-2007
Mensajes: 405
Antigüedad: 17 años, 4 meses
Puntos: 3
Re: hora punta en una tienda sabiendo entrada y salida de los clientes

Podrias poner el array clientes entero para hcer algunas pruebas???




Saludos
  #5 (permalink)  
Antiguo 02/08/2007, 11:30
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: hora punta en una tienda sabiendo entrada y salida de los clientes

Jajaj creo que me estabas leyendo el pensamiento... Lo iba a postear ahora para que se puedan hacer pruebas y todos trabajemos sobre lo mismo:

Código PHP:
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" 
Son 30 clientes que entran en la tienda por la tarde, desde las 17:00 que se abre hasta las 20:00 que se cierra (el último es un pesao y se queda preguntando cosas 9 minutos más de la cuenta... jeje). Cada cliente está dentro de la tienda un máximo de 30 minutos. Todas las horas son válidas y correctas (las he generado con otro código javascript).

Obviamente de momento no hay solución al problema (no me he puesto a hacerla a mano porque coinciden demasiados clientes, y es un lío), pero poco a poco, ya veremos como va saliendo .


Ala, a programar! jeje.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #6 (permalink)  
Antiguo 02/08/2007, 12:32
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
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.
  #7 (permalink)  
Antiguo 02/08/2007, 13:33
 
Fecha de Ingreso: agosto-2007
Mensajes: 2
Antigüedad: 16 años, 9 meses
Puntos: 0
Re: hora punta en una tienda sabiendo entrada y salida de los clientes

Cita:
Iniciado por derkenuke Ver Mensaje
E irlo rellenando con los clientes que entran y salen, una especie de gráfica textual al minuto. Luego seleccionar los valores que sean máximos.
Claro que, es una idea un poco bruta... [/INDENT]
Muy bruto, muy bruto... Me parece bastante razonable lo que propones. En términos estadísticos viene siendo así como calcular la moda de personas en la tienda basándote en un histograma. Tu solución parece más o menos buena, pero a lo mejor te resulta más interesante hacer un array con 24*12 (12 intervalos de 5 minutos en 24 horas), ponerlo a 0 y para cada cliente que está en la tienda dentro del intervalo, se le suma uno. Coges el máximo valor, y ya tienes tu intervalo de 5 minutos más popular.

En Python y en Fortran sí que se me ocurre código, pero en JS soy demasiado novato, pero es bastante sencillo!
  #8 (permalink)  
Antiguo 02/08/2007, 14:29
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: hora punta en una tienda sabiendo entrada y salida de los clientes

Cita:
Iniciado por j00z76 Ver Mensaje
Tu solución parece más o menos buena, pero a lo mejor te resulta más interesante hacer un array con 24*12 (12 intervalos de 5 minutos en 24 horas), ponerlo a 0 y para cada cliente que está en la tienda dentro del intervalo, se le suma uno. Coges el máximo valor, y ya tienes tu intervalo de 5 minutos más popular.
En principio parece menos bruto y más sencillo, aunque no tendríamos la hora de más afluencia, tendríamos los 5 minutos mas populares. Además el intervalo total no es de 24h, es de 3 horas (de 17h a 20h) pero bueno, da igual, el planteamiento es el mismo.

Además puede que de una solución equivocada (inexacta). Vamos a poner 3 intervalos:
  • INTERVALO1: entran 5 personas en la tienda, y salen 3 de esas 5. (¿cuántas contabilizamos?, el máximo ¿no? osea 5, supongo). Quedan 2.
  • INTERVALO2: Entran 4 más y sale 1, en este momento hay 5 (2 que quedaban de antes y estas 4 de valor máximo = 6, pero quizás 5*).
  • INTERVALO3: En el último intervalo salen todas las que quedan, 5.

* ¿Cual es el intervalo más popular? Según el script el INTERVALO2 (6 dentro), pero en realidad en el INTERVALO2 no se sabe si ha salido primero 1 y luego han entrado 4 (máximo 5) ó han entrado 4 y después ha salido 1 (máximo 6).
Luego el script da como solución en INTERVALO2 con 6 personas dentro, pero quizás la solución sea INTERVALO2 e INTERVALO3 con 5 personas.
No es que sea muy incorrecto, es más inexacto. ¿Esto se asume o tiene solución?


Parece sencillo pero hacer sólo esto: para cada cliente que está en la tienda dentro del intervalo, se le suma uno quizás sea un poco costoso. Tenemos que crear intervalos de 5 minutos, y luego ver quién está dentro de ese intervalo de 5 minutos, que no es fácil.



No me parece mala la solución, pero quizás sea más complicada de programar, y, ya lo siento, pero Python sólo see leer un par de líneas y Fortran ya ni hablamos jeje.


Un saludo y gracias por responder.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #9 (permalink)  
Antiguo 04/08/2007, 07:30
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
Puntos: 45
Re: hora punta en una tienda sabiendo entrada y salida de los clientes

Vale bueno, ya he simplificado el problema, y he disminuído en mucho el tiempo de cálculo. Decir que el script anterior daba el resultado incorrecto porque los clientes no salían en el minuto que decía su .salida, sino en el minuto después. Se corrige dejando sólo un < en vez de <= en la función:
Código:
Number.prototype.estaEntre = function(a,b) {
    return ( (Math.min(a,b)<=this) && (this<Math.max(a,b)) );
}
Lo sé porque hice a mano los primeros no se cuántos clientes, y algo pasaba. También porque contrasté el nuevo script con el viejo.


Pues en este nuevo script he conseguido tener en el array clientesDentro sólo los datos de las horas en los que hay eventos (y no cada minuto como tenía antes). En consecuencia este array es 1/3 de tamaño que el de la anterior versión, y su tiempo de creación y de recorrido es mucho más corto.

Lo que he hecho:
  • 1) En el array entradasSalidas guardo un registro de todo lo que ocurre en la tienda, es decir, guardo todos los eventos que ocurren. Recorro todos los .entrada y todos los .salida de los clientes. Lo que guardo aquí es "+3" si han entrado 3 clientes, o "-2" si han salido dos clientes, así de cómodo ("+0" si han salido los que han entrado en ese minuto en cuestión).
  • 2) Ahora sí, en el array clientesDentro guardo todos los eventos ordenaditos, y transformo los "+3" y "-2" en una variable que nos diga el número de clientes que hay dentro de la tienda a esa hora. Es decir, que al principio nos encontramos con "+1" en el primer evento, luego el primer registro de clientesDentro contiene 1. Si en el próximo minuto nos encontramos "+3", quiere decir que hay dentro de la tienda esos 3 más el que estaba, luego almacenamos 4. Así con todos los minutos.
  • 3) Ya sólo nos queda localizar el máximo de clientesDentro (que será el mismo array que en la primera versión, pero sin datos duplicados) y su hora punta.

El código de las funciones base (librería) es exactamente igual que la primera versión (aunque podríamos ahorrarnos un par de funciones...), y el nuevo código (con comentarios generosos) sería este:
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" }




// Lo que voy a hacer es rellenar un registro entradasSalidas. Contendrá cada hora y los clientes que entran y salen cada hora:
//        entradasSalidas["14:28"] = "+3" si es que han entrado 3 clientes a esa hora, 
//        entradasSalidas["14:34"] = "-2" si es que han salido 2 personas
var entradasSalidas = new Array();
for(var 
i=0i<clientes.lengthi++) {
    
// Hay que comprobar que existe el registro antes. Si existe hay que contabilizar lo que había entrado (o salido) más lo nuevo que entra (o sale).
    
var laEntrada entradasSalidasclientes[i].entrada ];
    if( 
laEntrada != undefined )            //ya existía en el registro! --> Ponemos el cómputo ( lo que había antes +1 entrando )
        
entradasSalidasclientes[i].entrada ] = "+"+ eval( laEntrada+"+1");
    else
        
entradasSalidasclientes[i].entrada ] = "+1";            //caso normal, no existe, lo inicializamos
    // Recomprobamos si el registro existe, porque puede hacer sido modificado (si clientes[i].entrada == clientes[i].salida)
    
var laSalida entradasSalidasclientes[i].salida ];
    if( 
laSalida != undefined )            //ya existía en el registro! --> Ponemos el cómputo ( lo que había antes -1 saliendo )
        
entradasSalidasclientes[i].salida ] = "+"+ eval( laSalida+"-1");
    else
        
entradasSalidasclientes[i].salida ] = "-1";            //caso normal, no existe, lo inicializamos
}

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

// Recorro todos los minutos entre las 17 y las 20:30 para evaluar quién está dentro en cada minuto
fecha = new Date();
var 
anterior=0;
var 
clientesDentro = new Array();
for( 
fecha.ponLaHora("17:00"); fecha.queHoraEs()!="20:31"fecha.sumaUnMinuto() ) {
    var 
hActual fecha.queHoraEs();
    var 
eS entradasSalidashActual ];        // entradaSalida actual
    
if( eS != undefined ) {
        
//e("existe "+hActual+" --> "+eS);
        
clientesDentro[hActual] = eval( anterior eS );
        
anterior clientesDentro[hActual];
    }
}


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


// Ahora tengo clientesDentro con sólo las horas en las que se producen eventos, voy a sacar los valores e intervalos máximos
var valMax 0
var horasPuntas = new Array();
for( var 
i in clientesDentro ) {
    if( 
clientesDentro[i] > valMax ) {        // máximo encontrado
        
valMax clientesDentro[i];            //reasignamos valMax
        
horasPuntas = new Array(i);            //reinicializamos horasPuntas
    
}
    else if( 
clientesDentro[i] == valMax ) {    // horaPunta encontrada
        
horasPuntashorasPuntas.length ] = i;        //añadimos una horaPunta más
    
}
}

e("LAS HORAS PUNTAS HAN SIDO "+horasPuntas+" EN LA QUE HABÍA "+valMax+" CLIENTES EN LA TIENDA.");

var 
finScript = new Date();
e("Tiempo para el cálculo: "+(finScript.getTime()-inicioScript.getTime())+" ms"); 

Tampoco es más largo que la versión anterior, pero si muy eficiente:
  • IE6 >> 16 ms.
  • FF2 >> 125 ms.
Siendo su salida:
Cita:
LAS HORAS PUNTAS HAN SIDO 19:48,19:49 EN LA QUE HABÍA 5 CLIENTES EN LA TIENDA.


Bueno, a falta de más simplificación, creo que ya hemos llegado a donde quería llegar más o menos.


Si alguien quiere comentar/aportar algo, nuevas ideas, nuevas proposiciones, por supuesto se lo agradeceré.



Un saludo
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
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 09:04.