|
'use strict' |
|
|
|
const circleDegrees = 360 |
|
const minutesInHour = 60 |
|
const hoursInCircle = 12 |
|
const ticksInHour = minutesInHour / hoursInCircle |
|
const oneMinuteAngle = circleDegrees / minutesInHour |
|
const oneHourAngle = circleDegrees / hoursInCircle |
|
|
|
/** |
|
* Gets angle based on the passed time |
|
* |
|
* @param {number} time - number between 0 - 60 |
|
* @return {number} - angle based on the time |
|
*/ |
|
function getAngle(time) { |
|
return time * oneMinuteAngle |
|
} |
|
|
|
/** |
|
* Finds offset for hours based on minutes. For instance for 30 minutes there will be 15 degrees offset |
|
* |
|
* @param {number} - minutes for which offset has to be found |
|
* @return {number} - angle offset for number of minutes |
|
*/ |
|
function hoursOffsetAngle(minutes) { |
|
return getAngle(minutes) / circleDegrees * oneHourAngle |
|
} |
|
|
|
/** |
|
* Parses string and gets hours and minutes |
|
* |
|
* @param {string} - time in 'MM:HH' format |
|
* @return {object} - object that contains time information |
|
*/ |
|
function parseTime(time) { |
|
const [hours, minutes] = time.split(':') |
|
return { |
|
hours: parseInt(hours) % hoursInCircle, |
|
minutes: parseInt(minutes) |
|
} |
|
} |
|
|
|
/** |
|
* There are two angles between hours and minutes hands. |
|
* This function finds lesser angle between them |
|
* |
|
* @param {number} hoursAngle - hourse angle |
|
* @param {number} minutesAngle - minutes angle |
|
* @return {number} - lesser angle between minutes and house hands |
|
*/ |
|
function lesserAngle(hoursAngle, minutesAngle) { |
|
const angle = Math.abs(minutesAngle - hoursAngle) |
|
return Math.min(angle, circleDegrees - angle) |
|
} |
|
|
|
/** |
|
* Main driver of the program. |
|
* |
|
* @param {string} time - time in 'HH:MM' format |
|
* @return {number} - lesser angle between minutes and hours hand |
|
*/ |
|
function clockAngle(time) { |
|
const parsedTime = parseTime(time) |
|
|
|
const minutesAngle = getAngle(parsedTime.minutes) |
|
const hoursAngle = getAngle(parsedTime.hours * ticksInHour) + hoursOffsetAngle(parsedTime.minutes) |
|
|
|
return lesserAngle(hoursAngle, minutesAngle) |
|
} |
|
|
|
mocha.setup('bdd') |
|
const assert = chai.assert |
|
|
|
describe('Assertions', () => { |
|
it('02:30', () => assert.equal(clockAngle('02:30'), 105)) |
|
it('13:42', () => assert.equal(clockAngle("13:42"), 159)) |
|
it('01:42', () => assert.equal(clockAngle('01:42'), 159)) |
|
it('01:43', () => assert.equal(clockAngle('01:43'), 153.5)) |
|
it('Zero', () => assert.equal(clockAngle('00:00'), 0)) |
|
it('Little later', () => assert.equal(clockAngle('12:01'), 5.5)) |
|
it('Opposite', () => assert.equal(clockAngle('18:00'), 180)) |
|
console.log("Coding complete? Click 'Check' to review your tests and earn cool rewards!") |
|
}) |
|
|
|
mocha.run() |