From c8d3d2693b24358c72b54a23fcc7d936ccfe6d56 Mon Sep 17 00:00:00 2001 From: valerin5 Date: Wed, 18 Oct 2017 23:48:42 +0500 Subject: [PATCH 1/5] Update robbery.js --- robbery.js | 268 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 264 insertions(+), 4 deletions(-) diff --git a/robbery.js b/robbery.js index 4a8309d..325299a 100644 --- a/robbery.js +++ b/robbery.js @@ -1,9 +1,223 @@ 'use strict'; - +/* eslint-disable complexity */ /** * Сделано задание на звездочку * Реализовано оба метода и tryLater */ + +function isTimeWork(time, timeBankFrom, timeBankTo) { + if (time < timeBankTo && time >= timeBankFrom) { + return true; + } + + return false; +} +function switchDay(day) { + switch (day) { + case 'ВТ': + return 1440; + case 'СР': + return 2880; + default: + return 0; + + } + +} +function calcTime(timeBad, deltaGMT) { + var dayWeek = { + from: '', + to: '' + }; + var personObject = { + from: 0, + to: 0 + }; + dayWeek.from = timeBad.from.split(' ')[0]; + timeBad.from = (timeBad.from.split(' ')[1]).split('+')[0].split(':'); + dayWeek.to = timeBad.to.split(' ')[0]; + timeBad.to = (timeBad.to.split(' ')[1]).split('+')[0].split(':'); + personObject.from = Number(timeBad.from[0]) * 60 + Number(timeBad.from[1]) + 60 * deltaGMT; + personObject.to = Number(timeBad.to[0]) * 60 + Number(timeBad.to[1]) + 60 * deltaGMT; + + personObject.from = personObject.from + switchDay(dayWeek.from); + personObject.to = personObject.to + switchDay(dayWeek.to); + + return personObject; + +} + +function parsString(person, gmtBank) { + var s = 0; + var personObject = { + from: [], + to: [] + }; + var gmtPerson = Number(person[1].from.split('+')[1]); + var deltaGMT = gmtBank - gmtPerson; + for (var i = 0; i < person.length; i++) { + var timeBad = person[i]; + timeBad = calcTime(timeBad, deltaGMT); + personObject.from[s] = timeBad.from; + personObject.to[s] = timeBad.to; + s = s + 1; + } + + return personObject; +} + +function timelineBank(workingHours) { + let timeBankFrom = (workingHours.from.split('+')[0]); + timeBankFrom = Number(timeBankFrom.split(':')[0]) * 60 + Number(timeBankFrom.split(':')[1]); + let timeBankTo = (workingHours.to.split('+')[0]); + timeBankTo = Number(timeBankTo.split(':')[0]) * 60 + Number(timeBankTo.split(':')[1]); + let timeline = []; + + for (var i = 0; i < 3; i++) { + timeline[i] = []; + for (var j = 0; j < 1440; j++) { + timeline[i][j] = isTimeWork(j, timeBankFrom, timeBankTo); + } + } + + return timeline; + +} + +function changeTimeline(start, end, timeline) { + for (var j = start; j < end; j++) { + timeline[Math.ceil(j / 1440) - 1][j % 1440] = false; + } + + return timeline; +} + + +function calculating(timeline, badTime) { + for (var i = 0; i < badTime.from.length; i++) { + if (badTime.from[i] < 0 && badTime.to[i] < 0) { + continue; + } else if (badTime.from[i] < 0) { + timeline = changeTimeline(0, badTime.to[i], timeline); + } else { + timeline = changeTimeline(badTime.from[i], badTime.to[i], timeline); + } + } + + return timeline; +} + +function findTimeInDay(day, duration) { + let flag = 0; + let score = -1; + for (var j = 0; j < 1440; j++) { + if (flag === 0 && day[j] === true) { + flag = 1; + score = duration - 1; + } else if (flag === 1 && day[j] === true && score !== 0) { + score = score - 1; + } else if (flag === 1 && score === 0) { + + return (j - duration); + } else if (flag === 1 && day[j] === false && score === 0) { + + return (j - duration); + } else if (flag === 1 && day[j] === false) { + flag = 0; + score = -1; + } + } + if (score !== 0) { + return false; + } + + return (1440 - duration); +} + +function findTime(timeline, duration) { + let result; + for (var i = 0; i < 3; i++) { + result = findTimeInDay(timeline[i], duration); + if (result !== false) { + + return [i, result]; + } + } + + return false; +} + +function createString(str, day, hour, minute) { + if (hour.length < 2) { + hour = '0' + hour; + } + if (minute.length < 2) { + minute = '0' + minute; + } + switch (str[1].substr(0, 2)) { + case ('DD'): + str[1] = day + str[1].substr(2); + break; + case ('HH'): + str[1] = hour + str[1].substr(2); + break; + default: + str[1] = minute + str[1].substr(2); + break; + } + switch (str[2].substr(0, 2)) { + case ('DD'): + str[2] = day + str[2].substr(2); + break; + case ('HH'): + str[2] = hour + str[2].substr(2); + break; + default: + str[2] = minute + str[2].substr(2); + break; + } + switch (str[3].substr(0, 2)) { + case ('DD'): + str[3] = day + str[3].substr(2); + break; + case ('HH'): + str[3] = hour + str[3].substr(2); + break; + default: + str[3] = minute + str[3].substr(2); + break; + } + + return (str[0] + str[1] + str[2] + str[3]); +} + +function laterTimeline(timeline, time) { + for (var i = 0; i < 30 && (time[1] + i) < 1440; i++) { + timeline[time[0]][time[1] + i] = false; + } + + return timeline; +} + +function createMoment(timeline, duration, timeOld) { + let moment = findTime(timeline, duration); + if (moment === false) { + moment = { + existsMoment: false, + timeline: timeline, + time: timeOld + }; + } else { + moment = { + existsMoment: true, + timeline: timeline, + time: moment + }; + } + + return moment; +} + exports.isStar = true; /** @@ -16,6 +230,18 @@ exports.isStar = true; */ exports.getAppropriateMoment = function (schedule, duration, workingHours) { console.info(schedule, duration, workingHours); + let gmt = Number(workingHours.from.split('+')[1]); + + let dannyBadTime = parsString(schedule.Danny, gmt); + + let rustyBadTime = parsString(schedule.Rusty, gmt); + let linusBadTime = parsString(schedule.Linus, gmt); + let timeline = timelineBank(workingHours); + timeline = calculating(timeline, dannyBadTime); + timeline = calculating(timeline, rustyBadTime); + timeline = calculating(timeline, linusBadTime); + let moment = { time: [] }; + moment = createMoment(timeline, duration, moment.time); return { @@ -24,7 +250,8 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {Boolean} */ exists: function () { - return false; + + return moment.existsMoment; }, /** @@ -35,7 +262,35 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {String} */ format: function (template) { - return template; + let str = template.split('%'); + let date = moment.time; + if (moment.existsMoment === false && moment.time.length === 0) { + + return ''; + } + let day = ''; + let hour = 0; + let minute; + switch (date[0]) { + case 0: + day = 'ПН'; + break; + case 1: + day = 'ВТ'; + break; + default: + day = 'СР'; + } + if (date[1] % 60 > 0) { + hour = String(Math.ceil(date[1] / 60) - 1); + } else { + hour = String(Math.ceil(date[1] / 60)); + } + minute = String(date[1] % 60); + str = createString(str, day, hour, minute); + console.info(str); + + return str; }, /** @@ -44,7 +299,12 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { * @returns {Boolean} */ tryLater: function () { - return false; + moment.timeline = laterTimeline(moment.timeline, moment.time); + moment = createMoment(moment.timeline, duration, moment.time); + console.info(moment.existsMoment); + + return moment.existsMoment; } }; }; + From f9f533bc674c54db12c10d1e82219f12be65bbf6 Mon Sep 17 00:00:00 2001 From: valerin5 Date: Thu, 19 Oct 2017 00:12:18 +0500 Subject: [PATCH 2/5] Update robbery.js --- robbery.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/robbery.js b/robbery.js index 325299a..11c8a30 100644 --- a/robbery.js +++ b/robbery.js @@ -97,8 +97,14 @@ function calculating(timeline, badTime) { for (var i = 0; i < badTime.from.length; i++) { if (badTime.from[i] < 0 && badTime.to[i] < 0) { continue; + } else if (badTime.to[i] > 4320 && badTime.from[i] > 4320) { + continue; + } else if (badTime.to[i] > 4320 && badTime.from[i] < 0) { + timeline = changeTimeline(0, 4320); } else if (badTime.from[i] < 0) { timeline = changeTimeline(0, badTime.to[i], timeline); + } else if (badTime.to[i] > 4320) { + timeline = changeTimeline(badTime.from[i], 4320); } else { timeline = changeTimeline(badTime.from[i], badTime.to[i], timeline); } From 30f35fc5e1371ca568750c6b9ddfb5b2b1b2544c Mon Sep 17 00:00:00 2001 From: valerin5 Date: Thu, 19 Oct 2017 13:17:30 +0500 Subject: [PATCH 3/5] Update robbery.js --- robbery.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/robbery.js b/robbery.js index 11c8a30..c88fa9a 100644 --- a/robbery.js +++ b/robbery.js @@ -237,15 +237,17 @@ exports.isStar = true; exports.getAppropriateMoment = function (schedule, duration, workingHours) { console.info(schedule, duration, workingHours); let gmt = Number(workingHours.from.split('+')[1]); - - let dannyBadTime = parsString(schedule.Danny, gmt); + let badTime = parsString(schedule.Danny, gmt); let rustyBadTime = parsString(schedule.Rusty, gmt); + badTime.to = badTime.to.concat(rustyBadTime.to); + badTime.from = badTime.from.concat(rustyBadTime.from); let linusBadTime = parsString(schedule.Linus, gmt); + badTime.from = badTime.from.concat(linusBadTime.from); + badTime.to = badTime.to.concat(linusBadTime.to); + let timeline = timelineBank(workingHours); - timeline = calculating(timeline, dannyBadTime); - timeline = calculating(timeline, rustyBadTime); - timeline = calculating(timeline, linusBadTime); + timeline = calculating(timeline, badTime); let moment = { time: [] }; moment = createMoment(timeline, duration, moment.time); From 99832442dcb7b50527c602cd78f2ecc31d727b50 Mon Sep 17 00:00:00 2001 From: valerin5 Date: Wed, 25 Oct 2017 23:51:07 +0500 Subject: [PATCH 4/5] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D1=8C=D1=8E=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D1=83=20=D1=82?= =?UTF-8?q?=D0=B0=D0=B9=D0=BC=D0=BB=D0=B0=D0=B9=D0=BD=D0=B0,=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D1=8D=D1=82=D0=BE=20=D0=BC?= =?UTF-8?q?=D0=B0=D1=81=D1=81=D0=B8=D0=B2=20=D0=BE=D0=B1=D1=8C=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robbery.js | 192 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 111 insertions(+), 81 deletions(-) diff --git a/robbery.js b/robbery.js index c88fa9a..9f9e2c5 100644 --- a/robbery.js +++ b/robbery.js @@ -1,17 +1,10 @@ 'use strict'; -/* eslint-disable complexity */ +/* eslint-disable complexity, max-statements, max-depth */ /** * Сделано задание на звездочку * Реализовано оба метода и tryLater */ -function isTimeWork(time, timeBankFrom, timeBankTo) { - if (time < timeBankTo && time >= timeBankFrom) { - return true; - } - - return false; -} function switchDay(day) { switch (day) { case 'ВТ': @@ -24,6 +17,7 @@ function switchDay(day) { } } + function calcTime(timeBad, deltaGMT) { var dayWeek = { from: '', @@ -48,19 +42,12 @@ function calcTime(timeBad, deltaGMT) { } function parsString(person, gmtBank) { - var s = 0; - var personObject = { - from: [], - to: [] - }; - var gmtPerson = Number(person[1].from.split('+')[1]); - var deltaGMT = gmtBank - gmtPerson; + let personObject = []; + let gmtPerson = Number(person[1].from.split('+')[1]); + let deltaGMT = gmtBank - gmtPerson; for (var i = 0; i < person.length; i++) { - var timeBad = person[i]; - timeBad = calcTime(timeBad, deltaGMT); - personObject.from[s] = timeBad.from; - personObject.to[s] = timeBad.to; - s = s + 1; + let timeBad = person[i]; + personObject.push(calcTime(timeBad, deltaGMT)); } return personObject; @@ -74,79 +61,85 @@ function timelineBank(workingHours) { let timeline = []; for (var i = 0; i < 3; i++) { - timeline[i] = []; - for (var j = 0; j < 1440; j++) { - timeline[i][j] = isTimeWork(j, timeBankFrom, timeBankTo); - } + timeline[i] = { + from: timeBankFrom + 1440 * i, + to: timeBankTo + 1440 * i + }; } return timeline; } -function changeTimeline(start, end, timeline) { - for (var j = start; j < end; j++) { - timeline[Math.ceil(j / 1440) - 1][j % 1440] = false; +function changeTimeline(moment, badTime) { + if ((moment.from >= badTime.from) && (moment.to <= badTime.to)) { + return {}; + } else if ((moment.from >= badTime.to) || (moment.to <= badTime.from)) { + return moment; + } else if ((moment.from >= badTime.from) && (moment.to > badTime.to)) { + return { + from: badTime.to, + to: moment.to + }; + } else if ((moment.from > badTime.from) && (moment.to <= badTime.to)) { + return { + from: moment.from, + to: badTime.from + }; } - return timeline; + return [{ + from: moment.from, + to: badTime.from + }, { + from: badTime.to, + to: moment.to + }]; } - -function calculating(timeline, badTime) { - for (var i = 0; i < badTime.from.length; i++) { - if (badTime.from[i] < 0 && badTime.to[i] < 0) { - continue; - } else if (badTime.to[i] > 4320 && badTime.from[i] > 4320) { - continue; - } else if (badTime.to[i] > 4320 && badTime.from[i] < 0) { - timeline = changeTimeline(0, 4320); - } else if (badTime.from[i] < 0) { - timeline = changeTimeline(0, badTime.to[i], timeline); - } else if (badTime.to[i] > 4320) { - timeline = changeTimeline(badTime.from[i], 4320); - } else { - timeline = changeTimeline(badTime.from[i], badTime.to[i], timeline); +function filterDublication(array) { + let newArray = []; + for (let i = 0; i < array.length; i++) { + let flag = 0; + for (let j = i + 1; j < array.length; j++) { + if ((array[i].from === array[j].from) && (array[i].from === array[j].from)) { + flag = 1; + break; + } + } + if (flag === 0) { + newArray.push(array[i]); } } - return timeline; + return newArray; } -function findTimeInDay(day, duration) { - let flag = 0; - let score = -1; - for (var j = 0; j < 1440; j++) { - if (flag === 0 && day[j] === true) { - flag = 1; - score = duration - 1; - } else if (flag === 1 && day[j] === true && score !== 0) { - score = score - 1; - } else if (flag === 1 && score === 0) { - - return (j - duration); - } else if (flag === 1 && day[j] === false && score === 0) { - - return (j - duration); - } else if (flag === 1 && day[j] === false) { - flag = 0; - score = -1; +function calculating(timeline, badTime) { + for (let i = 0; i < badTime.length; i++) { + let newTimeline = []; + for (let j = 0; j < timeline.length; j++) { + newTimeline = newTimeline.concat(changeTimeline(timeline[j], badTime[i])); } - } - if (score !== 0) { - return false; + // timeline = newTimeline.filter(function (obj) { + // return (Object.keys(obj).length !== 0); + // }); + timeline = newTimeline.filter((obj) => Object.keys(obj) !== 0); + } - return (1440 - duration); + return timeline.sort(function (a, b) { + return (a.from - b.from); + }); } function findTime(timeline, duration) { - let result; - for (var i = 0; i < 3; i++) { - result = findTimeInDay(timeline[i], duration); - if (result !== false) { + for (var i = 0; i < timeline.length; i++) { + if ((timeline[i].to - timeline[i].from) >= duration) { + let day = Math.ceil(timeline[i].from / 1440) - 1; + let minute = timeline[i].from - 1440 * day; - return [i, result]; + return [day, minute]; } } @@ -198,8 +191,16 @@ function createString(str, day, hour, minute) { } function laterTimeline(timeline, time) { - for (var i = 0; i < 30 && (time[1] + i) < 1440; i++) { - timeline[time[0]][time[1] + i] = false; + let from = time[0] * 1440 + time[1]; + for (let i = 0; i < timeline.length; i++) { + if (timeline[i].from === from) { + if ((timeline.to - timeline.from) <= 30) { + timeline.splice(i, 1); + break; + } + timeline[i].from = timeline[i].from + 30; + break; + } } return timeline; @@ -224,6 +225,38 @@ function createMoment(timeline, duration, timeOld) { return moment; } +function filterSchedule(arrayBadTime) { + let result = arrayBadTime; + result.slice(1); + + for (let i = 0; i < arrayBadTime.length; i++) { + result = concatSchedule(arrayBadTime[i], result); + } + + return filterDublication(result); +} + +function concatSchedule(time, badTime) { + let result = []; + for (var i = 0; i < badTime.length; i++) { + if ((time.from <= badTime[i].from) && (time.to >= badTime[i].to)) { + result.push(time); + continue; + } else if ((badTime[i].to < time.from) || (time.to < badTime[i].from)) { + result.push(badTime[i]); + continue; + } else { + result.push({ + from: Math.min(time.from, badTime[i].from), + to: Math.max(time.to, badTime[i].to) + }); + continue; + } + } + + return result; +} + exports.isStar = true; /** @@ -237,19 +270,18 @@ exports.isStar = true; exports.getAppropriateMoment = function (schedule, duration, workingHours) { console.info(schedule, duration, workingHours); let gmt = Number(workingHours.from.split('+')[1]); + let badTime = parsString(schedule.Danny, gmt); - let rustyBadTime = parsString(schedule.Rusty, gmt); - badTime.to = badTime.to.concat(rustyBadTime.to); - badTime.from = badTime.from.concat(rustyBadTime.from); - let linusBadTime = parsString(schedule.Linus, gmt); - badTime.from = badTime.from.concat(linusBadTime.from); - badTime.to = badTime.to.concat(linusBadTime.to); + badTime = badTime.concat(parsString(schedule.Rusty, gmt)); + badTime = badTime.concat(parsString(schedule.Linus, gmt)); let timeline = timelineBank(workingHours); + badTime = filterSchedule(badTime); timeline = calculating(timeline, badTime); let moment = { time: [] }; moment = createMoment(timeline, duration, moment.time); + console.info(moment.time); return { @@ -296,7 +328,6 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { } minute = String(date[1] % 60); str = createString(str, day, hour, minute); - console.info(str); return str; }, @@ -309,7 +340,6 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { tryLater: function () { moment.timeline = laterTimeline(moment.timeline, moment.time); moment = createMoment(moment.timeline, duration, moment.time); - console.info(moment.existsMoment); return moment.existsMoment; } From dfea7605b4f79885926ddfce299778322d0c4260 Mon Sep 17 00:00:00 2001 From: valerin5 Date: Thu, 26 Oct 2017 00:04:07 +0500 Subject: [PATCH 5/5] Update robbery.js --- robbery.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/robbery.js b/robbery.js index 9f9e2c5..ecc5eed 100644 --- a/robbery.js +++ b/robbery.js @@ -136,7 +136,12 @@ function calculating(timeline, badTime) { function findTime(timeline, duration) { for (var i = 0; i < timeline.length; i++) { if ((timeline[i].to - timeline[i].from) >= duration) { - let day = Math.ceil(timeline[i].from / 1440) - 1; + let day; + if (timeline[i].from % 1440 > 0) { + day = Math.ceil(timeline[i].from / 1440) - 1; + } else { + day = Math.ceil(timeline[i].from / 1400); + } let minute = timeline[i].from - 1440 * day; return [day, minute]; @@ -281,7 +286,6 @@ exports.getAppropriateMoment = function (schedule, duration, workingHours) { timeline = calculating(timeline, badTime); let moment = { time: [] }; moment = createMoment(timeline, duration, moment.time); - console.info(moment.time); return {