From b884552d0a5ffd8dc323125bb6b6fe19be581d40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D1=80=D0=B5=D1=85=D0=BE=D0=B2=20=D0=9A=D0=B8=D1=80?= =?UTF-8?q?=D0=B8=D0=BB=D0=BB?= Date: Wed, 26 Oct 2016 23:31:26 +0500 Subject: [PATCH 01/10] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=BD=D1=91=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 123 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 90 insertions(+), 33 deletions(-) diff --git a/robbery.js b/robbery.js index 4a8309d..52381d9 100644 --- a/robbery.js +++ b/robbery.js @@ -1,48 +1,105 @@ 'use strict'; -/** - * Сделано задание на звездочку - * Реализовано оба метода и tryLater - */ -exports.isStar = true; - -/** - * @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} - */ -exports.getAppropriateMoment = function (schedule, duration, workingHours) { - console.info(schedule, duration, workingHours); +exports.isStar = false; + +function convertSchedule(schedule) { + var res = {}; + for (var i in schedule) { + res[i] = []; + for (var j = 0; j < schedule[i].length; j++) { + var from = convertToDate(schedule[i][j].from); + var to = convertToDate(schedule[i][j].to); + res[i].push({from: from, to: to}); + } + } + + return res; +} + +function convertToDate(stringDate) { + var days = {'ПН': 1, 'ВТ': 2, 'СР': 3, 'ЧТ': 4, 'ПТ': 5, 'СБ': 6, 'ВС': 7}; + var re = /^([А-Я]{2}) (.*)(\+\d+)$/; + var parseDate = stringDate.match(re); + + return new Date(Date.parse(days[parseDate[1]] + ' Jan 1900 ' + parseDate[2] + ' GMT' + parseDate[3] + '00')); +} +function getSchedBank(workingHours) { + var daysOfWorkBank = ['ПН', 'ВТ', 'СР']; + var sched = []; + for (var i = 0; i < daysOfWorkBank.length; i++) { + var from = convertToDate(daysOfWorkBank[i] + ' ' + workingHours.from); + var to = convertToDate(daysOfWorkBank[i] + ' ' + workingHours.to); + sched.push({from: from, to: to}); + } + + return sched; +} + +exports.getAppropriateMoment = function (schedule, duration, workingHours) { + var sched = convertSchedule(schedule); + //console.log(sched); + var schedBank = getSchedBank(workingHours); + //console.log(schedBank); + for (var name in sched) { + var neperesek = []; + for (var i = 0; i < schedBank.length; i++) { + var neperes = true; + for (var j = 0; j < sched[name].length; j++) { + if (sched[name][j].from.getTime() <= schedBank[i].to.getTime() && + sched[name][j].from.getTime() >= schedBank[i].from.getTime()) { + neperesek.push({from: schedBank[i].from, to: sched[name][j].from}); + neperes = false; + } + if (sched[name][j].to.getTime() <= schedBank[i].to.getTime() && + sched[name][j].to.getTime() >= schedBank[i].from.getTime()) { + neperesek.push({from: sched[name][j].to, to: schedBank[i].to}); + neperes = false; + } + } + if (neperes) { + neperesek.push(schedBank[i]); + } + } + schedBank = neperesek; + } + var time = null; + for (var i = 0; i < schedBank.length; i++) { + var min = (schedBank[i].to.getTime() - schedBank[i].from.getTime()) / 60000; + if (min >= duration) { + time = schedBank[i]; + break; + } + } + return { - /** - * Найдено ли время - * @returns {Boolean} - */ exists: function () { + if (time) { + return true; + } + return false; }, - /** - * Возвращает отформатированную строку с часами для ограбления - * Например, - * "Начинаем в %HH:%MM (%DD)" -> "Начинаем в 14:59 (СР)" - * @param {String} template - * @returns {String} - */ format: function (template) { - return template; + if (time){ + var days = ['ПН', 'ВТ', 'СР']; + template = template.replace('%DD', days[time.from.getDay() - 1]); + var bankTimeZone = parseInt(workingHours.from.split('+')[1]); + var currentTimeZone = -time.from.getTimezoneOffset()/60; + var h = (time.from.getHours() + (bankTimeZone - currentTimeZone)).toString(); + if (h.length == 1) h = '0' + h; + template = template.replace('%HH', h); + var m = time.from.getMinutes().toString(); + if (m.length == 1) m = '0' + m; + template = template.replace('%MM', m); + return template; + } + + return ''; }, - /** - * Попробовать найти часы для ограбления позже [*] - * @star - * @returns {Boolean} - */ tryLater: function () { return false; } From f9a93b5badb56df6da08ead00bc4f53ad4b0a948 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D1=80=D0=B5=D1=85=D0=BE=D0=B2=20=D0=9A=D0=B8=D1=80?= =?UTF-8?q?=D0=B8=D0=BB=D0=BB?= Date: Thu, 27 Oct 2016 00:10:58 +0500 Subject: [PATCH 02/10] =?UTF-8?q?=D0=9B=D0=B8=D0=BD=D1=82=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 92 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 54 insertions(+), 38 deletions(-) diff --git a/robbery.js b/robbery.js index 52381d9..2a2cae0 100644 --- a/robbery.js +++ b/robbery.js @@ -4,12 +4,14 @@ exports.isStar = false; function convertSchedule(schedule) { var res = {}; - for (var i in schedule) { - res[i] = []; - for (var j = 0; j < schedule[i].length; j++) { - var from = convertToDate(schedule[i][j].from); - var to = convertToDate(schedule[i][j].to); - res[i].push({from: from, to: to}); + var names = Object.keys(schedule); + for (var i = 0; i < names.length; i++) { + var name = names[i]; + res[name] = []; + for (var j = 0; j < schedule[name].length; j++) { + var from = convertToDate(schedule[name][j].from); + var to = convertToDate(schedule[name][j].to); + res[name].push({ from: from, to: to }); } } @@ -17,11 +19,12 @@ function convertSchedule(schedule) { } function convertToDate(stringDate) { - var days = {'ПН': 1, 'ВТ': 2, 'СР': 3, 'ЧТ': 4, 'ПТ': 5, 'СБ': 6, 'ВС': 7}; + var days = { 'ПН': 1, 'ВТ': 2, 'СР': 3, 'ЧТ': 4, 'ПТ': 5, 'СБ': 6, 'ВС': 7 }; var re = /^([А-Я]{2}) (.*)(\+\d+)$/; var parseDate = stringDate.match(re); - return new Date(Date.parse(days[parseDate[1]] + ' Jan 1900 ' + parseDate[2] + ' GMT' + parseDate[3] + '00')); + return new Date(Date.parse(days[parseDate[1]] + ' Jan 1900 ' + + parseDate[2] + ' GMT' + parseDate[3] + '00')); } function getSchedBank(workingHours) { @@ -30,73 +33,86 @@ function getSchedBank(workingHours) { for (var i = 0; i < daysOfWorkBank.length; i++) { var from = convertToDate(daysOfWorkBank[i] + ' ' + workingHours.from); var to = convertToDate(daysOfWorkBank[i] + ' ' + workingHours.to); - sched.push({from: from, to: to}); + sched.push({ from: from, to: to }); } return sched; } +function getNeperesekItem(svTime, zTime) { + var neperesekItem = []; + var neperes = true; + for (var j = 0; j < zTime.length; j++) { + if (zTime[j].from.getTime() <= svTime.to.getTime() && + zTime[j].from.getTime() >= svTime.from.getTime()) { + neperesekItem.push({from: svTime.from, to: zTime[j].from}); + neperes = false; + } + if (zTime[j].to.getTime() <= svTime.to.getTime() && + zTime[j].to.getTime() >= svTime.from.getTime()) { + neperesekItem.push({from: zTime[j].to, to: svTime.to}); + neperes = false; + } + if (zTime[j].to.getTime() >= svTime.to.getTime() && + zTime[j].from.getTime() <= svTime.from.getTime()) { + neperes = false; + } + } + if (neperes) { + neperesekItem.push(svTime); + } + return neperesekItem; +} + exports.getAppropriateMoment = function (schedule, duration, workingHours) { var sched = convertSchedule(schedule); - //console.log(sched); var schedBank = getSchedBank(workingHours); - //console.log(schedBank); - for (var name in sched) { + var names = Object.keys(sched); + for (var j = 0; j < names.length; j++) { + var name = names[j]; var neperesek = []; for (var i = 0; i < schedBank.length; i++) { - var neperes = true; - for (var j = 0; j < sched[name].length; j++) { - if (sched[name][j].from.getTime() <= schedBank[i].to.getTime() && - sched[name][j].from.getTime() >= schedBank[i].from.getTime()) { - neperesek.push({from: schedBank[i].from, to: sched[name][j].from}); - neperes = false; - } - if (sched[name][j].to.getTime() <= schedBank[i].to.getTime() && - sched[name][j].to.getTime() >= schedBank[i].from.getTime()) { - neperesek.push({from: sched[name][j].to, to: schedBank[i].to}); - neperes = false; - } - } - if (neperes) { - neperesek.push(schedBank[i]); - } + var item = getNeperesekItem(schedBank[i], sched[name]); + neperesek = neperesek.concat(item); } schedBank = neperesek; } var time = null; - for (var i = 0; i < schedBank.length; i++) { - var min = (schedBank[i].to.getTime() - schedBank[i].from.getTime()) / 60000; + for (var n = 0; n < schedBank.length; n++) { + var min = (schedBank[n].to.getTime() - schedBank[n].from.getTime()) / 60000; if (min >= duration) { - time = schedBank[i]; + time = schedBank[n]; break; } } - return { exists: function () { if (time) { return true; } - return false; }, format: function (template) { - if (time){ + if (time) { var days = ['ПН', 'ВТ', 'СР']; template = template.replace('%DD', days[time.from.getDay() - 1]); var bankTimeZone = parseInt(workingHours.from.split('+')[1]); - var currentTimeZone = -time.from.getTimezoneOffset()/60; + var currentTimeZone = - time.from.getTimezoneOffset() / 60; var h = (time.from.getHours() + (bankTimeZone - currentTimeZone)).toString(); - if (h.length == 1) h = '0' + h; + if (h.length === 1) { + h = '0' + h; + } template = template.replace('%HH', h); var m = time.from.getMinutes().toString(); - if (m.length == 1) m = '0' + m; + if (m.length === 1) { + m = '0' + m; + } template = template.replace('%MM', m); + return template; } - return ''; }, From eed75f3d6be766f33c65e452dc591ba5b721acce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D1=80=D0=B5=D1=85=D0=BE=D0=B2=20=D0=9A=D0=B8=D1=80?= =?UTF-8?q?=D0=B8=D0=BB=D0=BB?= Date: Thu, 27 Oct 2016 00:16:09 +0500 Subject: [PATCH 03/10] =?UTF-8?q?=D0=95=D1=89=D1=91=20=D0=BB=D0=B8=D0=BD?= =?UTF-8?q?=D1=82=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/robbery.js b/robbery.js index 2a2cae0..dfbcec9 100644 --- a/robbery.js +++ b/robbery.js @@ -23,8 +23,8 @@ function convertToDate(stringDate) { var re = /^([А-Я]{2}) (.*)(\+\d+)$/; var parseDate = stringDate.match(re); - return new Date(Date.parse(days[parseDate[1]] + ' Jan 1900 ' - + parseDate[2] + ' GMT' + parseDate[3] + '00')); + return new Date(Date.parse(days[parseDate[1]] + ' Jan 1900 ' + + parseDate[2] + ' GMT' + parseDate[3] + '00')); } function getSchedBank(workingHours) { @@ -45,12 +45,12 @@ function getNeperesekItem(svTime, zTime) { for (var j = 0; j < zTime.length; j++) { if (zTime[j].from.getTime() <= svTime.to.getTime() && zTime[j].from.getTime() >= svTime.from.getTime()) { - neperesekItem.push({from: svTime.from, to: zTime[j].from}); + neperesekItem.push({ from: svTime.from, to: zTime[j].from }); neperes = false; } if (zTime[j].to.getTime() <= svTime.to.getTime() && zTime[j].to.getTime() >= svTime.from.getTime()) { - neperesekItem.push({from: zTime[j].to, to: svTime.to}); + neperesekItem.push({ from: zTime[j].to, to: svTime.to }); neperes = false; } if (zTime[j].to.getTime() >= svTime.to.getTime() && @@ -61,6 +61,7 @@ function getNeperesekItem(svTime, zTime) { if (neperes) { neperesekItem.push(svTime); } + return neperesekItem; } @@ -69,11 +70,9 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { var schedBank = getSchedBank(workingHours); var names = Object.keys(sched); for (var j = 0; j < names.length; j++) { - var name = names[j]; var neperesek = []; for (var i = 0; i < schedBank.length; i++) { - var item = getNeperesekItem(schedBank[i], sched[name]); - neperesek = neperesek.concat(item); + neperesek = neperesek.concat(getNeperesekItem(schedBank[i], sched[names[j]])); } schedBank = neperesek; } @@ -85,12 +84,14 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { break; } } + return { exists: function () { if (time) { return true; } + return false; }, @@ -113,6 +114,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { return template; } + return ''; }, From f19feb496cb990b4e0d2b9cb8569c200187c3fc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D1=80=D0=B5=D1=85=D0=BE=D0=B2=20=D0=9A=D0=B8=D1=80?= =?UTF-8?q?=D0=B8=D0=BB=D0=BB?= Date: Thu, 27 Oct 2016 00:33:50 +0500 Subject: [PATCH 04/10] =?UTF-8?q?=D0=A7=D0=B0=D1=81=D0=BE=D0=B2=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=BF=D0=BE=D1=8F=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/robbery.js b/robbery.js index dfbcec9..f6b8909 100644 --- a/robbery.js +++ b/robbery.js @@ -97,11 +97,12 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { format: function (template) { if (time) { - var days = ['ПН', 'ВТ', 'СР']; - template = template.replace('%DD', days[time.from.getDay() - 1]); var bankTimeZone = parseInt(workingHours.from.split('+')[1]); var currentTimeZone = - time.from.getTimezoneOffset() / 60; - var h = (time.from.getHours() + (bankTimeZone - currentTimeZone)).toString(); + time.from.setHours(time.from.getHours() + (bankTimeZone - currentTimeZone)); + var days = ['ПН', 'ВТ', 'СР']; + template = template.replace('%DD', days[time.from.getDay() - 1]); + var h = time.from.getHours().toString(); if (h.length === 1) { h = '0' + h; } From 78004deeab7aa3394e0923aa7426237495c9a0b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D1=80=D0=B5=D1=85=D0=BE=D0=B2=20=D0=9A=D0=B8=D1=80?= =?UTF-8?q?=D0=B8=D0=BB=D0=BB?= Date: Thu, 27 Oct 2016 00:46:36 +0500 Subject: [PATCH 05/10] =?UTF-8?q?=D0=9B=D0=B8=D0=BD=D1=82=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3=20=D0=B8=20=D1=87=D0=B0=D1=81=D0=BE=D0=B2=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=8F=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/robbery.js b/robbery.js index f6b8909..813e9a9 100644 --- a/robbery.js +++ b/robbery.js @@ -2,15 +2,15 @@ exports.isStar = false; -function convertSchedule(schedule) { +function convertSchedule(schedule, bankTimeZone) { var res = {}; var names = Object.keys(schedule); for (var i = 0; i < names.length; i++) { var name = names[i]; res[name] = []; for (var j = 0; j < schedule[name].length; j++) { - var from = convertToDate(schedule[name][j].from); - var to = convertToDate(schedule[name][j].to); + var from = convertToDate(schedule[name][j].from, bankTimeZone); + var to = convertToDate(schedule[name][j].to, bankTimeZone); res[name].push({ from: from, to: to }); } } @@ -18,21 +18,24 @@ function convertSchedule(schedule) { return res; } -function convertToDate(stringDate) { +function convertToDate(stringDate, bankTimeZone) { var days = { 'ПН': 1, 'ВТ': 2, 'СР': 3, 'ЧТ': 4, 'ПТ': 5, 'СБ': 6, 'ВС': 7 }; var re = /^([А-Я]{2}) (.*)(\+\d+)$/; var parseDate = stringDate.match(re); - - return new Date(Date.parse(days[parseDate[1]] + ' Jan 1900 ' + + var date = new Date(Date.parse(days[parseDate[1]] + ' Jan 1900 ' + parseDate[2] + ' GMT' + parseDate[3] + '00')); + var currentTimeZone = - date.getTimezoneOffset() / 60; + date.setHours(date.getHours() + (bankTimeZone - currentTimeZone)); + + return date; } -function getSchedBank(workingHours) { +function getSchedBank(workingHours, bankTimeZone) { var daysOfWorkBank = ['ПН', 'ВТ', 'СР']; var sched = []; for (var i = 0; i < daysOfWorkBank.length; i++) { - var from = convertToDate(daysOfWorkBank[i] + ' ' + workingHours.from); - var to = convertToDate(daysOfWorkBank[i] + ' ' + workingHours.to); + var from = convertToDate(daysOfWorkBank[i] + ' ' + workingHours.from, bankTimeZone); + var to = convertToDate(daysOfWorkBank[i] + ' ' + workingHours.to, bankTimeZone); sched.push({ from: from, to: to }); } @@ -66,8 +69,9 @@ function getNeperesekItem(svTime, zTime) { } exports.getAppropriateMoment = function (schedule, duration, workingHours) { - var sched = convertSchedule(schedule); - var schedBank = getSchedBank(workingHours); + var bankTimeZone = parseInt(workingHours.from.split('+')[1]); + var sched = convertSchedule(schedule, bankTimeZone); + var schedBank = getSchedBank(workingHours, bankTimeZone); var names = Object.keys(sched); for (var j = 0; j < names.length; j++) { var neperesek = []; @@ -97,9 +101,6 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { format: function (template) { if (time) { - var bankTimeZone = parseInt(workingHours.from.split('+')[1]); - var currentTimeZone = - time.from.getTimezoneOffset() / 60; - time.from.setHours(time.from.getHours() + (bankTimeZone - currentTimeZone)); var days = ['ПН', 'ВТ', 'СР']; template = template.replace('%DD', days[time.from.getDay() - 1]); var h = time.from.getHours().toString(); From a3ea3254a86ed95e94fe9c330114c4574b0d42ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D1=80=D0=B5=D1=85=D0=BE=D0=B2=20=D0=9A=D0=B8=D1=80?= =?UTF-8?q?=D0=B8=D0=BB=D0=BB?= Date: Thu, 27 Oct 2016 00:53:45 +0500 Subject: [PATCH 06/10] =?UTF-8?q?=D0=9E=D0=BF=D1=8F=D1=82=D1=8C=20=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D1=82=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/robbery.js b/robbery.js index 813e9a9..0af37c7 100644 --- a/robbery.js +++ b/robbery.js @@ -68,6 +68,19 @@ function getNeperesekItem(svTime, zTime) { return neperesekItem; } +function findFreeTime(schedBank, duration) { + var time = null; + for (var n = 0; n < schedBank.length; n++) { + var min = (schedBank[n].to.getTime() - schedBank[n].from.getTime()) / 60000; + if (min >= duration) { + time = schedBank[n]; + break; + } + } + + return time; +} + exports.getAppropriateMoment = function (schedule, duration, workingHours) { var bankTimeZone = parseInt(workingHours.from.split('+')[1]); var sched = convertSchedule(schedule, bankTimeZone); @@ -80,14 +93,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { } schedBank = neperesek; } - var time = null; - for (var n = 0; n < schedBank.length; n++) { - var min = (schedBank[n].to.getTime() - schedBank[n].from.getTime()) / 60000; - if (min >= duration) { - time = schedBank[n]; - break; - } - } + var time = findFreeTime(schedBank, duration); return { From 5fe6ae872193f0dd1d750591013a2ec4591cc175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D1=80=D0=B5=D1=85=D0=BE=D0=B2=20=D0=9A=D0=B8=D1=80?= =?UTF-8?q?=D0=B8=D0=BB=D0=BB?= Date: Thu, 27 Oct 2016 03:26:36 +0500 Subject: [PATCH 07/10] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 163 +++++++++++++++++++++++++++++------------------------ 1 file changed, 90 insertions(+), 73 deletions(-) diff --git a/robbery.js b/robbery.js index 0af37c7..f09364d 100644 --- a/robbery.js +++ b/robbery.js @@ -2,103 +2,121 @@ exports.isStar = false; -function convertSchedule(schedule, bankTimeZone) { - var res = {}; - var names = Object.keys(schedule); - for (var i = 0; i < names.length; i++) { - var name = names[i]; - res[name] = []; - for (var j = 0; j < schedule[name].length; j++) { - var from = convertToDate(schedule[name][j].from, bankTimeZone); - var to = convertToDate(schedule[name][j].to, bankTimeZone); - res[name].push({ from: from, to: to }); - } +var DAYS = ['ПН', 'ВТ', 'СР']; +var BANK_TIME_ZONE; + +function getBankSchedule(workingHours) { + var bankSchedule = []; + for (var i = 0; i < DAYS.length; i++) { + var from = convertToDate(DAYS[i] + ' ' + workingHours.from); + var to = convertToDate(DAYS[i] + ' ' + workingHours.to); + bankSchedule.push({ from: from, to: to }); } - return res; + return bankSchedule; } -function convertToDate(stringDate, bankTimeZone) { +function convertToDate(stringDate) { var days = { 'ПН': 1, 'ВТ': 2, 'СР': 3, 'ЧТ': 4, 'ПТ': 5, 'СБ': 6, 'ВС': 7 }; var re = /^([А-Я]{2}) (.*)(\+\d+)$/; var parseDate = stringDate.match(re); var date = new Date(Date.parse(days[parseDate[1]] + ' Jan 1900 ' + parseDate[2] + ' GMT' + parseDate[3] + '00')); var currentTimeZone = - date.getTimezoneOffset() / 60; - date.setHours(date.getHours() + (bankTimeZone - currentTimeZone)); + date.setHours(date.getHours() + (BANK_TIME_ZONE - currentTimeZone)); return date; } -function getSchedBank(workingHours, bankTimeZone) { - var daysOfWorkBank = ['ПН', 'ВТ', 'СР']; - var sched = []; - for (var i = 0; i < daysOfWorkBank.length; i++) { - var from = convertToDate(daysOfWorkBank[i] + ' ' + workingHours.from, bankTimeZone); - var to = convertToDate(daysOfWorkBank[i] + ' ' + workingHours.to, bankTimeZone); - sched.push({ from: from, to: to }); +function getCompanionsSchedule(schedule) { + var companionsSchedule = {}; + var names = Object.keys(schedule); + for (var i = 0; i < names.length; i++) { + var name = names[i]; + companionsSchedule[name] = []; + for (var j = 0; j < schedule[name].length; j++) { + var from = convertToDate(schedule[name][j].from); + var to = convertToDate(schedule[name][j].to); + companionsSchedule[name].push({ from: from, to: to }); + } } - return sched; + return companionsSchedule; } -function getNeperesekItem(svTime, zTime) { - var neperesekItem = []; - var neperes = true; - for (var j = 0; j < zTime.length; j++) { - if (zTime[j].from.getTime() <= svTime.to.getTime() && - zTime[j].from.getTime() >= svTime.from.getTime()) { - neperesekItem.push({ from: svTime.from, to: zTime[j].from }); - neperes = false; +function findFreeTimeSchedule(bankSchedule, companionsSchedule) { + var freeTimeSchedule = bankSchedule.slice(); + var names = Object.keys(companionsSchedule); + for (var i = 0; i < names.length; i++) { + var newFreeTimes = []; + for (var j = 0; j < freeTimeSchedule.length; j++) { + newFreeTimes = newFreeTimes.concat( + getNotIntersectedTime(freeTimeSchedule[j], companionsSchedule[names[i]]) + ); } - if (zTime[j].to.getTime() <= svTime.to.getTime() && - zTime[j].to.getTime() >= svTime.from.getTime()) { - neperesekItem.push({ from: zTime[j].to, to: svTime.to }); - neperes = false; + freeTimeSchedule = newFreeTimes; + } + + return freeTimeSchedule; +} + +function getNotIntersectedTime(freeTime, busyTimes) { + var notIntersectedTime = []; + var freeTimeIsNotIntersected = true; + for (var j = 0; j < busyTimes.length; j++) { + if (isTimeInInterval(busyTimes[j].from, freeTime)) { + notIntersectedTime.push({ from: freeTime.from, to: busyTimes[j].from }); + freeTimeIsNotIntersected = false; } - if (zTime[j].to.getTime() >= svTime.to.getTime() && - zTime[j].from.getTime() <= svTime.from.getTime()) { - neperes = false; + if (isTimeInInterval(busyTimes[j].to, freeTime)) { + notIntersectedTime.push({ from: busyTimes[j].to, to: freeTime.to }); + freeTimeIsNotIntersected = false; + } + if (isIntervalInInterval(freeTime, busyTimes[j])) { + freeTimeIsNotIntersected = false; } } - if (neperes) { - neperesekItem.push(svTime); + if (freeTimeIsNotIntersected) { + notIntersectedTime.push(freeTime); } - return neperesekItem; + return notIntersectedTime; +} + +function isTimeInInterval(time, interval) { + return interval.from.getTime() <= time.getTime() && time.getTime() <= interval.to.getTime(); } -function findFreeTime(schedBank, duration) { - var time = null; - for (var n = 0; n < schedBank.length; n++) { - var min = (schedBank[n].to.getTime() - schedBank[n].from.getTime()) / 60000; - if (min >= duration) { - time = schedBank[n]; +function isIntervalInInterval(verifiableInterval, interval) { + return (interval.from.getTime() <= verifiableInterval.from.getTime() && + verifiableInterval.to.getTime() <= interval.to.getTime()); +} + +function findTimeForRobbery(freeTimeSchedule, duration) { + var timeForRobbery = null; + for (var i = 0; i < freeTimeSchedule.length; i++) { + var minutes = (freeTimeSchedule[i].to.getTime() - freeTimeSchedule[i].from.getTime()) / + 60000; + if (minutes >= duration) { + timeForRobbery = freeTimeSchedule[i]; break; } } - return time; + return timeForRobbery; } exports.getAppropriateMoment = function (schedule, duration, workingHours) { - var bankTimeZone = parseInt(workingHours.from.split('+')[1]); - var sched = convertSchedule(schedule, bankTimeZone); - var schedBank = getSchedBank(workingHours, bankTimeZone); - var names = Object.keys(sched); - for (var j = 0; j < names.length; j++) { - var neperesek = []; - for (var i = 0; i < schedBank.length; i++) { - neperesek = neperesek.concat(getNeperesekItem(schedBank[i], sched[names[j]])); - } - schedBank = neperesek; - } - var time = findFreeTime(schedBank, duration); + BANK_TIME_ZONE = parseInt(workingHours.from.split('+')[1]); + var bankSchedule = getBankSchedule(workingHours); + var companionsSchedule = getCompanionsSchedule(schedule); + var freeTimeSchedule = findFreeTimeSchedule(bankSchedule, companionsSchedule); + var timeForRobbery = findTimeForRobbery(freeTimeSchedule, duration); return { exists: function () { - if (time) { + if (timeForRobbery) { return true; } @@ -106,21 +124,20 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { }, format: function (template) { - if (time) { - var days = ['ПН', 'ВТ', 'СР']; - template = template.replace('%DD', days[time.from.getDay() - 1]); - var h = time.from.getHours().toString(); - if (h.length === 1) { - h = '0' + h; + if (timeForRobbery) { + var day = DAYS[timeForRobbery.from.getDay() - 1]; + var hours = timeForRobbery.from.getHours().toString(); + if (hours.length === 1) { + hours = '0' + hours; } - template = template.replace('%HH', h); - var m = time.from.getMinutes().toString(); - if (m.length === 1) { - m = '0' + m; + var minutes = timeForRobbery.from.getMinutes().toString(); + if (minutes.length === 1) { + minutes = '0' + minutes; } - template = template.replace('%MM', m); - - return template; + return template + .replace('%DD', day) + .replace('%HH', hours) + .replace('%MM', minutes); } return ''; From 8bca6428e2d76384318abf6832374c836c6590e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D1=80=D0=B5=D1=85=D0=BE=D0=B2=20=D0=9A=D0=B8=D1=80?= =?UTF-8?q?=D0=B8=D0=BB=D0=BB?= Date: Thu, 27 Oct 2016 03:28:23 +0500 Subject: [PATCH 08/10] newline-before-return --- robbery.js | 1 + 1 file changed, 1 insertion(+) diff --git a/robbery.js b/robbery.js index f09364d..b130dc4 100644 --- a/robbery.js +++ b/robbery.js @@ -134,6 +134,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { if (minutes.length === 1) { minutes = '0' + minutes; } + return template .replace('%DD', day) .replace('%HH', hours) From 77bd5d30a0e7c09f2a1136dbced66e9a3c15eed4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D1=80=D0=B5=D1=85=D0=BE=D0=B2=20=D0=9A=D0=B8=D1=80?= =?UTF-8?q?=D0=B8=D0=BB=D0=BB?= Date: Thu, 27 Oct 2016 04:46:29 +0500 Subject: [PATCH 09/10] UTC --- robbery.js | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/robbery.js b/robbery.js index b130dc4..5db6ea2 100644 --- a/robbery.js +++ b/robbery.js @@ -18,12 +18,12 @@ function getBankSchedule(workingHours) { function convertToDate(stringDate) { var days = { 'ПН': 1, 'ВТ': 2, 'СР': 3, 'ЧТ': 4, 'ПТ': 5, 'СБ': 6, 'ВС': 7 }; - var re = /^([А-Я]{2}) (.*)(\+\d+)$/; + //var re = /^([А-Я]{2}) (.*)(\+\d+)$/; + var re = /^([А-Я]{2}) (\d{2}):(\d{2})(\+\d+)$/; var parseDate = stringDate.match(re); - var date = new Date(Date.parse(days[parseDate[1]] + ' Jan 1900 ' + - parseDate[2] + ' GMT' + parseDate[3] + '00')); - var currentTimeZone = - date.getTimezoneOffset() / 60; - date.setHours(date.getHours() + (BANK_TIME_ZONE - currentTimeZone)); + var date = new Date(Date.UTC(0, 0, days[parseDate[1]], + parseInt(parseDate[2]) - parseInt(parseDate[4]), + parseInt(parseDate[3]))); return date; } @@ -116,25 +116,23 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { return { exists: function () { - if (timeForRobbery) { - return true; - } - - return false; + return timeForRobbery !== null; }, format: function (template) { if (timeForRobbery) { - var day = DAYS[timeForRobbery.from.getDay() - 1]; - var hours = timeForRobbery.from.getHours().toString(); + timeForRobbery.from.setUTCHours( + timeForRobbery.from.getUTCHours() + BANK_TIME_ZONE + ); + var day = DAYS[timeForRobbery.from.getUTCDay() - 1]; + var hours = timeForRobbery.from.getUTCHours().toString(); if (hours.length === 1) { hours = '0' + hours; } - var minutes = timeForRobbery.from.getMinutes().toString(); + var minutes = timeForRobbery.from.getUTCMinutes().toString(); if (minutes.length === 1) { minutes = '0' + minutes; } - return template .replace('%DD', day) .replace('%HH', hours) From 5f8b84df311aa49031f68ca62ae7525a35216998 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D1=80=D0=B5=D1=85=D0=BE=D0=B2=20=D0=9A=D0=B8=D1=80?= =?UTF-8?q?=D0=B8=D0=BB=D0=BB?= Date: Thu, 27 Oct 2016 04:48:39 +0500 Subject: [PATCH 10/10] ... --- robbery.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/robbery.js b/robbery.js index 5db6ea2..cd690af 100644 --- a/robbery.js +++ b/robbery.js @@ -18,7 +18,6 @@ function getBankSchedule(workingHours) { function convertToDate(stringDate) { var days = { 'ПН': 1, 'ВТ': 2, 'СР': 3, 'ЧТ': 4, 'ПТ': 5, 'СБ': 6, 'ВС': 7 }; - //var re = /^([А-Я]{2}) (.*)(\+\d+)$/; var re = /^([А-Я]{2}) (\d{2}):(\d{2})(\+\d+)$/; var parseDate = stringDate.match(re); var date = new Date(Date.UTC(0, 0, days[parseDate[1]], @@ -133,6 +132,7 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { if (minutes.length === 1) { minutes = '0' + minutes; } + return template .replace('%DD', day) .replace('%HH', hours)