4.0 KiB
4.0 KiB
title | id | challengeType |
---|---|---|
Convert seconds to compound duration | 596fd036dc1ab896c5db98b1 | 5 |
Description
Implement a function which:
takes a positive integer representing a duration in seconds as input (e.g.,100
), and
returns a string which shows the same duration decomposed into weeks, days, hours, minutes, and seconds as detailed below (e.g., "1 min, 40 sec
").
Demonstrate that it passes the following three test-cases:
Test Cases
input number | output number |
---|---|
7259 | 2 hr, 59 sec |
86400 | 1 d |
6000000 | 9 wk, 6 d, 10 hr, 40 min |
Details
The following five units should be used:unit | suffix used in output | conversion |
---|---|---|
week | wk |
1 week = 7 days |
day | d |
1 day = 24 hours |
hour | hr |
1 hour = 60 minutes |
minute | min |
1 minute = 60 seconds |
second | sec |
1 d
" and not "0 wk, 1 d, 0 hr, 0 min, 0 sec
").Give larger units precedence over smaller ones as much as possible (e.g., return 2 min, 10 sec
and not 1 min, 70 sec
or 130 sec
)Mimic the formatting shown in the test-cases (quantities sorted from largest unit to smallest and separated by comma+space; value and unit of each quantity separated by space).
Instructions
Tests
tests:
- text: <code>convertSeconds</code> is a function.
testString: assert(typeof convertSeconds === 'function', '<code>convertSeconds</code> is a function.');
- text: <code>convertSeconds(7259)</code> should return <code>2 hr, 59 sec</code>.
testString: assert.equal(convertSeconds(testCases[0]), results[0], '<code>convertSeconds(7259)</code> should return <code>2 hr, 59 sec</code>.');
- text: <code>convertSeconds(86400)</code> should return <code>1 d</code>.
testString: assert.equal(convertSeconds(testCases[1]), results[1], '<code>convertSeconds(86400)</code> should return <code>1 d</code>.');
- text: <code>convertSeconds(6000000)</code> should return <code>9 wk, 6 d, 10 hr, 40 min</code>.
testString: assert.equal(convertSeconds(testCases[2]), results[2], '<code>convertSeconds(6000000)</code> should return <code>9 wk, 6 d, 10 hr, 40 min</code>.');
Challenge Seed
function convertSeconds (sec) {
// Good luck!
return true;
}
After Test
const testCases = [7259, 86400, 6000000];
const results = ['2 hr, 59 sec', '1 d', '9 wk, 6 d, 10 hr, 40 min'];
Solution
function convertSeconds (sec) {
const localNames = ['wk', 'd', 'hr', 'min', 'sec'];
// compoundDuration :: [String] -> Int -> String
const compoundDuration = (labels, intSeconds) =>
weekParts(intSeconds)
.map((v, i) => [v, labels[i]])
.reduce((a, x) =>
a.concat(x[0] ? [`${x[0]} ${x[1] || '?'}`] : []), []
)
.join(', ');
// weekParts :: Int -> [Int]
const weekParts = intSeconds => [0, 7, 24, 60, 60]
.reduceRight((a, x) => {
const r = a.rem;
const mod = x !== 0 ? r % x : r;
return {
rem: (r - mod) / (x || 1),
parts: [mod].concat(a.parts)
};
}, {
rem: intSeconds,
parts: []
})
.parts;
return compoundDuration(localNames, sec);
}