Tiempo de pantalla - FreeCodeCamp #33 Daily Challenge
3 min
Enunciado del Problema
Dado un array de siete números enteros, cada uno representa las horas de uso del teléfono por día en una semana. ¿Cuándo se considera excesivo?
- Si algún día tiene 10 horas o más.
- Si el promedio de cualquier trío de días consecutivos es mayor o igual a 8 horas.
- Si el promedio semanal es mayor o igual a 6 horas.
Análisis y Estrategia
Basta con que se cumpla una sola condición para que la función retorne true. El problema se resuelve con tres verificaciones:
- ¿Hay algún día con 10+ horas?
- ¿Algún trío consecutivo promedia 8+ horas?
- ¿El promedio semanal es 6+ horas?
Casos de Prueba
[1, 2, 3, 4, 5, 6, 7]→ false
- Ningún día supera las 10 horas, ningún trío de días consecutivos promedia 8 o más, y el promedio semanal es menor a 6.
[7, 8, 8, 4, 2, 2, 3]→ false
- No hay días de 10+, ningún trío consecutivo promedia 8 o más, y el promedio semanal es menor a 6.
[5, 6, 6, 6, 6, 6, 6]→ false
- No hay días de 10+, ningún trío consecutivo promedia 8 o más, y el promedio semanal es menor a 6.
[1, 2, 3, 11, 1, 3, 4]→ true
- El cuarto día tiene 11 horas (condición 1).
[1, 2, 3, 10, 2, 1, 0]→ true
- El cuarto día tiene 10 horas (condición 1).
[3, 3, 5, 8, 8, 9, 4]→ true
- El trío [8, 8, 9] promedia 8.33 (condición 2).
[3, 9, 4, 8, 5, 7, 6]→ true
- El trío [3, 9, 4] promedia 5.33, pero [9, 4, 8] promedia 7, [4, 8, 5] promedia 5.66, [8, 5, 7] promedia 6.66, [5, 7, 6] promedia 6, pero el promedio semanal es 6 (condición 3).
Casos edge sugeridos:
[0, 0, 0, 0, 0, 0, 0]→ false- Ningún día ni promedio supera los límites.
[6, 6, 6, 6, 6, 6, 6]→ true- El promedio semanal es exactamente 6 (condición 3).
[8, 8, 8, 1, 1, 1, 1]→ true- El trío inicial promedia 8 (condición 2).
Desarrollo de la Solución
Usamos una ventana deslizante para los promedios móviles y cortocircuitamos en cuanto se cumple una condición. Todo se puede hacer en un solo recorrido del array. El enfoque es:
- Verificar si algún día tiene 10 o más horas.
- Calcular promedios de tres días consecutivos.
- Calcular el promedio semanal.
- Retornar
truesi alguna condición se cumple, si no,false.
Diagrama de Decisión
flowchart TD A["¿Algún día ≥ 10h?"] -- Sí --> T["Demasiado tiempo"] A -- No --> B["¿Trío consecutivo promedio ≥ 8h?"] B -- Sí --> T B -- No --> C["¿Promedio semanal ≥ 6h?"] C -- Sí --> T C -- No --> F["No es excesivo"]
Implementación en Código
function tooMuchScreenTime(hours) {
let totalHours = 0
for (let i = 0; i < hours.length; i++) {
// Verificar si algún día tiene 10 o más horas
if (hours[i] >= 10) {
return true
}
totalHours += hours[i]
// Verificar promedios de tres días consecutivos
if (i >= 2) {
const threeDayAvg = (hours[i] + hours[i - 1] + hours[i - 2]) / 3
if (threeDayAvg >= 8) {
return true
}
}
}
// Calcular promedio semanal
const weeklyAvg = totalHours / hours.length
if (weeklyAvg >= 6) {
return true
}
return false
}Análisis de Complejidad
- Tiempo: (el tamaño del array es fijo)
- Espacio: (solo variables escalares)
Reflexiones y Aprendizajes
- Ventana deslizante para promedios móviles
- Cortocircuito para eficiencia
- Importancia de cubrir todos los edge cases