Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
Lightbulb More solution in Clear category for Lightbulb More by Atadolfo
var sumLight = (
els: Array,
startWatching?: Date,
endWatching?: Date,
operating?: number,
req?: number): number => {
type t_input = [Date, number];
type t_bulb = {ON: boolean, operating: number, lastON: Date};
type t_line = {time: Date, bulb: number, active: boolean, original: boolean};
let bulbs: t_bulb[] = new Array(els.length + 1).fill(undefined).map((v: any): t_bulb => ({ON: false, operating: operating, lastON: undefined}));
let wasON: boolean = false, isON: boolean = false, result = 0;
let lines: t_line[] = els.map((v: Date | t_input): t_line =>
Array.isArray(v) ? {time: v[0], bulb: v[1], active: true, original: true}
: {time: v, bulb: 1, active: true, original: true});
let Sort = () => lines.sort((timeA: t_line, timeB: t_line): number => timeA.time.getTime() - timeB.time.getTime());
Sort();
startWatching = startWatching || lines[0].time;
endWatching = endWatching || lines[lines.length - 1].time;
for (let line: t_line, i = 0; (line = lines[i])?.time <= endWatching; i++) {
if (!line.active) continue;
bulbs[line.bulb].ON = !bulbs[line.bulb].ON;
if (bulbs[line.bulb].operating) {
if (bulbs[line.bulb].ON) {
bulbs[line.bulb].lastON = line.time;
lines.push({time: new Date(line.time.getTime() + bulbs[line.bulb].operating * 1000), bulb: line.bulb, active: true, original: false});
Sort();
} else {
bulbs[line.bulb].operating -= (line.time.getTime() - bulbs[line.bulb].lastON.getTime()) / 1000;
for (let j = i + 1; j < lines.length; j++)
if (lines[j].bulb == line.bulb)
if ((!bulbs[line.bulb].operating) || (bulbs[line.bulb].operating && !lines[j].original))
lines[j].active = false;
}
}
isON = bulbs.map((v: t_bulb) => v.ON ? "X" : "").join("").length >= (req || 1);
result += (((!wasON && isON) || (wasON && !isON)) ? (line.time >= startWatching ? line.time : startWatching).getTime() * (isON ? -1 : 1) : 0);
wasON = isON;
}
if (isON) result += endWatching.getTime();
return result / 1000;
}
Feb. 17, 2021