We are working on a security system for a badged-access room in our company’s building.
We want to find employees who badged into our secured room unusually often. We have an unordered list of names and entry times over a single day. Access times are given as numbers up to four digits in length using 24-hour time, such as “800” or “2250”.
Write a function that finds anyone who badged into the room three or more times in a one-hour period. Your function should return each of the employees who fit that criteria, plus the times that they badged in during the one-hour period. If there are multiple one-hour periods where this was true for an employee, just return the earliest one for that employee.
badge_times = [
[‘Paul’, ‘1355’],
[‘Jennifer’, ‘1910’],
[‘Jose’, ‘835’],
[‘Jose’, ‘830’],
[‘Paul’, ‘1315’],
[‘Chloe’, ‘0’],
[‘Chloe’, ‘1910’],
[‘Jose’, ‘1615’],
[‘Jose’, ‘1640’],
[‘Paul’, ‘1405’],
[‘Jose’, ‘855’],
[‘Jose’, ‘930’],
[‘Jose’, ‘915’],
[‘Jose’, ‘730’],
[‘Jose’, ‘940’],
[‘Jennifer’, ‘1335’],
[‘Jennifer’, ‘730’],
[‘Jose’, ‘1630’],
[‘Jennifer’, ‘5’],
[‘Chloe’, ‘1909’],
[‘Zhang’, ‘1’],
[‘Zhang’, ’10’],
[‘Zhang’, ‘109’],
[‘Zhang’, ‘110’],
[‘Amos’, ‘1’],
[‘Amos’, ‘2’],
[‘Amos’, ‘400’],
[‘Amos’, ‘500’],
[‘Amos’, ‘503’],
[‘Amos’, ‘504’],
[‘Amos’, ‘601’],
[‘Amos’, ‘602’],
[‘Paul’, ‘1416’],
];
Expected output (in any order)
{
Paul: [‘1315’, ‘1355’, ‘1405’],
Jose: [‘830’, ‘835’, ‘855’, ‘915’, ‘930’],
Zhang: [’10’, ‘109’, ‘110’],
Amos: [‘500’, ‘503’, ‘504’],
}
n: length of the badge records array.
const badge_records = [
['Paul', '1355'],
['Jennifer', '1910'],
['Jose', '835'],
['Jose', '830'],
['Paul', '1315'],
['Chloe', '0'],
['Chloe', '1910'],
['Jose', '1615'],
['Jose', '1640'],
['Paul', '1405'],
['Jose', '855'],
['Jose', '930'],
['Jose', '915'],
['Jose', '730'],
['Jose', '940'],
['Jennifer', '1335'],
['Jennifer', '730'],
['Jose', '1630'],
['Jennifer', '5'],
['Chloe', '1909'],
['Zhang', '1'],
['Zhang', '10'],
['Zhang', '109'],
['Zhang', '110'],
['Amos', '1'],
['Amos', '2'],
['Amos', '400'],
['Amos', '500'],
['Amos', '503'],
['Amos', '504'],
['Amos', '601'],
['Amos', '602'],
['Paul', '1416']
];
const getOftenUsersOfBadge = (records) => {
records.sort((a, b) => a[1] - b[1]);
const obj = {};
for (const [name, time] of records) {
(obj[name] || (obj[name] = [])).push(time);
}
const result = {};
for (const [key, val] of Object.entries(obj)) {
const len = val.length;
if (len >= 3) {
for (let i = 2; i < len; i++) {
if (val[i] - val[i - 2] <= 100) {
const start = i - 2;
const max = parseInt(val[start]) + 100;
while (parseInt(val[++i]) <= max) {}
result[key] = val.slice(start, i);
break;
}
}
}
}
return result;
};
console.log(getOftenUsersOfBadge(badge_records));
/* Explanation:
1) Sort the input records based on times in increasing order.
2) Build a map { name : [time1, time2, ... timen], }
3) Computing times
1 --> 00:01
101 --> 01:01
diff is 100 for 1 hour.
No need to check (i < len) in the while loop as we break the loop on first failure of condition.
*/