aboutsummaryrefslogtreecommitdiff
path: root/challenge-135
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2021-10-21 19:22:53 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2021-10-21 19:22:53 +0100
commit303917a3bf66e0a0f0725dd7cc3d7a1900272689 (patch)
tree80907aa53637e5bdb7261192e065238590dd35a0 /challenge-135
parent237f80d911601e3bea242fdbe23cb7b042e292bd (diff)
downloadperlweeklychallenge-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.txt1
-rw-r--r--challenge-135/laurent-rosenfeld/perl/ch-1.pl15
-rw-r--r--challenge-135/laurent-rosenfeld/perl/ch-2.pl27
-rw-r--r--challenge-135/laurent-rosenfeld/raku/ch-1.raku11
-rw-r--r--challenge-135/laurent-rosenfeld/raku/ch-2.raku18
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);
+}