From 4cea437b2c74ab191c93920c392962b363b6fc10 Mon Sep 17 00:00:00 2001 From: Nikita Lebedev Date: Wed, 26 Oct 2016 19:24:40 +0500 Subject: [PATCH 1/4] initial commit --- robbery.js | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 130 insertions(+), 4 deletions(-) diff --git a/robbery.js b/robbery.js index 4a8309d..161f8c6 100644 --- a/robbery.js +++ b/robbery.js @@ -4,7 +4,99 @@ * Сделано задание на звездочку * Реализовано оба метода и tryLater */ -exports.isStar = true; +exports.isStar = false; + +var MINUTES_IN_HOUR = 60; +var MINUTES_IN_DAY = 24 * MINUTES_IN_HOUR; +var DAYS_OF_WEEK = ['ПН', 'ВТ', 'СР', 'ЧТ', 'ПТ', 'СБ', 'ВС']; +var bankTimezone = 0; + +function getTimezone(dateString) { + return dateString.match(/(\d+)$/)[0]; +} + +function pad(time) { + time = time.toString(); + + return time.length === 2 ? time : '0' + time; +} + +function parseDateFromString(dateString) { + var dateComponents = dateString.match(/([А-Я]{2}) (\d{2}):(\d{2})\+(\d)/); + + return { + dayOfWeek: DAYS_OF_WEEK.indexOf(dateComponents[1]), + hours: Number(dateComponents[2]), + minutes: Number(dateComponents[3]), + timezone: Number(dateComponents[4]) + }; +} + +function getUnifiedTime(dateString) { + var parsedDate = parseDateFromString(dateString); + var unifiedTime = parsedDate.dayOfWeek * MINUTES_IN_DAY + + parsedDate.hours * MINUTES_IN_HOUR + + parsedDate.minutes + + (bankTimezone - parsedDate.timezone) * MINUTES_IN_HOUR; + + if (unifiedTime < 0) { + unifiedTime = 0; + } else if (unifiedTime > 3 * MINUTES_IN_DAY - 1) { + unifiedTime = 3 * MINUTES_IN_DAY - 1; + } + + return unifiedTime; +} + +// function intervalToString(interval) { +// var from = getDateComponents(interval.from); +// var to = getDateComponents(interval.to); + +// return 'from: ' + from.dayOfWeek + ' ' + from.hours + ':' + from.minutes + +// ' to: ' + to.dayOfWeek + ' ' + to.hours + ':' + to.minutes; +// } + +function convertIntervalToBankTimezone(interval) { + return { + from: getUnifiedTime(interval.from), + to: getUnifiedTime(interval.to) + }; +} + +function getDateComponents(minutesSince) { + var dayOfWeek = Math.floor(minutesSince / MINUTES_IN_DAY); + minutesSince -= dayOfWeek * MINUTES_IN_DAY; + var hours = Math.floor(minutesSince / MINUTES_IN_HOUR); + minutesSince -= hours * MINUTES_IN_HOUR; + var minutes = minutesSince; + + return { + dayOfWeek: DAYS_OF_WEEK[dayOfWeek], + hours: hours, + minutes: minutes + }; +} + +// check me pls +function intersect(set, el) { + for (var i = 0; i < set.length; i++) { + if (el.from > set[i].from && el.to < set[i].to) { // inside + set.splice(i, 1, { + from: set[i].from, + to: el.from + }, { + from: el.to, + to: set[i].to + }); + } else if (el.from <= set[i].from && el.to >= set[i].to) { // bigger + set.splice(i, 1); + } else if (el.from < set[i].to && el.to > set[i].to) { + set[i].to = el.from; + } else if (el.from < set[i].from && el.to > set[i].from) { + set[i].from = el.to; + } + } +} /** * @param {Object} schedule – Расписание Банды @@ -15,7 +107,33 @@ exports.isStar = true; * @returns {Object} */ exports.getAppropriateMoment = function (schedule, duration, workingHours) { - console.info(schedule, duration, workingHours); + bankTimezone = getTimezone(workingHours.from); + + var appropriateIntervals = ['ПН', 'ВТ', 'СР'].map(function (day) { + return convertIntervalToBankTimezone({ + from: day + ' ' + workingHours.from, + to: day + ' ' + workingHours.to + }); + }); + + schedule = schedule.Danny.concat(schedule.Rusty, schedule.Linus); + + schedule.forEach(function (interval) { + interval = convertIntervalToBankTimezone(interval); + intersect(appropriateIntervals, interval); + }); + + appropriateIntervals = appropriateIntervals + .filter(function (el) { + return el.to - el.from >= duration; + }) + .sort(function (a, b) { + return a.from > b.from; + }); + + // appropriateIntervals.forEach(function (value) { + // console.info(intervalToString(value)); + // }); return { @@ -24,7 +142,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {Boolean} */ exists: function () { - return false; + return appropriateIntervals.length > 0; }, /** @@ -35,7 +153,15 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {String} */ format: function (template) { - return template; + if (!this.exists()) { + return ''; + } + var components = getDateComponents(appropriateIntervals[0].from); + + return template + .replace(/%HH/, components.hours) + .replace(/%MM/, pad(components.minutes)) + .replace(/%DD/, pad(components.dayOfWeek)); }, /** From 72f11b62efe95ecc7f5d8b03dbcd54bc9f770cba Mon Sep 17 00:00:00 2001 From: Nikita Lebedev Date: Wed, 26 Oct 2016 20:02:32 +0500 Subject: [PATCH 2/4] fixes --- robbery.js | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/robbery.js b/robbery.js index 161f8c6..7338a79 100644 --- a/robbery.js +++ b/robbery.js @@ -48,14 +48,6 @@ function getUnifiedTime(dateString) { return unifiedTime; } -// function intervalToString(interval) { -// var from = getDateComponents(interval.from); -// var to = getDateComponents(interval.to); - -// return 'from: ' + from.dayOfWeek + ' ' + from.hours + ':' + from.minutes + -// ' to: ' + to.dayOfWeek + ' ' + to.hours + ':' + to.minutes; -// } - function convertIntervalToBankTimezone(interval) { return { from: getUnifiedTime(interval.from), @@ -77,7 +69,6 @@ function getDateComponents(minutesSince) { }; } -// check me pls function intersect(set, el) { for (var i = 0; i < set.length; i++) { if (el.from > set[i].from && el.to < set[i].to) { // inside @@ -116,7 +107,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { }); }); - schedule = schedule.Danny.concat(schedule.Rusty, schedule.Linus); + schedule = (schedule.Danny || []).concat(schedule.Rusty || [], schedule.Linus || []); schedule.forEach(function (interval) { interval = convertIntervalToBankTimezone(interval); @@ -131,10 +122,6 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { return a.from > b.from; }); - // appropriateIntervals.forEach(function (value) { - // console.info(intervalToString(value)); - // }); - return { /** From 53613ce4e68a7d1947f06523c9820b94e93bf370 Mon Sep 17 00:00:00 2001 From: Nikita Lebedev Date: Wed, 26 Oct 2016 20:07:41 +0500 Subject: [PATCH 3/4] intervals fix --- robbery.js | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/robbery.js b/robbery.js index 7338a79..b33bd3d 100644 --- a/robbery.js +++ b/robbery.js @@ -100,17 +100,26 @@ function intersect(set, el) { exports.getAppropriateMoment = function (schedule, duration, workingHours) { bankTimezone = getTimezone(workingHours.from); - var appropriateIntervals = ['ПН', 'ВТ', 'СР'].map(function (day) { - return convertIntervalToBankTimezone({ - from: day + ' ' + workingHours.from, - to: day + ' ' + workingHours.to + var appropriateIntervals = ['ПН', 'ВТ', 'СР'] + .map(function (day) { + return convertIntervalToBankTimezone({ + from: day + ' ' + workingHours.from, + to: day + ' ' + workingHours.to + }); + }) + .filter(function (interval) { + return interval.from !== interval.to; }); - }); - schedule = (schedule.Danny || []).concat(schedule.Rusty || [], schedule.Linus || []); + schedule = (schedule.Danny || []).concat(schedule.Rusty || [], schedule.Linus || []) + .map(function (interval) { + return convertIntervalToBankTimezone(interval); + }) + .filter(function (interval) { + return interval.from !== interval.to; + }); schedule.forEach(function (interval) { - interval = convertIntervalToBankTimezone(interval); intersect(appropriateIntervals, interval); }); From 6d92090634bb78d1b1d386bff512427218b00b9c Mon Sep 17 00:00:00 2001 From: Nikita Lebedev Date: Wed, 26 Oct 2016 20:12:10 +0500 Subject: [PATCH 4/4] random fix --- robbery.js | 1 + 1 file changed, 1 insertion(+) diff --git a/robbery.js b/robbery.js index b33bd3d..f1980e5 100644 --- a/robbery.js +++ b/robbery.js @@ -79,6 +79,7 @@ function intersect(set, el) { from: el.to, to: set[i].to }); + i--; } else if (el.from <= set[i].from && el.to >= set[i].to) { // bigger set.splice(i, 1); } else if (el.from < set[i].to && el.to > set[i].to) {