aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2020-05-16 09:36:07 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2020-05-16 09:36:07 +0100
commit4d663b4365797ec97c0ebdbf3a5e6db171b149c5 (patch)
treec82782b361f588962fe90dcbf05e6a4f5c991a1e
parent638009f508538683415f4fc1dc7f02246fc008bb (diff)
downloadperlweeklychallenge-club-4d663b4365797ec97c0ebdbf3a5e6db171b149c5.tar.gz
perlweeklychallenge-club-4d663b4365797ec97c0ebdbf3a5e6db171b149c5.tar.bz2
perlweeklychallenge-club-4d663b4365797ec97c0ebdbf3a5e6db171b149c5.zip
- Simplified Perl solution to "Excel Column" task.
-rw-r--r--challenge-060/mohammad-anwar/perl/ch-1.pl62
-rw-r--r--challenge-060/mohammad-anwar/perl/ch-1a.pl53
2 files changed, 56 insertions, 59 deletions
diff --git a/challenge-060/mohammad-anwar/perl/ch-1.pl b/challenge-060/mohammad-anwar/perl/ch-1.pl
index 2e45b14af4..bf3ab35949 100644
--- a/challenge-060/mohammad-anwar/perl/ch-1.pl
+++ b/challenge-060/mohammad-anwar/perl/ch-1.pl
@@ -3,44 +3,38 @@
use strict;
use warnings;
-my $msg = "Please provide parameter e.g. -d:27 or -n:AA\n";
my $arg = $ARGV[0];
-die $msg unless defined $arg;
+die "ERROR: Please provide parameter e.g. AA or 27.\n"
+ unless defined $arg;
-if ($arg =~ /^\-d\:(.*)$/) {
- print sprintf("%s => %s\n", $1, to_excel($1));
-}
-elsif ($arg =~ m/^\-n\:(.*)$/) {
- print sprintf("%s => %s\n", $1, from_excel($1));
-}
-else {
- print $msg;
-}
-
-sub from_excel {
- my ($name) = @_;
-
- my $i = 0;
- my $b = 26;
- my $d = 0;
- foreach my $c (split //, scalar(reverse(uc $name))) {
- $d += (ord($c) - ord("A") + 1) * ($b ** $i++);
- }
+print sprintf("%s => %s\n", $arg, excel_column($arg));
- return $d;
-}
+sub excel_column {
+ my ($arg) = @_;
-sub to_excel {
- my ($number) = @_;
+ if ($arg =~ /^\d+$/) {
+ my $name = '';
+ my @name = (0, 'A' .. 'Z');
+ while ($arg > 26) {
+ my $i = int $arg / 26;
+ $name .= $name[$i];
+ $arg -= ($i * 26);
+ }
+ $name .= $name[$arg];
- my $name = '';
- my @name = (0, 'A' .. 'Z');
- while ($number > 26) {
- my $i = int $number / 26;
- $name .= $name[$i];
- $number -= ($i * 26);
+ return $name;
+ }
+ elsif ($arg =~ /^[A-Z]+$/i) {
+ my $i = 0;
+ my $b = 26;
+ my $d = 0;
+ foreach my $c (split //, scalar(reverse(uc $arg))) {
+ $d += (ord($c) - ord("A") + 1) * ($b ** $i++);
+ }
+
+ return $d;
+ }
+ else {
+ die "ERROR: Invalid column [$arg].\n";
}
- $name .= $name[$number];
-
- return $name;
}
diff --git a/challenge-060/mohammad-anwar/perl/ch-1a.pl b/challenge-060/mohammad-anwar/perl/ch-1a.pl
index d298b5f1b0..5ebc0b1ed4 100644
--- a/challenge-060/mohammad-anwar/perl/ch-1a.pl
+++ b/challenge-060/mohammad-anwar/perl/ch-1a.pl
@@ -5,35 +5,38 @@ use warnings;
use Test::More;
-is (to_excel(28), "AB", "28 => AB");
-is (from_excel("AB"), 28, "AB => 28");
+is (excel_column(26), "Z", "Z => 26");
+is (excel_column(28), "AB", "28 => AB");
+is (excel_column("AB"), 28, "AB => 28");
done_testing;
-sub from_excel {
- my ($name) = @_;
+sub excel_column {
+ my ($arg) = @_;
- my $i = 0;
- my $b = 26;
- my $d = 0;
- foreach my $c (split //, scalar(reverse(uc $name))) {
- $d += (ord($c) - ord("A") + 1) * ($b ** $i++);
- }
-
- return $d;
-}
-
-sub to_excel {
- my ($number) = @_;
+ if ($arg =~ /^\d+$/) {
+ my $name = '';
+ my @name = (0, 'A' .. 'Z');
+ while ($arg > 26) {
+ my $i = int $arg / 26;
+ $name .= $name[$i];
+ $arg -= ($i * 26);
+ }
+ $name .= $name[$arg];
- my $name = '';
- my @name = (0, 'A' .. 'Z');
- while ($number > 26) {
- my $i = int $number / 26;
- $name .= $name[$i];
- $number -= ($i * 26);
+ return $name;
+ }
+ elsif ($arg =~ /^[A-Z]+$/i) {
+ my $i = 0;
+ my $b = 26;
+ my $d = 0;
+ foreach my $c (split //, scalar(reverse(uc $arg))) {
+ $d += (ord($c) - ord("A") + 1) * ($b ** $i++);
+ }
+
+ return $d;
+ }
+ else {
+ die "ERROR: Invalid column [$arg].\n";
}
- $name .= $name[$number];
-
- return $name;
}