diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2021-04-12 07:01:16 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2021-04-12 07:01:16 +0100 |
| commit | f3bf9e7ddbab83a6725915f676f9bf9de35bc01f (patch) | |
| tree | 7021fac31e722cf4e4ebd15e9b63ba38849276fc /challenge-108/andinus | |
| parent | 988654be0ef0922e9ff106f14697837cd95a46ca (diff) | |
| download | perlweeklychallenge-club-f3bf9e7ddbab83a6725915f676f9bf9de35bc01f.tar.gz perlweeklychallenge-club-f3bf9e7ddbab83a6725915f676f9bf9de35bc01f.tar.bz2 perlweeklychallenge-club-f3bf9e7ddbab83a6725915f676f9bf9de35bc01f.zip | |
- Added template for week 108.
Diffstat (limited to 'challenge-108/andinus')
| -rw-r--r-- | challenge-108/andinus/README | 122 | ||||
| -rw-r--r-- | challenge-108/andinus/README.org | 102 |
2 files changed, 224 insertions, 0 deletions
diff --git a/challenge-108/andinus/README b/challenge-108/andinus/README new file mode 100644 index 0000000000..3113a6fd55 --- /dev/null +++ b/challenge-108/andinus/README @@ -0,0 +1,122 @@ + ━━━━━━━━━━━━━━━ + CHALLENGE 100 + + Andinus + ━━━━━━━━━━━━━━━ + + + 2021-02-20 + + +Table of Contents +───────────────── + +Task 1 - Fun Time +.. Raku + + + + + +Task 1 - Fun Time +═════════════════ + + You are given a time (12 hour / 24 hour). + + Write a script to convert the given time from 12 hour format to 24 + hour format and vice versa. + + Ideally we expect a one-liner. + + +Raku +──── + + • Program: <file:raku/ch-1.raku> + + One should use `DateTime' module to solve this but that is not fun so + we solve it the wrong way! + + The program will accept any string as `$time'. We do the format check + later. + + ┌──── + │ #| convert 12-hour formatted time to 24-hour format and vice-versa + │ unit sub MAIN ( + │ Str $time, #= time (format: 05:15pm or "05:15 pm" or 17:00) + │ ); + └──── + + The grammar `Time' will parse `$time' to give us meaningful + information required to do the task. + + ⁃ `hour' & `minute' match any digit ranging from 00 to 99 + ⁃ `meridiem' matches either /am/ or /pm/ + + ⁃ Note: This grammar will consider "99:99" as a valid timestamp. + + ┌──── + │ grammar Time { + │ token TOP { <hour> ':' <minute> ' '? <meridiem>? } + │ token hour { \d ** 1..2 } + │ token minute { \d ** 1..2 } + │ token meridiem { ['am'|'pm'] } + │ } + └──── + + We parse `$time' with `Time' grammar. If `meridiem' is set then it + must be 12-hour format time, otherwise it'll be 24-hour format time. + + ┌──── + │ # Match for time format. + │ if Time.parse($time) -> $m { + │ given $m<meridiem> { + │ ... + │ } + │ } else { + │ note "Wrong format!"; + │ exit 1; + │ } + └──── + + For "am" we just check if the hour is 12, if so then we print it as + "00" otherwise just print the hour. + + ┌──── + │ when 'am' { + │ printf "%02d:%02d\n", + │ $m<hour> == 12 ?? "00" !! $m<hour>, + │ $m<minute>; + │ } + └──── + + If the hour is < 12 then we print `hour + 12' otherwise just print the + hour. + + ┌──── + │ when 'pm' { + │ printf "%02d:%02d\n", + │ $m<hour> < 12 ?? $m<hour> + 12 !! $m<hour>, + │ $m<minute>; + │ } + └──── + + If the hour is 0 then print 12 otherwise check if it's > 12, if so + then print `hour - 12' otherwise just print the hour. + + 23 -> 11 + greater than 12 + 00 -> 12 + equal to 0 + 12 -> 12 + neither equal to 0, nor greater than 12 + + If the hour is < 12 then print "am" otherwise print "pm". + + ┌──── + │ default { + │ printf "%02d:%02d%s\n", + │ $m<hour> == 0 ?? "12" !! $m<hour> > 12 ?? $m<hour> - 12 !! $m<hour>, + │ $m<minute>, $m<hour> < 12 ?? "am" !! "pm"; + │ } + └──── diff --git a/challenge-108/andinus/README.org b/challenge-108/andinus/README.org new file mode 100644 index 0000000000..9fe366c58c --- /dev/null +++ b/challenge-108/andinus/README.org @@ -0,0 +1,102 @@ +#+title: Challenge 100 +#+date: 2021-02-20 +#+options: toc:2 +#+html_link_up: ../index.html +#+export_file_name: index +#+setupfile: ~/.emacs.d/org-templates/level-2.org + +* Task 1 - Fun Time + +You are given a time (12 hour / 24 hour). + +Write a script to convert the given time from 12 hour format to 24 hour +format and vice versa. + +Ideally we expect a one-liner. + +** Raku + +- Program: [[file:raku/ch-1.raku]] + +One should use ~DateTime~ module to solve this but that is not fun so we +solve it the wrong way! + +The program will accept any string as ~$time~. We do the format check later. + +#+begin_src raku +#| convert 12-hour formatted time to 24-hour format and vice-versa +unit sub MAIN ( + Str $time, #= time (format: 05:15pm or "05:15 pm" or 17:00) +); +#+end_src + +The grammar ~Time~ will parse ~$time~ to give us meaningful information +required to do the task. + ++ ~hour~ & ~minute~ match any digit ranging from 00 to 99 ++ ~meridiem~ matches either /am/ or /pm/ + ++ *Note*: This grammar will consider "99:99" as a valid timestamp. + +#+begin_src raku +grammar Time { + token TOP { <hour> ':' <minute> ' '? <meridiem>? } + token hour { \d ** 1..2 } + token minute { \d ** 1..2 } + token meridiem { ['am'|'pm'] } +} +#+end_src + +We parse ~$time~ with ~Time~ grammar. If ~meridiem~ is set then it must be +12-hour format time, otherwise it'll be 24-hour format time. + +#+begin_src raku +# Match for time format. +if Time.parse($time) -> $m { + given $m<meridiem> { + ... + } +} else { + note "Wrong format!"; + exit 1; +} +#+end_src + +For "am" we just check if the hour is 12, if so then we print it as "00" +otherwise just print the hour. + +#+begin_src raku +when 'am' { + printf "%02d:%02d\n", + $m<hour> == 12 ?? "00" !! $m<hour>, + $m<minute>; +} +#+end_src + +If the hour is < 12 then we print =hour + 12= otherwise just print the +hour. + +#+begin_src raku +when 'pm' { + printf "%02d:%02d\n", + $m<hour> < 12 ?? $m<hour> + 12 !! $m<hour>, + $m<minute>; +} +#+end_src + +If the hour is 0 then print 12 otherwise check if it's > 12, if so then +print =hour - 12= otherwise just print the hour. + ++ 23 -> 11 :: greater than 12 ++ 00 -> 12 :: equal to 0 ++ 12 -> 12 :: neither equal to 0, nor greater than 12 + +If the hour is < 12 then print "am" otherwise print "pm". + +#+begin_src raku +default { + printf "%02d:%02d%s\n", + $m<hour> == 0 ?? "12" !! $m<hour> > 12 ?? $m<hour> - 12 !! $m<hour>, + $m<minute>, $m<hour> < 12 ?? "am" !! "pm"; +} +#+end_src |
