Sha256: dc9e4b3b42d3be68288d260edd487afe2c897d74ccecde5907363c0be660ad07

Contents?: true

Size: 1.18 KB

Versions: 323

Compression:

Stored size: 1.18 KB

Contents

package Example;

use strict;
use warnings;
use List::Util qw(first);

sub new {
    my ($class, $key) = @_;
    
    if (defined $key and $key !~ /[a-z]/) {
        die "ArgumentError: $key" 
    } else {
        $key ||= "a";
    }

    return bless { keys => [ split '', $key ] };
}

sub encode {
    my ($self, $plaintext) = @_;
    my $cipher;
    my @plain_chars = split '' => do { $plaintext = lc $plaintext; $plaintext =~ s/[^a-z]//g; $plaintext  };

    $cipher .= $self->_shift_char( $plain_chars[$_], $_ ) for 0..$#plain_chars;

    return $cipher;
}

sub decode {
    my ($self, $cipher) = @_;
    my $plaintext;
    my @cipher_chars = split '' => $cipher;

    $plaintext .= $self->_shift_char( $cipher_chars[$_], $_ * -1) for 0..$#cipher_chars;

    return $plaintext;
}

sub _shift_char {
    my ($self, $plain, $index) = @_;

    my $char_key = $self->{keys}->[abs($index)] || 'a';
    my $shift_index = first { [('a'..'z')]->[$_] eq $char_key } (0..26);
    my $plain_index = first { [('a'..'z')]->[$_] eq $plain    } (0..26);

    return  [('a'..'z')]->[($plain_index - $shift_index) % 26] if ((caller(1))[3]) =~ /decode/;
    return  [('a'..'z')]->[($plain_index + $shift_index) % 26];
}

1;

Version data entries

323 entries across 323 versions & 1 rubygems

Version Path
trackler-2.2.1.105 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.104 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.103 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.102 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.101 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.100 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.99 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.98 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.97 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.96 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.95 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.94 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.93 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.92 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.91 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.90 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.89 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.88 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.87 tracks/perl5/exercises/simple-cipher/Example.pm
trackler-2.2.1.86 tracks/perl5/exercises/simple-cipher/Example.pm