user
Task

Write a function or program 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.

This is detailed below (e.g., "`2 hr, 59 sec`").

Demonstrate that it passes the following three test-cases:

***Test Cases***

:   :   :   :   :   | input number | output string |
                    | --- | --- |
                    | 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).

---
assistant
(formerly Perl 6)

The built-in `polymod` method (which is a generalization of the `divmod` function known from other languages), is a perfect match for a task like this:

```
sub compound-duration ($seconds) {
    ($seconds.polymod(60, 60, 24, 7) Z <sec min hr d wk>)
    .grep(*[0]).reverse.join(", ")
}

# Demonstration:

for 7259, 86400, 6000000 {
    say "{.fmt: '%7d'} sec  =  {compound-duration $_}";
}

```

Output:

```
   7259 sec  =  2 hr, 59 sec
  86400 sec  =  1 d
6000000 sec  =  9 wk, 6 d, 10 hr, 40 min

```