From caede16f9cf2bf0c81f797004346f90c76deeeca Mon Sep 17 00:00:00 2001 From: Ludmilishee Date: Thu, 27 Oct 2016 08:25:20 +0500 Subject: [PATCH 01/14] =?UTF-8?q?=D0=A2=D1=80=D0=B5=D1=82=D1=8C=D0=B5=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=20JS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 210 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 207 insertions(+), 3 deletions(-) diff --git a/robbery.js b/robbery.js index 4a8309d..e7b9392 100644 --- a/robbery.js +++ b/robbery.js @@ -15,7 +15,173 @@ exports.isStar = true; * @returns {Object} */ exports.getAppropriateMoment = function (schedule, duration, workingHours) { - console.info(schedule, duration, workingHours); + + var DAYS_FOR_ROBBERY = ['ПН', 'ВТ', 'СР']; + var MINUTES_IN_HOUR = 60; + var bankFrom = hoursToMinutes(workingHours.from); + var bankTo = hoursToMinutes(workingHours.to); + var whenBusyFrom = []; + var whenBusyTo = []; + var whenGangIsCan = []; + var resultIndex = 0; + var result = []; + + function isFreeToday(name, day) { + var isBusy = false; + for (var i = 0; i < schedule[name].length; i++) { + var robberyFrom = convertToTimezone(schedule[name][i].from); + var robberyTo = convertToTimezone(schedule[name][i].to); + if (robberyFrom.indexOf(day) !== -1 && robberyTo.indexOf(day) !== -1) { + isBusy = checkBusyAllBankHours(hoursToMinutes(robberyFrom), + hoursToMinutes(robberyTo)); + + checkIntervalAndPush(hoursToMinutes(robberyFrom), hoursToMinutes(robberyTo)) + } else if (robberyFrom.indexOf(day) !== -1) { + isBusy = checkBusyAllBankHours( + hoursToMinutes(robberyFrom), + hoursToMinutes('23:59+5') + ); + + checkIntervalAndPush(hoursToMinutes(robberyFrom), bankTo); + } else if (robberyTo.indexOf(day) !== -1) { + isBusy = checkBusyAllBankHours(hoursToMinutes('00:00+5'), + hoursToMinutes(robberyTo)); + + checkIntervalAndPush(bankFrom, hoursToMinutes(robberyTo)); + } + if (isBusy) { + return false; + } + } + + return true; + } + + function checkIntervalAndPush(from, to) { + if (from <= bankTo && from >= bankFrom && to <= bankTo) { + whenBusyFrom.push(from); + whenBusyTo.push(to); + } + } + + function checkBusyAllBankHours(robFrom, robTo) { + if (robFrom <= bankFrom && robTo >= bankTo) { + return true; + } + + return false; + } + + function hoursToMinutes(str) { + var timeArray = str.match(/\d{1,2}/g); + + return timeArray[0] * MINUTES_IN_HOUR + Number(timeArray[1]); + } + + function minutesToHours(inputMinutes) { + var hours = parseInt(inputMinutes / MINUTES_IN_HOUR); + var minutes = inputMinutes % MINUTES_IN_HOUR; + if (minutes < 10) { + minutes += '0'; + } + if (hours < 10) { + hours += '0'; + } + + return [hours, minutes]; + } + + function convertToTimezone(str) { + var bankTimezone = workingHours.from.search(/\+\d{1,2}/); + var timeArray = str.match(/\d{1,2}/g); + var dayOfWeek = str.match(/[А-Я]{2}/g); + var deltaTimezone = Math.abs(parseInt(bankTimezone - timeArray[2])); + var newHours; + if (timeArray[2] < bankTimezone) { + newHours = Number(timeArray[0]) + deltaTimezone; + + return dayOfWeek[0] + ' ' + newHours + ':' + timeArray[1] + '+' + bankTimezone; + } else if (timeArray[2] > bankTimezone) { + newHours = Number(timeArray[0]) - deltaTimezone; + + return dayOfWeek[0] + ' ' + newHours + ':' + timeArray[1] + '+' + bankTimezone; + } + + return str; + } + + function searchMiddleCases(i) { + var maxTo; + if (whenBusyTo[i] < whenBusyFrom[i + 1]) { + whenGangIsCan.push( + { fromInMins: whenBusyTo[i], + toInMins: whenBusyFrom[i + 1] }); + } else { + var nextTo; + while (whenBusyTo[i] > whenBusyFrom[i + 1]) { + maxTo = whenBusyTo[i + 1]; + i++; + } + if (whenBusyTo[i + 1] !== undefined) { + nextTo = whenBusyTo[i + 1]; + whenGangIsCan.push({ fromInMins: maxTo, toInMins: nextTo }); + } + + } + } + + function findWhenGangIsFree() { + whenBusyFrom.sort(function (a, b) { + return a - b; + }); + whenBusyTo.sort(function (a, b) { + return a - b; + }); + + if (whenBusyFrom[0] > bankFrom) { + whenGangIsCan.push({ fromInMins: bankFrom, toInMins: whenBusyFrom[0] }); + } + for (var i = 0; i < whenBusyFrom.length; i++) { + searchMiddleCases(i); + } + if (whenBusyTo[whenBusyTo.length - 1] < bankTo) { + whenGangIsCan.push({ + fromInMins: whenBusyTo[whenBusyTo.length - 1], + toInMins: bankTo }); + } + } + + function willRobThisDay(index) { + for (var i = 0; i < whenGangIsCan.length; i++) { + if ((whenGangIsCan[i].toInMins - whenGangIsCan[i].fromInMins) >= duration) { + result.push({ + resFrom: whenGangIsCan[i].fromInMins, + resTo: whenGangIsCan[i].toInMins, + day: DAYS_FOR_ROBBERY[index] + }); + } + } + whenBusyFrom = []; + whenBusyTo = []; + whenGangIsCan = []; + + if (result.length !== 0) { + return true; + } + + return false; + } + + function gangIsFree(i) { + var allIsFree = true; + for (var robber in schedule) { + if ({}.hasOwnProperty.call(schedule, robber)) { + allIsFree = gangIsFree && isFreeToday(robber, DAYS_FOR_ROBBERY[i]); + } + } + + return allIsFree; + } return { @@ -24,7 +190,19 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {Boolean} */ exists: function () { - return false; + var willRob = false; + var isFree; + for (var i = 0; i < DAYS_FOR_ROBBERY.length; i++) { + isFree = gangIsFree(i); + if (isFree) { + findWhenGangIsFree(); + } + if (willRobThisDay(i)) { + willRob = true; + } + } + + return willRob; }, /** @@ -35,7 +213,15 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {String} */ format: function (template) { - return template; + var moment = exports.getAppropriateMoment(schedule, duration, workingHours); + if (!moment.exists()) { + return ''; + } + var timeArray = minutesToHours(result[resultIndex].resFrom); + + return template.replace('%HH', timeArray[0]) + .replace('%MM', timeArray[1]) + .replace('%DD', result[resultIndex].day); }, /** @@ -44,7 +230,25 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {Boolean} */ tryLater: function () { + + if (result.length < 2) { + return false; + } else if (( + result[resultIndex].resTo - (result[resultIndex].resFrom + 30)) >= duration) { + result[resultIndex].resFrom += 30; + + return true; + } else if (resultIndex < result.length - 1) { + resultIndex++; + + return true; + } + return false; } }; }; + + + + From a41224f8b4b4d5c1570d61eef4357735c0a6e042 Mon Sep 17 00:00:00 2001 From: Ludmilishee Date: Thu, 27 Oct 2016 08:46:33 +0500 Subject: [PATCH 02/14] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D0=BA=D0=BE=D0=B4=20=D1=81=D1=82=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 84 ++++++++++++++++++++++++++---------------------------- 1 file changed, 40 insertions(+), 44 deletions(-) diff --git a/robbery.js b/robbery.js index e7b9392..effd19f 100644 --- a/robbery.js +++ b/robbery.js @@ -14,10 +14,10 @@ exports.isStar = true; * @param {String} workingHours.to – Время закрытия, например, "18:00+5" * @returns {Object} */ -exports.getAppropriateMoment = function (schedule, duration, workingHours) { +var DAYS_FOR_ROBBERY = ['ПН', 'ВТ', 'СР']; +var MINUTES_IN_HOUR = 60; - var DAYS_FOR_ROBBERY = ['ПН', 'ВТ', 'СР']; - var MINUTES_IN_HOUR = 60; +exports.getAppropriateMoment = function (schedule, duration, workingHours) { var bankFrom = hoursToMinutes(workingHours.from); var bankTo = hoursToMinutes(workingHours.to); var whenBusyFrom = []; @@ -29,13 +29,13 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { function isFreeToday(name, day) { var isBusy = false; for (var i = 0; i < schedule[name].length; i++) { - var robberyFrom = convertToTimezone(schedule[name][i].from); - var robberyTo = convertToTimezone(schedule[name][i].to); + var robberyFrom = convertToTimezone(schedule[name][i].from, workingHours); + var robberyTo = convertToTimezone(schedule[name][i].to, workingHours); if (robberyFrom.indexOf(day) !== -1 && robberyTo.indexOf(day) !== -1) { isBusy = checkBusyAllBankHours(hoursToMinutes(robberyFrom), hoursToMinutes(robberyTo)); - checkIntervalAndPush(hoursToMinutes(robberyFrom), hoursToMinutes(robberyTo)) + checkIntervalAndPush(hoursToMinutes(robberyFrom), hoursToMinutes(robberyTo)); } else if (robberyFrom.indexOf(day) !== -1) { isBusy = checkBusyAllBankHours( hoursToMinutes(robberyFrom), @@ -72,44 +72,6 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { return false; } - function hoursToMinutes(str) { - var timeArray = str.match(/\d{1,2}/g); - - return timeArray[0] * MINUTES_IN_HOUR + Number(timeArray[1]); - } - - function minutesToHours(inputMinutes) { - var hours = parseInt(inputMinutes / MINUTES_IN_HOUR); - var minutes = inputMinutes % MINUTES_IN_HOUR; - if (minutes < 10) { - minutes += '0'; - } - if (hours < 10) { - hours += '0'; - } - - return [hours, minutes]; - } - - function convertToTimezone(str) { - var bankTimezone = workingHours.from.search(/\+\d{1,2}/); - var timeArray = str.match(/\d{1,2}/g); - var dayOfWeek = str.match(/[А-Я]{2}/g); - var deltaTimezone = Math.abs(parseInt(bankTimezone - timeArray[2])); - var newHours; - if (timeArray[2] < bankTimezone) { - newHours = Number(timeArray[0]) + deltaTimezone; - - return dayOfWeek[0] + ' ' + newHours + ':' + timeArray[1] + '+' + bankTimezone; - } else if (timeArray[2] > bankTimezone) { - newHours = Number(timeArray[0]) - deltaTimezone; - - return dayOfWeek[0] + ' ' + newHours + ':' + timeArray[1] + '+' + bankTimezone; - } - - return str; - } - function searchMiddleCases(i) { var maxTo; if (whenBusyTo[i] < whenBusyFrom[i + 1]) { @@ -249,6 +211,40 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { }; }; +function hoursToMinutes(str) { + var timeArray = str.match(/\d{1,2}/g); + return timeArray[0] * MINUTES_IN_HOUR + Number(timeArray[1]); +} +function minutesToHours(inputMinutes) { + var hours = parseInt(inputMinutes / MINUTES_IN_HOUR); + var minutes = inputMinutes % MINUTES_IN_HOUR; + if (minutes < 10) { + minutes += '0'; + } + if (hours < 10) { + hours += '0'; + } + + return [hours, minutes]; +} + +function convertToTimezone(str, workingHours) { + var bankTimezone = workingHours.from.search(/\+\d{1,2}/); + var timeArray = str.match(/\d{1,2}/g); + var dayOfWeek = str.match(/[А-Я]{2}/g); + var deltaTimezone = Math.abs(parseInt(bankTimezone - timeArray[2])); + var newHours; + if (timeArray[2] < bankTimezone) { + newHours = Number(timeArray[0]) + deltaTimezone; + + return dayOfWeek[0] + ' ' + newHours + ':' + timeArray[1] + '+' + bankTimezone; + } else if (timeArray[2] > bankTimezone) { + newHours = Number(timeArray[0]) - deltaTimezone; + + return dayOfWeek[0] + ' ' + newHours + ':' + timeArray[1] + '+' + bankTimezone; + } + return str; +} From 0429c6767197874cf10db10a39804dc23797c416 Mon Sep 17 00:00:00 2001 From: Ludmilishee Date: Thu, 27 Oct 2016 09:14:40 +0500 Subject: [PATCH 03/14] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/robbery.js b/robbery.js index effd19f..48c67b4 100644 --- a/robbery.js +++ b/robbery.js @@ -192,7 +192,9 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {Boolean} */ tryLater: function () { - + if (!this.exists()) { + return false; + } if (result.length < 2) { return false; } else if (( From 9e0ba046045065af41c30473a3550adb8d3849a6 Mon Sep 17 00:00:00 2001 From: Ludmilishee Date: Thu, 27 Oct 2016 09:17:38 +0500 Subject: [PATCH 04/14] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/robbery.js b/robbery.js index 48c67b4..a4e04d3 100644 --- a/robbery.js +++ b/robbery.js @@ -192,7 +192,8 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {Boolean} */ tryLater: function () { - if (!this.exists()) { + var moment = exports.getAppropriateMoment(schedule, duration, workingHours); + if (!moment.exists()) { return false; } if (result.length < 2) { From 4d20287072ebda3218394fa5c199ed43af94504f Mon Sep 17 00:00:00 2001 From: Ludmilishee Date: Thu, 27 Oct 2016 09:25:29 +0500 Subject: [PATCH 05/14] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/robbery.js b/robbery.js index a4e04d3..7c0d635 100644 --- a/robbery.js +++ b/robbery.js @@ -16,6 +16,7 @@ exports.isStar = true; */ var DAYS_FOR_ROBBERY = ['ПН', 'ВТ', 'СР']; var MINUTES_IN_HOUR = 60; +var willRob = false; exports.getAppropriateMoment = function (schedule, duration, workingHours) { var bankFrom = hoursToMinutes(workingHours.from); @@ -152,7 +153,6 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {Boolean} */ exists: function () { - var willRob = false; var isFree; for (var i = 0; i < DAYS_FOR_ROBBERY.length; i++) { isFree = gangIsFree(i); @@ -175,8 +175,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {String} */ format: function (template) { - var moment = exports.getAppropriateMoment(schedule, duration, workingHours); - if (!moment.exists()) { + if (!willRob) { return ''; } var timeArray = minutesToHours(result[resultIndex].resFrom); @@ -192,8 +191,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {Boolean} */ tryLater: function () { - var moment = exports.getAppropriateMoment(schedule, duration, workingHours); - if (!moment.exists()) { + if (!willRob) { return false; } if (result.length < 2) { From e52bc35f09f356b871e0e176784aceaa184efc70 Mon Sep 17 00:00:00 2001 From: Ludmilishee Date: Thu, 27 Oct 2016 10:37:10 +0500 Subject: [PATCH 06/14] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/robbery.js b/robbery.js index 7c0d635..50cfb47 100644 --- a/robbery.js +++ b/robbery.js @@ -16,7 +16,8 @@ exports.isStar = true; */ var DAYS_FOR_ROBBERY = ['ПН', 'ВТ', 'СР']; var MINUTES_IN_HOUR = 60; -var willRob = false; +var result = []; +var resArrayIsAlreadyCreated = false; exports.getAppropriateMoment = function (schedule, duration, workingHours) { var bankFrom = hoursToMinutes(workingHours.from); @@ -25,7 +26,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { var whenBusyTo = []; var whenGangIsCan = []; var resultIndex = 0; - var result = []; + function isFreeToday(name, day) { var isBusy = false; @@ -114,9 +115,10 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { } } - function willRobThisDay(index) { + function willRobThisDay(index, resIsAlreadyCreated) { for (var i = 0; i < whenGangIsCan.length; i++) { - if ((whenGangIsCan[i].toInMins - whenGangIsCan[i].fromInMins) >= duration) { + if ((whenGangIsCan[i].toInMins - whenGangIsCan[i].fromInMins) >= duration && + !resIsAlreadyCreated) { result.push({ resFrom: whenGangIsCan[i].fromInMins, resTo: whenGangIsCan[i].toInMins, @@ -153,16 +155,21 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {Boolean} */ exists: function () { + var willRob = false; + var isFree; for (var i = 0; i < DAYS_FOR_ROBBERY.length; i++) { isFree = gangIsFree(i); if (isFree) { findWhenGangIsFree(); } - if (willRobThisDay(i)) { + if (willRobThisDay(i, resArrayIsAlreadyCreated)) { willRob = true; } } + if (willRob) { + resArrayIsAlreadyCreated = true; + } return willRob; }, @@ -175,7 +182,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {String} */ format: function (template) { - if (!willRob) { + if (!this.exists()) { return ''; } var timeArray = minutesToHours(result[resultIndex].resFrom); @@ -191,7 +198,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {Boolean} */ tryLater: function () { - if (!willRob) { + if (!this.exists()) { return false; } if (result.length < 2) { From e76d819a20aec82daf1827c7f67d601ecd32e3dc Mon Sep 17 00:00:00 2001 From: Ludmilishee Date: Thu, 27 Oct 2016 11:26:51 +0500 Subject: [PATCH 07/14] ... --- robbery.js | 1 + 1 file changed, 1 insertion(+) diff --git a/robbery.js b/robbery.js index 50cfb47..1451ccc 100644 --- a/robbery.js +++ b/robbery.js @@ -190,6 +190,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { return template.replace('%HH', timeArray[0]) .replace('%MM', timeArray[1]) .replace('%DD', result[resultIndex].day); + }, /** From 06655f89204356c90d61ddb3836d473f93372e54 Mon Sep 17 00:00:00 2001 From: Ludmilishee Date: Thu, 27 Oct 2016 11:31:18 +0500 Subject: [PATCH 08/14] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/robbery.js b/robbery.js index 1451ccc..97188d2 100644 --- a/robbery.js +++ b/robbery.js @@ -182,7 +182,8 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {String} */ format: function (template) { - if (!this.exists()) { + var moment = exports.getAppropriateMoment(schedule, duration, workingHours); + if (!moment.exists()) { return ''; } var timeArray = minutesToHours(result[resultIndex].resFrom); From e79c1727ef3ffba33b7c7b9bb75e1d30e4fbab79 Mon Sep 17 00:00:00 2001 From: Ludmilishee Date: Thu, 3 Nov 2016 01:57:19 +0500 Subject: [PATCH 09/14] =?UTF-8?q?=D0=95=D1=89=D1=91=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BC=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/robbery.js b/robbery.js index 97188d2..db36651 100644 --- a/robbery.js +++ b/robbery.js @@ -4,7 +4,7 @@ * Сделано задание на звездочку * Реализовано оба метода и tryLater */ -exports.isStar = true; +exports.isStar = false; /** * @param {Object} schedule – Расписание Банды @@ -16,8 +16,8 @@ exports.isStar = true; */ var DAYS_FOR_ROBBERY = ['ПН', 'ВТ', 'СР']; var MINUTES_IN_HOUR = 60; -var result = []; var resArrayIsAlreadyCreated = false; +var resultIndex = 0; exports.getAppropriateMoment = function (schedule, duration, workingHours) { var bankFrom = hoursToMinutes(workingHours.from); @@ -25,7 +25,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { var whenBusyFrom = []; var whenBusyTo = []; var whenGangIsCan = []; - var resultIndex = 0; + var result = []; function isFreeToday(name, day) { @@ -115,10 +115,14 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { } } - function willRobThisDay(index, resIsAlreadyCreated) { + function uniqueVal(value, index, self) { + return self.indexOf(value) === index && + self.indexOf(value) === index; + } + + function willRobThisDay(index) { for (var i = 0; i < whenGangIsCan.length; i++) { - if ((whenGangIsCan[i].toInMins - whenGangIsCan[i].fromInMins) >= duration && - !resIsAlreadyCreated) { + if ((whenGangIsCan[i].toInMins - whenGangIsCan[i].fromInMins) >= duration) { result.push({ resFrom: whenGangIsCan[i].fromInMins, resTo: whenGangIsCan[i].toInMins, @@ -126,6 +130,9 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { }); } } + + result.filter(uniqueVal); + whenBusyFrom = []; whenBusyTo = []; whenGangIsCan = []; @@ -182,8 +189,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {String} */ format: function (template) { - var moment = exports.getAppropriateMoment(schedule, duration, workingHours); - if (!moment.exists()) { + if (!this.exists()) { return ''; } var timeArray = minutesToHours(result[resultIndex].resFrom); @@ -200,21 +206,6 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {Boolean} */ tryLater: function () { - if (!this.exists()) { - return false; - } - if (result.length < 2) { - return false; - } else if (( - result[resultIndex].resTo - (result[resultIndex].resFrom + 30)) >= duration) { - result[resultIndex].resFrom += 30; - - return true; - } else if (resultIndex < result.length - 1) { - resultIndex++; - - return true; - } return false; } From 83bb3c9d6356fe582976e35f9005a79e9ee251f8 Mon Sep 17 00:00:00 2001 From: Ludmilishee Date: Thu, 3 Nov 2016 02:18:14 +0500 Subject: [PATCH 10/14] =?UTF-8?q?=D0=95=D1=89=D1=91=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BC=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/robbery.js b/robbery.js index db36651..68beac1 100644 --- a/robbery.js +++ b/robbery.js @@ -18,16 +18,16 @@ var DAYS_FOR_ROBBERY = ['ПН', 'ВТ', 'СР']; var MINUTES_IN_HOUR = 60; var resArrayIsAlreadyCreated = false; var resultIndex = 0; +var whenBusyFrom = []; +var whenBusyTo = []; +var whenGangIsCan = []; +var incorrectData = false; exports.getAppropriateMoment = function (schedule, duration, workingHours) { var bankFrom = hoursToMinutes(workingHours.from); var bankTo = hoursToMinutes(workingHours.to); - var whenBusyFrom = []; - var whenBusyTo = []; - var whenGangIsCan = []; var result = []; - function isFreeToday(name, day) { var isBusy = false; for (var i = 0; i < schedule[name].length; i++) { @@ -177,6 +177,9 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { if (willRob) { resArrayIsAlreadyCreated = true; } + if (incorrectData) { + return false; + } return willRob; }, @@ -214,6 +217,9 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { function hoursToMinutes(str) { var timeArray = str.match(/\d{1,2}/g); + if (str.indexOf('+') === -1) { + incorrectData = true; + } return timeArray[0] * MINUTES_IN_HOUR + Number(timeArray[1]); } @@ -233,6 +239,9 @@ function minutesToHours(inputMinutes) { function convertToTimezone(str, workingHours) { var bankTimezone = workingHours.from.search(/\+\d{1,2}/); + if (str.indexOf('+') === -1) { + incorrectData = true; + } var timeArray = str.match(/\d{1,2}/g); var dayOfWeek = str.match(/[А-Я]{2}/g); var deltaTimezone = Math.abs(parseInt(bankTimezone - timeArray[2])); From acc53b752feaae7eccc33c76106f44cf16bc1df8 Mon Sep 17 00:00:00 2001 From: Ludmilishee Date: Thu, 3 Nov 2016 02:21:42 +0500 Subject: [PATCH 11/14] =?UTF-8?q?=D0=95=D1=89=D1=91=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BC=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/robbery.js b/robbery.js index 68beac1..2e5d398 100644 --- a/robbery.js +++ b/robbery.js @@ -178,7 +178,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { resArrayIsAlreadyCreated = true; } if (incorrectData) { - return false; + return; } return willRob; From 8ea2de1f19b80fdd6cb2ec9f2c68e59263d8248a Mon Sep 17 00:00:00 2001 From: Ludmilishee Date: Thu, 3 Nov 2016 03:04:37 +0500 Subject: [PATCH 12/14] =?UTF-8?q?=D0=95=D1=89=D1=91=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BC=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/robbery.js b/robbery.js index 2e5d398..21095ed 100644 --- a/robbery.js +++ b/robbery.js @@ -28,6 +28,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { var bankTo = hoursToMinutes(workingHours.to); var result = []; + function isFreeToday(name, day) { var isBusy = false; for (var i = 0; i < schedule[name].length; i++) { @@ -163,7 +164,6 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { */ exists: function () { var willRob = false; - var isFree; for (var i = 0; i < DAYS_FOR_ROBBERY.length; i++) { isFree = gangIsFree(i); @@ -178,7 +178,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { resArrayIsAlreadyCreated = true; } if (incorrectData) { - return; + throw new TypeError('Ошибка'); } return willRob; @@ -237,6 +237,13 @@ function minutesToHours(inputMinutes) { return [hours, minutes]; } +function checkCorrectDay(day) { + if (day.indexOf(DAYS_FOR_ROBBERY[0]) === -1 && day.indexOf(DAYS_FOR_ROBBERY[1]) === -1 && + day.indexOf(DAYS_FOR_ROBBERY[2]) === -1) { + incorrectData = true; + } +} + function convertToTimezone(str, workingHours) { var bankTimezone = workingHours.from.search(/\+\d{1,2}/); if (str.indexOf('+') === -1) { @@ -244,6 +251,7 @@ function convertToTimezone(str, workingHours) { } var timeArray = str.match(/\d{1,2}/g); var dayOfWeek = str.match(/[А-Я]{2}/g); + checkCorrectDay(dayOfWeek[0]); var deltaTimezone = Math.abs(parseInt(bankTimezone - timeArray[2])); var newHours; if (timeArray[2] < bankTimezone) { From 8ff0840ff75001a1833199a0deca542cfbfc55f8 Mon Sep 17 00:00:00 2001 From: Ludmilishee Date: Thu, 3 Nov 2016 03:08:46 +0500 Subject: [PATCH 13/14] =?UTF-8?q?=D0=95=D1=89=D1=91=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BC=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/robbery.js b/robbery.js index 21095ed..72320f1 100644 --- a/robbery.js +++ b/robbery.js @@ -178,7 +178,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { resArrayIsAlreadyCreated = true; } if (incorrectData) { - throw new TypeError('Ошибка'); + return false; } return willRob; From fa008b1c9788ca5c7dac7c78d6beae33b129a038 Mon Sep 17 00:00:00 2001 From: Ludmilishee Date: Thu, 3 Nov 2016 03:12:34 +0500 Subject: [PATCH 14/14] =?UTF-8?q?=D0=95=D1=89=D1=91=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BC=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/robbery.js b/robbery.js index 72320f1..99f77dd 100644 --- a/robbery.js +++ b/robbery.js @@ -246,12 +246,12 @@ function checkCorrectDay(day) { function convertToTimezone(str, workingHours) { var bankTimezone = workingHours.from.search(/\+\d{1,2}/); - if (str.indexOf('+') === -1) { - incorrectData = true; - } var timeArray = str.match(/\d{1,2}/g); var dayOfWeek = str.match(/[А-Я]{2}/g); checkCorrectDay(dayOfWeek[0]); + if (str.indexOf('+') === -1 || timeArray[2] > 23) { + incorrectData = true; + } var deltaTimezone = Math.abs(parseInt(bankTimezone - timeArray[2])); var newHours; if (timeArray[2] < bankTimezone) {