aboutsummaryrefslogtreecommitdiff
path: root/challenge-002/steven-wilson/perl5/ch-2.pl
blob: 1726baf8a36c06495ac1388262449a4f29259376 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/usr/bin/env perl
# Author: Steven Wilson
# Date: 2019-04-02
# Challenge #2
# Write a script that can convert integers to and from a base35
# representation, using the characters 0-9 and A-Y. Dave Jacoby came up with
# nice description about base35, in case you needed some background.
#
# Usage: ./week2c2 <number> [enc|dec]
# eg:
# $ ./week2c2 13 enc, encodes 13 in base 10 to D in base 35.
# $ ./week2c2 10 dec, decodes 10 in base 35 to 35 in base 10.

use warnings;
use strict;
use feature qw/ say /;

my @digits = qw / 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q
    R S T U V W X Y /;

my ( $number, $operation ) = @ARGV;

if ( $operation eq "enc" ) {
    say "$number encoded in base 35 is ", base35_encode($number);
}
elsif ( $operation eq "dec" ) {
    say "$number decoded from base 35 is ", base35_decode($number);
}

sub base35_encode {
    my $number = shift;
    my @answer;
    while ( $number > 34 ) {
        unshift @answer, $digits[ $number % 35 ];
        $number = $number / 35;
    }
    unshift @answer, $digits[$number];
    return @answer;
}

sub base35_decode {
    my $number          = shift;
    my @number_as_array = split( //, $number );
    my $number_length   = @number_as_array;
    my $answer          = 0;
    my $counter         = 0;
    my $digit_in_base10;
    for ( my $i = $number_length - 1; $i >= 0; $i-- ) {
        ($digit_in_base10)
            = grep { $digits[$_] eq $number_as_array[$counter] } ( 0 .. 34 );
        $answer += $digit_in_base10 * 35**$i;
        $counter++;
    }
    return $answer;
}