var input = require("fs").readFileSync("input.txt").toString().split("\n").filter(a=>a); var timeline = []; var events = input.sort((a,b)=>{ var pa = a.match(/\[(\d+-\d+-\d+ (\d+):(\d+))\] (.*)/); var pb = b.match(/\[(\d+-\d+-\d+ (\d+):(\d+))\] (.*)/); return new Date(pa[1]).getTime() - new Date(pb[1]).getTime(); }) console.log(events); var guards = []; var lastGuard = -1; for(var event of events){ var p = event.match(/\[(\d+-\d+-\d+ (\d+):(\d+))\] (.*)/); var time = (parseInt(p[2])*60) + parseInt(p[3]) if(p[4].includes("begins shift")){ lastGuard = parseInt(p[4].match(/\#(\d+)/)[1]); } else{ if(!guards[lastGuard]){ guards[lastGuard] = []; } guards[lastGuard].push(time); } } var guardMins = guards.map(times=>{ var mins = []; for(var i = 0; i < times.length; i+=2){ for(var t = times[i]; t != times[i+1]; t=(t+1)%(24*60)){ console.log(t); if(!mins[t]){ mins[t] = 0; } mins[t]++; } } return mins; }); console.log(guards); var mostInMin = Math.max.apply(null, guardMins.reduce((a,b)=>(a.concat(b))).filter(a=>a)); console.log(mostInMin); var bestGuard = guardMins.indexOf(guardMins.filter(a=>(a.indexOf(mostInMin) != -1))[0]); var bestMin = guardMins[bestGuard].indexOf(mostInMin); console.log(bestGuard, bestMin, bestGuard * bestMin);