From b83a80e3c2ac9f7518db4ca67c45eecf94262f25 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 30 Oct 2018 16:06:01 +0500 Subject: [PATCH 01/10] test --- robbery.js | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 2 deletions(-) diff --git a/robbery.js b/robbery.js index ed84b5d..ae124c5 100755 --- a/robbery.js +++ b/robbery.js @@ -6,6 +6,34 @@ */ const isStar = true; +const minutesPerHour = 60; +const hourPerDay = 24; + +let weekDays = ['ПН', 'ВТ', 'СР', 'ЧТ', 'ПТ', 'СБ', 'ВС']; + +let dayTimeStrToMinutes = (weekDay, timeStr, timeZone, bankTimeZone) => + [weekDays.indexOf(weekDay) * minutesPerHour * hourPerDay, + timeStr.split(':')[0] * minutesPerHour + Number(timeStr.split(':')[1]), + (bankTimeZone - (timeZone === undefined ? 0 : Number(timeZone))) * minutesPerHour + ].reduce((a, b) => a + b); + +let addTimeToTwoChars = (time) => time.toString().length === 2 ? time.toString() : `0${time}`; + +function minutesToDayTime(minutes, bankTimeZone) { + let weekDay = parseInt(minutes / (minutesPerHour * hourPerDay)); + minutes -= minutesPerHour * hourPerDay * parseInt(minutes / (minutesPerHour * hourPerDay)); + weekDay = weekDays[weekDay]; + let hours = parseInt(minutes / minutesPerHour); + minutes -= hours * minutesPerHour; + bankTimeZone = !bankTimeZone ? '' : `+${bankTimeZone}`; + + return { + day: weekDay, + hours: addTimeToTwoChars(hours), + minutes: addTimeToTwoChars(minutes), + tz: bankTimeZone }; +} + /** * @param {Object} schedule – Расписание Банды * @param {Number} duration - Время на ограбление в минутах @@ -16,6 +44,51 @@ const isStar = true; */ function getAppropriateMoment(schedule, duration, workingHours) { console.info(schedule, duration, workingHours); + let bankTimeZone = Number(workingHours.from.split('+')[1]); + bankTimeZone = isNaN(bankTimeZone) ? 0 : bankTimeZone; + let startTime = 1; + let endTime = dayTimeStrToMinutes(...`СР 23:59+${bankTimeZone}`.split(/ |\+/), bankTimeZone); + let endWeek = dayTimeStrToMinutes(...`ВС 23:59+${bankTimeZone}`.split(/ |\+/), bankTimeZone); + workingHours = weekDays + .slice(0, 3) + .map((day)=> + -dayTimeStrToMinutes(...`${day} ${workingHours.from}`.split(/ |\+/), bankTimeZone)) + .concat( + weekDays + .slice(0, 3) + .map((day)=> + dayTimeStrToMinutes( + ...`${day} ${workingHours.to}`.split(/ |\+/), bankTimeZone))) + .concat([startTime, endTime, -endWeek]); + let answer = [{ count: 0, intervals: [] }] + .concat(Object.keys(schedule) + .map((friend)=>[...schedule[friend]]) + .reduce((a, b)=>a.concat(b)) + .map((record)=> + [ + dayTimeStrToMinutes(...record.from.split(/ |\+/), bankTimeZone), + -dayTimeStrToMinutes(...record.to.split(/ |\+/), bankTimeZone)]) + .reduce((a, b)=>a.concat(b)) + .concat(workingHours) + .sort((a, b) => Math.abs(a) - Math.abs(b))) + .reduce(function (result, time) { + let lastInterval = result.intervals[result.intervals.length - 1]; + if (!(result.count += Math.sign(time))) { + result.intervals.push({ from: -time, to: 0 }); + } else if (result.count === 1 && (lastInterval !== undefined) && !(lastInterval.to)) { + result.intervals[result.intervals.length - 1].to = time; + } + + return result; + }) + .intervals + .slice(1) + .filter((record)=>Math.abs(record.to - record.from) >= duration) + .map((record)=> { + return { + from: minutesToDayTime(record.from, bankTimeZone), + to: minutesToDayTime(record.to, bankTimeZone) }; + }); return { @@ -24,7 +97,7 @@ function getAppropriateMoment(schedule, duration, workingHours) { * @returns {Boolean} */ exists: function () { - return false; + return Boolean(answer.length); }, /** @@ -34,7 +107,11 @@ function getAppropriateMoment(schedule, duration, workingHours) { * @returns {String} */ format: function (template) { - return template; + return !answer.length + ? '' : template + .replace('%DD', answer[0].from.day) + .replace('%HH', answer[0].from.hours) + .replace('%MM', answer[0].from.minutes); }, /** From 4ec0c242c60c782698f824a50b6518a40ba51e18 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 30 Oct 2018 16:12:23 +0500 Subject: [PATCH 02/10] test --- robbery.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/robbery.js b/robbery.js index ae124c5..4554df8 100755 --- a/robbery.js +++ b/robbery.js @@ -4,7 +4,7 @@ * Сделано задание на звездочку * Реализовано оба метода и tryLater */ -const isStar = true; +const isStar = false; const minutesPerHour = 60; const hourPerDay = 24; From 9f645bba365040468bf7d48d2e1d220ddd7d54ec Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 30 Oct 2018 16:17:26 +0500 Subject: [PATCH 03/10] test --- robbery.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/robbery.js b/robbery.js index 4554df8..11db7fc 100755 --- a/robbery.js +++ b/robbery.js @@ -46,7 +46,7 @@ function getAppropriateMoment(schedule, duration, workingHours) { console.info(schedule, duration, workingHours); let bankTimeZone = Number(workingHours.from.split('+')[1]); bankTimeZone = isNaN(bankTimeZone) ? 0 : bankTimeZone; - let startTime = 1; + let startTime = 0; let endTime = dayTimeStrToMinutes(...`СР 23:59+${bankTimeZone}`.split(/ |\+/), bankTimeZone); let endWeek = dayTimeStrToMinutes(...`ВС 23:59+${bankTimeZone}`.split(/ |\+/), bankTimeZone); workingHours = weekDays @@ -73,7 +73,9 @@ function getAppropriateMoment(schedule, duration, workingHours) { .sort((a, b) => Math.abs(a) - Math.abs(b))) .reduce(function (result, time) { let lastInterval = result.intervals[result.intervals.length - 1]; - if (!(result.count += Math.sign(time))) { + let sign = Math.sign(time); + sign = !sign ? 1 : sign; + if (!(result.count += sign)) { result.intervals.push({ from: -time, to: 0 }); } else if (result.count === 1 && (lastInterval !== undefined) && !(lastInterval.to)) { result.intervals[result.intervals.length - 1].to = time; From 66c47710e70bdaf00503df37f10d4ca11e18087d Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 30 Oct 2018 16:32:40 +0500 Subject: [PATCH 04/10] test --- robbery.js | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/robbery.js b/robbery.js index 11db7fc..e388d75 100755 --- a/robbery.js +++ b/robbery.js @@ -60,17 +60,16 @@ function getAppropriateMoment(schedule, duration, workingHours) { dayTimeStrToMinutes( ...`${day} ${workingHours.to}`.split(/ |\+/), bankTimeZone))) .concat([startTime, endTime, -endWeek]); - let answer = [{ count: 0, intervals: [] }] - .concat(Object.keys(schedule) - .map((friend)=>[...schedule[friend]]) - .reduce((a, b)=>a.concat(b)) - .map((record)=> - [ - dayTimeStrToMinutes(...record.from.split(/ |\+/), bankTimeZone), - -dayTimeStrToMinutes(...record.to.split(/ |\+/), bankTimeZone)]) - .reduce((a, b)=>a.concat(b)) - .concat(workingHours) - .sort((a, b) => Math.abs(a) - Math.abs(b))) + let answer = Object.keys(schedule) + .map((friend)=>[...schedule[friend]]) + .reduce((a, b)=>a.concat(b)) + .map((record)=> + [ + dayTimeStrToMinutes(...record.from.split(/ |\+/), bankTimeZone), + -dayTimeStrToMinutes(...record.to.split(/ |\+/), bankTimeZone)]) + .reduce((a, b)=>a.concat(b), []) + .concat(workingHours) + .sort((a, b) => Math.abs(a) - Math.abs(b)) .reduce(function (result, time) { let lastInterval = result.intervals[result.intervals.length - 1]; let sign = Math.sign(time); @@ -82,7 +81,7 @@ function getAppropriateMoment(schedule, duration, workingHours) { } return result; - }) + }, { count: 0, intervals: [] }) .intervals .slice(1) .filter((record)=>Math.abs(record.to - record.from) >= duration) From 205e1d45356e8b067c15dc655b64a18b35edfea6 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 30 Oct 2018 16:34:20 +0500 Subject: [PATCH 05/10] test --- robbery.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/robbery.js b/robbery.js index e388d75..2239c07 100755 --- a/robbery.js +++ b/robbery.js @@ -62,7 +62,7 @@ function getAppropriateMoment(schedule, duration, workingHours) { .concat([startTime, endTime, -endWeek]); let answer = Object.keys(schedule) .map((friend)=>[...schedule[friend]]) - .reduce((a, b)=>a.concat(b)) + .reduce((a, b)=>a.concat(b), []) .map((record)=> [ dayTimeStrToMinutes(...record.from.split(/ |\+/), bankTimeZone), From 2b31bbdc67ba93298e17e07d0531752deb2ea821 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 30 Oct 2018 16:41:07 +0500 Subject: [PATCH 06/10] test --- robbery.js | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/robbery.js b/robbery.js index 2239c07..3f0f7ad 100755 --- a/robbery.js +++ b/robbery.js @@ -34,22 +34,12 @@ function minutesToDayTime(minutes, bankTimeZone) { tz: bankTimeZone }; } -/** - * @param {Object} schedule – Расписание Банды - * @param {Number} duration - Время на ограбление в минутах - * @param {Object} workingHours – Время работы банка - * @param {String} workingHours.from – Время открытия, например, "10:00+5" - * @param {String} workingHours.to – Время закрытия, например, "18:00+5" - * @returns {Object} - */ -function getAppropriateMoment(schedule, duration, workingHours) { - console.info(schedule, duration, workingHours); - let bankTimeZone = Number(workingHours.from.split('+')[1]); - bankTimeZone = isNaN(bankTimeZone) ? 0 : bankTimeZone; +function getBankSchedule(workingHours, bankTimeZone) { let startTime = 0; let endTime = dayTimeStrToMinutes(...`СР 23:59+${bankTimeZone}`.split(/ |\+/), bankTimeZone); let endWeek = dayTimeStrToMinutes(...`ВС 23:59+${bankTimeZone}`.split(/ |\+/), bankTimeZone); - workingHours = weekDays + + return weekDays .slice(0, 3) .map((day)=> -dayTimeStrToMinutes(...`${day} ${workingHours.from}`.split(/ |\+/), bankTimeZone)) @@ -60,6 +50,21 @@ function getAppropriateMoment(schedule, duration, workingHours) { dayTimeStrToMinutes( ...`${day} ${workingHours.to}`.split(/ |\+/), bankTimeZone))) .concat([startTime, endTime, -endWeek]); +} + +/** + * @param {Object} schedule – Расписание Банды + * @param {Number} duration - Время на ограбление в минутах + * @param {Object} workingHours – Время работы банка + * @param {String} workingHours.from – Время открытия, например, "10:00+5" + * @param {String} workingHours.to – Время закрытия, например, "18:00+5" + * @returns {Object} + */ +function getAppropriateMoment(schedule, duration, workingHours) { + console.info(schedule, duration, workingHours); + let bankTimeZone = Number(workingHours.from.split('+')[1]); + bankTimeZone = isNaN(bankTimeZone) ? 0 : bankTimeZone; + workingHours = getBankSchedule(workingHours, bankTimeZone); let answer = Object.keys(schedule) .map((friend)=>[...schedule[friend]]) .reduce((a, b)=>a.concat(b), []) @@ -83,7 +88,6 @@ function getAppropriateMoment(schedule, duration, workingHours) { return result; }, { count: 0, intervals: [] }) .intervals - .slice(1) .filter((record)=>Math.abs(record.to - record.from) >= duration) .map((record)=> { return { @@ -91,6 +95,7 @@ function getAppropriateMoment(schedule, duration, workingHours) { to: minutesToDayTime(record.to, bankTimeZone) }; }); + console.log(answer); return { /** From bdad21b4317bb1b1064b2e4a454e226e5a39dfaa Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 30 Oct 2018 16:41:55 +0500 Subject: [PATCH 07/10] test --- robbery.js | 1 - 1 file changed, 1 deletion(-) diff --git a/robbery.js b/robbery.js index 3f0f7ad..a9b4d30 100755 --- a/robbery.js +++ b/robbery.js @@ -95,7 +95,6 @@ function getAppropriateMoment(schedule, duration, workingHours) { to: minutesToDayTime(record.to, bankTimeZone) }; }); - console.log(answer); return { /** From 38730c48ec49352c2adf2860490c22697f9865d5 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 30 Oct 2018 17:00:35 +0500 Subject: [PATCH 08/10] test --- robbery.js | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/robbery.js b/robbery.js index a9b4d30..2fff6f0 100755 --- a/robbery.js +++ b/robbery.js @@ -35,7 +35,6 @@ function minutesToDayTime(minutes, bankTimeZone) { } function getBankSchedule(workingHours, bankTimeZone) { - let startTime = 0; let endTime = dayTimeStrToMinutes(...`СР 23:59+${bankTimeZone}`.split(/ |\+/), bankTimeZone); let endWeek = dayTimeStrToMinutes(...`ВС 23:59+${bankTimeZone}`.split(/ |\+/), bankTimeZone); @@ -49,7 +48,18 @@ function getBankSchedule(workingHours, bankTimeZone) { .map((day)=> dayTimeStrToMinutes( ...`${day} ${workingHours.to}`.split(/ |\+/), bankTimeZone))) - .concat([startTime, endTime, -endWeek]); + .concat([endTime, -endWeek]); +} + +function getSign(number) { + let sign = isNaN(Math.sign(number)) ? 1 : Math.sign(number); + if (isNaN(sign)) { + sign = 1; + } else if (sign === 0) { + sign = -1; + } + + return sign; } /** @@ -65,7 +75,7 @@ function getAppropriateMoment(schedule, duration, workingHours) { let bankTimeZone = Number(workingHours.from.split('+')[1]); bankTimeZone = isNaN(bankTimeZone) ? 0 : bankTimeZone; workingHours = getBankSchedule(workingHours, bankTimeZone); - let answer = Object.keys(schedule) + let answer = [NaN].concat(Object.keys(schedule) .map((friend)=>[...schedule[friend]]) .reduce((a, b)=>a.concat(b), []) .map((record)=> @@ -73,12 +83,11 @@ function getAppropriateMoment(schedule, duration, workingHours) { dayTimeStrToMinutes(...record.from.split(/ |\+/), bankTimeZone), -dayTimeStrToMinutes(...record.to.split(/ |\+/), bankTimeZone)]) .reduce((a, b)=>a.concat(b), []) - .concat(workingHours) + .concat(workingHours)) .sort((a, b) => Math.abs(a) - Math.abs(b)) .reduce(function (result, time) { let lastInterval = result.intervals[result.intervals.length - 1]; - let sign = Math.sign(time); - sign = !sign ? 1 : sign; + let sign = getSign(time); if (!(result.count += sign)) { result.intervals.push({ from: -time, to: 0 }); } else if (result.count === 1 && (lastInterval !== undefined) && !(lastInterval.to)) { From 61f73c4c39109ac4cb80e52e192f7240e34577b5 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Tue, 30 Oct 2018 17:02:20 +0500 Subject: [PATCH 09/10] test --- robbery.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/robbery.js b/robbery.js index 2fff6f0..23f733c 100755 --- a/robbery.js +++ b/robbery.js @@ -4,7 +4,7 @@ * Сделано задание на звездочку * Реализовано оба метода и tryLater */ -const isStar = false; +const isStar = true; const minutesPerHour = 60; const hourPerDay = 24; From eebfeb6aed2e1dd9b8dd66ce985dc2b68be1c7a7 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 3 Nov 2018 16:42:12 +0500 Subject: [PATCH 10/10] test --- robbery.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/robbery.js b/robbery.js index 23f733c..2fff6f0 100755 --- a/robbery.js +++ b/robbery.js @@ -4,7 +4,7 @@ * Сделано задание на звездочку * Реализовано оба метода и tryLater */ -const isStar = true; +const isStar = false; const minutesPerHour = 60; const hourPerDay = 24;