Convert seconds to compound duration: Difference between revisions
Content deleted Content added
add Perl and Perl 6 solutions |
m →{{header|Perl 6}}: make output handling slightly more idiomatic |
||
Line 83: | Line 83: | ||
Demonstration: |
Demonstration: |
||
<lang perl>for (7259, 86400, 6000000) { |
<lang perl>for (7259, 86400, 6000000) { |
||
print sprintf "% |
print sprintf "%7d s = %s\n", $_, compound_duration($_) |
||
}</lang> |
}</lang> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
7259 s = 2 hr, 59 sec |
|||
86400 s = 1 d |
|||
6000000 s = 9 wk, 6 d, 10 hr, 40 min |
|||
</pre> |
</pre> |
||
Line 104: | Line 104: | ||
Demonstration: |
Demonstration: |
||
<lang perl6>for 7259, 86400, 6000000 { |
<lang perl6>for 7259, 86400, 6000000 { |
||
say |
say "{.fmt: '%7d'} s = {compound-duration $_}"; |
||
}</lang> |
}</lang> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
7259 s = 2 hr, 59 sec |
|||
86400 s = 1 d |
|||
6000000 s = 9 wk, 6 d, 10 hr, 40 min |
|||
</pre> |
</pre> |
Revision as of 21:39, 6 June 2015
Convert seconds to compound duration is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Write a function or program which
- takes an integer value 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 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 represented:
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 minutes = 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 not1 min, 70 sec
or130 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).
Perl
<lang perl>sub compound_duration {
my $sec = shift; no warnings 'numeric'; return join ', ', grep { $_ > 0 } int($sec/60/60/24/7) . " wk", int($sec/60/60/24) % 7 . " d", int($sec/60/60) % 24 . " hr", int($sec/60) % 60 . " min", int($sec) % 60 . " sec";
}</lang>
Demonstration: <lang perl>for (7259, 86400, 6000000) {
print sprintf "%7d s = %s\n", $_, compound_duration($_)
}</lang>
- Output:
7259 s = 2 hr, 59 sec 86400 s = 1 d 6000000 s = 9 wk, 6 d, 10 hr, 40 min
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:
<lang perl6>sub compound-duration ($seconds) {
($seconds.polymod(60, 60, 24, 7) Z <sec min hr d wk>)\ .grep(*[0]).reverse.join(", ")
}</lang>
Demonstration: <lang perl6>for 7259, 86400, 6000000 {
say "{.fmt: '%7d'} s = {compound-duration $_}";
}</lang>
- Output:
7259 s = 2 hr, 59 sec 86400 s = 1 d 6000000 s = 9 wk, 6 d, 10 hr, 40 min