From 3ef49dcc8373126736917ce4e94b47f832c47dff Mon Sep 17 00:00:00 2001 From: Andinus Date: Wed, 8 Sep 2021 09:43:05 +0530 Subject: Raku: Luhn: Improve solution - Use regex parameter in `.comb' and skip `.grep'. - Use a sub subtract-if-greater to reduce noise in ternary operation. - Remove trailing `;' if implicitly returning a value. --- raku/luhn/Luhn.rakumod | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'raku') 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 } -- cgit 1.4.1-2-gfad0