diff options
Diffstat (limited to 'raku/luhn/Luhn.rakumod')
-rw-r--r-- | raku/luhn/Luhn.rakumod | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/raku/luhn/Luhn.rakumod b/raku/luhn/Luhn.rakumod index 8efafc0..2bdaf16 100644 --- a/raku/luhn/Luhn.rakumod +++ b/raku/luhn/Luhn.rakumod @@ -1,11 +1,20 @@ unit module Luhn; -sub is-luhn-valid($input is copy --> Bool) is export { - return False if $input.comb.grep(/\d|\s/).join ne $input; - $input = $input.comb.grep(/\d/)>>.Int; - return False if $input.elems < 2; - - ([+] gather for $input.reverse.kv -> $k, $v { - take $k !%% 2 ?? ($_ > 9 ?? $_ - 9 !! $_) !! $v with $v * 2; - }) %% 10; +sub is-luhn-valid(Str $input --> Bool) is export { + with $input.comb(/\d|\s/) -> @num-spc { + return False if @num-spc.elems !== $input.chars; + + my Int @numbers = @num-spc.comb(/\d/)>>.Int; + return False if @numbers.elems < 2; + + ([+] gather for @numbers.reverse.kv -> $k, $v { + take $k !%% 2 ?? subtract-if-greater($v * 2, 9) !! $v; + }) %% 10 + } +} + +#| subtract-if-greater will subtract $to-sub from $num if $num is +#| greater than $to-sub. +sub subtract-if-greater(Int $num, Int $to-sub --> Int) { + $num > $to-sub ?? $num - $to-sub !! $num } |