diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2021-10-21 19:22:53 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2021-10-21 19:22:53 +0100 |
| commit | 303917a3bf66e0a0f0725dd7cc3d7a1900272689 (patch) | |
| tree | 80907aa53637e5bdb7261192e065238590dd35a0 /challenge-135 | |
| parent | 237f80d911601e3bea242fdbe23cb7b042e292bd (diff) | |
| download | perlweeklychallenge-club-303917a3bf66e0a0f0725dd7cc3d7a1900272689.tar.gz perlweeklychallenge-club-303917a3bf66e0a0f0725dd7cc3d7a1900272689.tar.bz2 perlweeklychallenge-club-303917a3bf66e0a0f0725dd7cc3d7a1900272689.zip | |
- Added solutions by Laurent Rosenfeld.
Diffstat (limited to 'challenge-135')
| -rw-r--r-- | challenge-135/laurent-rosenfeld/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-135/laurent-rosenfeld/perl/ch-1.pl | 15 | ||||
| -rw-r--r-- | challenge-135/laurent-rosenfeld/perl/ch-2.pl | 27 | ||||
| -rw-r--r-- | challenge-135/laurent-rosenfeld/raku/ch-1.raku | 11 | ||||
| -rw-r--r-- | challenge-135/laurent-rosenfeld/raku/ch-2.raku | 18 |
5 files changed, 72 insertions, 0 deletions
diff --git a/challenge-135/laurent-rosenfeld/blog.txt b/challenge-135/laurent-rosenfeld/blog.txt new file mode 100644 index 0000000000..a4bd75d8c8 --- /dev/null +++ b/challenge-135/laurent-rosenfeld/blog.txt @@ -0,0 +1 @@ +http://blogs.perl.org/users/laurent_r/2021/10/perl-weekly-challenge-135-middle-3-digits-and-validate-sedol.html diff --git a/challenge-135/laurent-rosenfeld/perl/ch-1.pl b/challenge-135/laurent-rosenfeld/perl/ch-1.pl new file mode 100644 index 0000000000..ac084cdce9 --- /dev/null +++ b/challenge-135/laurent-rosenfeld/perl/ch-1.pl @@ -0,0 +1,15 @@ +use strict; +use warnings; +use feature "say"; + +sub mid_three { + my $in = abs $_[0]; + my $length = length $in; + return "Even number of digits" unless $length % 2; + return "Too short" if $length < 3; + my $mid_point = ($length - 1) /2; + return substr($in, $mid_point - 1, 3); +} +for my $n (qw<1234567 -123 1 10 -54321>) { + say "$n -> ", mid_three $n; +} diff --git a/challenge-135/laurent-rosenfeld/perl/ch-2.pl b/challenge-135/laurent-rosenfeld/perl/ch-2.pl new file mode 100644 index 0000000000..e08884aa3e --- /dev/null +++ b/challenge-135/laurent-rosenfeld/perl/ch-2.pl @@ -0,0 +1,27 @@ +use strict; +use warnings; +use feature "say"; + +sub sedol { + my $in = shift; + return 0 if $in =~ /[AEIOU]/i; # Vowels not allowed + return 0 unless $in =~ /^[A-Z0-9]{6}[0-9]$/; # 6 alphanumericals + 1 digit + my ($sedol, $check) = (substr($in, 0, 6), substr($in, 6, 1)); + my %values; + my $count = 0; + for my $val ( 0..9, 'A'..'Z') { + $values{$val} = $count++; + } + my @weights = (1, 3, 1, 7, 3, 9); + my $sum = 0; + my @chars = split //, $sedol; + for my $i (0..5) { + $sum += $values{$chars[$i]} * $weights[$i]; + } + my $check_digit = (10 - $sum % 10) % 10; + return 1 if $check_digit == $check; + 0 +} +for my $s (qw<456765 65AR345 2936921 1234567 B0YBKL9>) { + say "$s: ", sedol($s); +} diff --git a/challenge-135/laurent-rosenfeld/raku/ch-1.raku b/challenge-135/laurent-rosenfeld/raku/ch-1.raku new file mode 100644 index 0000000000..6963068795 --- /dev/null +++ b/challenge-135/laurent-rosenfeld/raku/ch-1.raku @@ -0,0 +1,11 @@ +sub mid-three (Int $in is copy) { + $in = abs($in); + my $length = $in.chars; + return "Even number of digits" if $length %% 2; + return "Too short" if $length < 3; + my $mid-point = ($length - 1) /2; + return substr($in, $mid-point - 1, 3); +} +for <1234567 -123 1 10 -54321> -> $n { + say "$n -> ", mid-three $n; +} diff --git a/challenge-135/laurent-rosenfeld/raku/ch-2.raku b/challenge-135/laurent-rosenfeld/raku/ch-2.raku new file mode 100644 index 0000000000..43a1a7e73b --- /dev/null +++ b/challenge-135/laurent-rosenfeld/raku/ch-2.raku @@ -0,0 +1,18 @@ +sub sedol( Str $in ) { + return 0 if $in ~~ /<[AEIOU]>/; # Vowels not allowed + return 0 unless $in ~~ /^ <[0..9B..Z]>**6 <[0..9]> $/; # 6 alphanumericals + 1 digit + my ($sedol, $check) = substr($in, 0, 6), substr($in, 6, 1); + my %values; + my $count = 0; + for ( 0..9, 'A'..'Z').flat -> $val { + %values{$val} = $count++; + } + my @weights = 1, 3, 1, 7, 3, 9; + my $sum = [+] @weights Z* map {%values{$_}}, $sedol.comb; + my $check_digit = (10 - $sum % 10) % 10; + return 1 if $check_digit == $check; + 0 +} +for <456765 65AR345 2936921 1234567 B0YBKL9> -> $s { + say "$s: ", sedol($s); +} |
