|
|
|
|
|
by johnfn
696 days ago
|
|
Your solution looks alright. I think you could use a defaultdict() to clean up a few lines of code, and I don't fully understand why you have two nested loops inside your file processing loop. Here's my solution in TS. const parseLog = (input: string) => {
const userToHistory: {[user: string]: string[] } = {}
const pageListToFrequencyCount: { [pages: string]: number } = {}
for (const [user, page, ] of input.trim().split("\n").map(row => row.split(", "))) {
userToHistory[user] = (userToHistory[user] ?? []).concat(page);
if (userToHistory[user].length >= 3) {
const path = userToHistory[user].slice(-3).join(" -> ")
pageListToFrequencyCount[path] = (pageListToFrequencyCount[path] ?? 0) + 1;
}
}
return Object.entries(pageListToFrequencyCount).sort(([, a], [, b]) => a - b);
}
It could be slow on large log files because it keeps the whole log in memory. You could speed it up significantly by doing a `.shift()` at the point when you `.slice(-3)` so that you only track the last 3 pages for any user. |
|