aboutsummaryrefslogtreecommitdiff
path: root/challenge-060
diff options
context:
space:
mode:
authoraliciabielsa <aliciabielsa@gmail.com>2020-05-17 11:20:21 +0200
committeraliciabielsa <aliciabielsa@gmail.com>2020-05-17 11:20:21 +0200
commitf0da151f88a34a0ee89105b840261e4eeb446b2e (patch)
treeee6a776f6c05da3cd0652cf489a3a662709dfb40 /challenge-060
parent3b1637b89c780872d30b38aa03ab6984bf5d1bed (diff)
downloadperlweeklychallenge-club-f0da151f88a34a0ee89105b840261e4eeb446b2e.tar.gz
perlweeklychallenge-club-f0da151f88a34a0ee89105b840261e4eeb446b2e.tar.bz2
perlweeklychallenge-club-f0da151f88a34a0ee89105b840261e4eeb446b2e.zip
challenge 060 perl
Diffstat (limited to 'challenge-060')
-rw-r--r--challenge-060/alicia-bielsa/perl/ch-1.pl76
1 files changed, 76 insertions, 0 deletions
diff --git a/challenge-060/alicia-bielsa/perl/ch-1.pl b/challenge-060/alicia-bielsa/perl/ch-1.pl
new file mode 100644
index 0000000000..f455bc2134
--- /dev/null
+++ b/challenge-060/alicia-bielsa/perl/ch-1.pl
@@ -0,0 +1,76 @@
+use strict;
+use warnings;
+
+#TASK #1 › Excel Column
+#Reviewed by: Ryan Thompson
+
+#Write a script that accepts a number and returns the Excel Column Name it represents and vice-versa.
+
+#Excel columns start at A and increase lexicographically using the 26 letters of the English alphabet, A..Z.
+#After Z, the columns pick up an extra “digit”, going from AA, AB, etc.,
+#which could (in theory) continue to an arbitrary number of digits. In practice, Excel sheets are limited to 16,384 columns.
+#Example
+
+#Input Number: 28
+#Output: AB
+
+#Input Column Name: AD
+#Output: 30
+
+my %hIndexLetters = ( 1=> 'A', 2=> 'B', 3=> 'C', 4 => 'D', 5 => 'E', 6=> 'F', 7=> 'G', 8 => 'H',
+ 9 => 'I', 10=> 'J', 11=> 'K', 12 => 'L', 13 => 'M', 14 => 'N', 15 => 'O', 16 => 'P',
+ 17 => 'Q', 18=> 'R', 19=> 'S', 20 => 'T',21 => 'U', 22=> 'V', 23=> 'W', 24 => 'X',
+ 25 => 'Y', 26=> 'Z');
+my %hLetterIndex = reverse(%hIndexLetters );
+my $totalLetters = scalar keys %hIndexLetters ;
+
+my $input = $ARGV[0];
+if (!defined($input) ){
+ die "Error: This script accepts a positive number or letters only\n";
+}
+
+my $output ='';
+if ($input =~ /^\d+$/ && $input > 0){
+ $output = numberToLetters($input);
+} elsif ($input =~ /^[A-Z]+$/){
+ $output = lettersToNumber($input);
+} else {
+ die "Error: Input $input Incorrect This script accepts a positive number or letters only\n";
+}
+
+print "$input = $output\n";
+
+
+
+sub lettersToNumber {
+ my $letters = shift;
+ my @aLettersInput = split('',$letters);
+ my $number= 0;
+ my $base = 0;
+ foreach my $letter (reverse(@aLettersInput)){
+ $number += $hLetterIndex{$letter} * $totalLetters ** $base ;
+ $base ++;
+ }
+ return $number;
+}
+
+sub numberToLetters {
+ my $number = shift;
+
+ my $letters;
+ while ($number > 0 ) {
+ my $remainder = $number % $totalLetters ;
+ my $divResult = int($number / $totalLetters) ;
+ $letters .= $hIndexLetters{$remainder};
+ if ($divResult == 0){
+ $number = 0;
+ } else {
+ $number = $divResult ;
+ }
+ }
+ return reverse($letters);
+}
+
+
+
+