diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-05-16 09:36:07 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-05-16 09:36:07 +0100 |
| commit | 4d663b4365797ec97c0ebdbf3a5e6db171b149c5 (patch) | |
| tree | c82782b361f588962fe90dcbf05e6a4f5c991a1e | |
| parent | 638009f508538683415f4fc1dc7f02246fc008bb (diff) | |
| download | perlweeklychallenge-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.pl | 62 | ||||
| -rw-r--r-- | challenge-060/mohammad-anwar/perl/ch-1a.pl | 53 |
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; } |
