aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Krňávek <Jan.Krnavek@gmail.com>2021-10-23 12:36:06 +0200
committerJan Krňávek <Jan.Krnavek@gmail.com>2021-10-23 12:36:06 +0200
commite4a8b633ba8bf75a76b113b037a003c15c1e1593 (patch)
tree4e3c6b387b25b4807e46baaa4fefb15663e7e59c
parent2a950d0800474d0745b527227ccbc9a33b0840a1 (diff)
downloadperlweeklychallenge-club-e4a8b633ba8bf75a76b113b037a003c15c1e1593.tar.gz
perlweeklychallenge-club-e4a8b633ba8bf75a76b113b037a003c15c1e1593.tar.bz2
perlweeklychallenge-club-e4a8b633ba8bf75a76b113b037a003c15c1e1593.zip
solutions week 135
-rw-r--r--challenge-135/wambash/raku/ch-1.raku28
-rw-r--r--challenge-135/wambash/raku/ch-2.raku42
2 files changed, 70 insertions, 0 deletions
diff --git a/challenge-135/wambash/raku/ch-1.raku b/challenge-135/wambash/raku/ch-1.raku
new file mode 100644
index 0000000000..a0a02eeb9e
--- /dev/null
+++ b/challenge-135/wambash/raku/ch-1.raku
@@ -0,0 +1,28 @@
+#!/usr/bin/env raku
+
+multi middle-three-digits ($n where .abs.chars < 2) {
+ fail 'too short'
+}
+
+multi middle-three-digits ($n where .abs.chars %% 2) {
+ fail 'even number of digits'
+}
+
+multi middle-three-digits ($n) {
+ $n.abs
+ andthen .substr: .chars div 2 - 1, 3
+}
+
+multi MAIN (Int $n) {
+ say middle-three-digits $n
+}
+
+multi MAIN (Bool :test($)!) {
+ use Test;
+ is middle-three-digits("-123"), 123;
+ is middle-three-digits('1234567'), 345;
+ fails-like { middle-three-digits(-1) }, 'too short', 'fail: too short';
+ fails-like { middle-three-digits(10) }, 'even number of digits','fail: even number of digits';
+ done-testing;
+}
+
diff --git a/challenge-135/wambash/raku/ch-2.raku b/challenge-135/wambash/raku/ch-2.raku
new file mode 100644
index 0000000000..d8fe6da3c8
--- /dev/null
+++ b/challenge-135/wambash/raku/ch-2.raku
@@ -0,0 +1,42 @@
+#!/usr/bin/env raku
+
+grammar SEDOL {
+ token TOP {
+ <char> ** 6 <check-digit>
+ }
+
+ token char {
+ <+[0..9]+[A..Z]-[AEIOU]>
+ }
+
+ token check-digit {
+ <[0..9]>
+ }
+}
+
+class Validate-SEDOL {
+ method TOP ($/) {
+ |$<char>».made, $<check-digit>
+ andthen $_ Z* 1, 3, 1, 7, 3, 9, 1
+ andthen .sum
+ andthen $_ %% 10
+ andthen make $_
+ }
+
+ method char ($/) {
+ make $/.Str.parse-base(35)
+ }
+}
+
+multi MAIN ($sedol) {
+ say +so SEDOL.parse( $sedol, :actions(Validate-SEDOL)).made ;
+}
+
+multi MAIN (Bool :test($)!){
+ use Test;
+ is SEDOL.parse('2936921').<check-digit>, '1';
+ is SEDOL.parse('2936921', :actions(Validate-SEDOL)).made, True;
+ is SEDOL.parse('1234567', :actions(Validate-SEDOL)).made, False;
+ is SEDOL.parse('B0YBKL9', :actions(Validate-SEDOL)).made, True;
+ done-testing;
+}