---
title: Convert seconds to compound duration
id: 596fd036dc1ab896c5db98b1
challengeType: 5
---
## Description
Task:
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 |
|
However, only include quantities with non-zero values in the output (e.g., return "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
```yml
tests:
- text: convertSeconds
is a function.
testString: 'assert(typeof convertSeconds === "function", "convertSeconds
is a function.");'
- text: 'convertSeconds(7259)
should return 2 hr, 59 sec
.'
testString: 'assert.equal(convertSeconds(testCases[0]), results[0], "convertSeconds(7259)
should return 2 hr, 59 sec
.");'
- text: convertSeconds(86400)
should return 1 d
.
testString: 'assert.equal(convertSeconds(testCases[1]), results[1], "convertSeconds(86400)
should return 1 d
.");'
- text: 'convertSeconds(6000000)
should return 9 wk, 6 d, 10 hr, 40 min
.'
testString: 'assert.equal(convertSeconds(testCases[2]), results[2], "convertSeconds(6000000)
should return 9 wk, 6 d, 10 hr, 40 min
.");'
```
## Challenge Seed
```js
function convertSeconds (sec) {
// Good luck!
return true;
}
```
### After Test
```js
console.info('after the test');
```
## Solution
```js
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);
}
```