JavaScript
const mismatches = (records) => {
const obj = {};
const notExited = [];
const notEntered = [];
for (const [name, state] of records) {
if (!(name in obj)) {
obj[name] = 0;
}
if (state === 'enter') {
obj[name]++;
} else {
obj[name]--;
}
if (obj[name] > 1) {
if (!notExited.includes(name)) {
notExited.push(name);
}
obj[name] = 0;
}
if (obj[name] < 0) {
if (!notEntered.includes(name)) {
notEntered.push(name);
}
obj[name] = 0;
}
}
for (const [key, val] of Object.entries(obj)) {
if (val === 1) {
if (!notExited.includes(key)) {
notExited.push(key);
}
}
}
return [notExited, notEntered];
};
console.log(mismatches([
["Martha", "exit"],
["Paul", "enter"],
["Martha", "enter"],
["Steve", "enter"],
["Martha", "exit"],
["Jennifer", "enter"],
["Paul", "enter"],
["Curtis", "exit"],
["Curtis", "enter"],
["Paul", "exit"],
["Martha", "enter"],
["Martha", "exit"],
["Jennifer", "exit"],
["Paul", "enter"],
["Paul", "enter"],
["Martha", "exit"],
["Paul", "enter"],
["Paul", "enter"],
["Paul", "exit"],
["Paul", "exit"]
]),
mismatches([
["Paul", "enter"],
["Paul", "exit"]
]),
mismatches([
["Paul", "enter"],
["Paul", "enter"],
["Paul", "exit"],
["Paul", "exit"],
]),
mismatches([
["Paul", "enter"],
["Paul", "exit"],
["Paul", "exit"],
["Paul", "enter"],
]));