From 071e4f006bfe96928ab5896fbf27a825e8c6cf27 Mon Sep 17 00:00:00 2001 From: wanderdoc Date: Sun, 24 Oct 2021 15:53:25 +0200 Subject: Solutions to challenge-135 --- challenge-135/wanderdoc/perl/ch-1.pl | 36 +++++++++++++++++++++++ challenge-135/wanderdoc/perl/ch-2.pl | 57 ++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 challenge-135/wanderdoc/perl/ch-1.pl create mode 100644 challenge-135/wanderdoc/perl/ch-2.pl diff --git a/challenge-135/wanderdoc/perl/ch-1.pl b/challenge-135/wanderdoc/perl/ch-1.pl new file mode 100644 index 0000000000..94857c1204 --- /dev/null +++ b/challenge-135/wanderdoc/perl/ch-1.pl @@ -0,0 +1,36 @@ +#!perl +use strict; +use warnings FATAL => qw(all); + +=prompt +You are given an integer. Write a script find out the middle 3-digits of the given integer, if possible otherwise throw sensible error. +=cut + + + + + + + + + + + +sub middle_three +{ + my $num = $_[0]; + $num =~ tr/-//ds; + return "Even number of digits!" if length($num) % 2 == 0; + return "Too short!" if length($num) < 3; + return $num if length($num) == 3; + + my $middle = length($num) / 2; + return substr($num, int($middle) - 1, 3); +} + + +print middle_three(1234567), $/; +print middle_three(-123), $/; +print middle_three(1), $/; +print middle_three(10), $/; +print middle_three(1415926535897), $/; \ No newline at end of file diff --git a/challenge-135/wanderdoc/perl/ch-2.pl b/challenge-135/wanderdoc/perl/ch-2.pl new file mode 100644 index 0000000000..8831c08411 --- /dev/null +++ b/challenge-135/wanderdoc/perl/ch-2.pl @@ -0,0 +1,57 @@ +#!perl +use strict; +use warnings FATAL => qw(all); + +=prompt +You are given 7-characters alphanumeric SEDOL. Write a script to validate the given SEDOL. Print 1 if it is a valid SEDOL otherwise 0. For more information about SEDOL, please checkout the wikipedia page. https://en.wikipedia.org/wiki/SEDOL +=cut + + + + + + + + + + + +sub validate_SEDOL +{ + my $string = uc $_[0]; + return "Wrong code $string: Vowels are not allowed!$/" if $string =~ /[AEIOU]/; + my ($code, $check_digit) = unpack "A6A1", $string; + + my $calc_digit = _calculate_cd($code); + + return $calc_digit == $check_digit ? 1 : 0; +} + +sub _calculate_cd +{ + my $string = $_[0]; + my @letters = 'A' .. 'Z'; + my %values; + @values{@letters} = map $_ + 1 + 9, 0 .. $#letters; + @values{0 .. 9} = 0 .. 9; + + my @weights = (1, 3, 1, 7, 3, 9, 1); + + + my @arr = split(//, $string); + my $sum; + + + for my $i ( 0 .. $#arr ) + { + die "Wrong code!$/" if not exists $values{$arr[$i]}; + $sum += $values{$arr[$i]} * $weights[$i]; + + } + return (10 - $sum % 10) % 10; +} + + +print validate_SEDOL('2936921'), $/; # 1 +print validate_SEDOL('1234567'), $/; # 0 +print validate_SEDOL('B0YBKL9'), $/; # 1 \ No newline at end of file -- cgit