diff options
| -rwxr-xr-x | challenge-135/feng-chang/raku/ch-1.raku | 15 | ||||
| -rwxr-xr-x | challenge-135/feng-chang/raku/ch-2.raku | 19 |
2 files changed, 34 insertions, 0 deletions
diff --git a/challenge-135/feng-chang/raku/ch-1.raku b/challenge-135/feng-chang/raku/ch-1.raku new file mode 100755 index 0000000000..4cc6c2919c --- /dev/null +++ b/challenge-135/feng-chang/raku/ch-1.raku @@ -0,0 +1,15 @@ +#!/bin/env raku + +=begin usage + + ./ch-1.raku -- -1234 + +=end usage + +sub MAIN(Int:D $N) { + given abs($N) { + when $_.chars %% 2 { put 'even number of digits'; exit } + when $_.chars < 3 { put 'too short'; exit } + default { put $_.substr($_.chars div 2 - 1, 3) } + } +} diff --git a/challenge-135/feng-chang/raku/ch-2.raku b/challenge-135/feng-chang/raku/ch-2.raku new file mode 100755 index 0000000000..bc0c1f3da3 --- /dev/null +++ b/challenge-135/feng-chang/raku/ch-2.raku @@ -0,0 +1,19 @@ +#!/bin/env raku + +my method digit-value(Str:D $d where *.chars == 1 :) { + return $d.Int if '0' le $d le '9'; + return $d.ord - 'A'.ord if 'A' le $d le 'Z'; + die 'wrong digit: ', $d; +} + +sub check-digit(Str:D $sedol where *.chars == 6 --> UInt:D) { + state @weights = 1, 3, 1, 7, 3, 9, 1; + my @digits = $sedol.comb; + + 10 - (^6)ยป.&{ @digits[$_].&digit-value * @weights[$_] }.sum % 10 +} + +sub MAIN(Str:D $S where *.chars == 7) { + my Str $s = uc($S); + put +so check-digit($s.substr(0, 6)) == $s.substr(6, 1).Int; +} |
