aboutsummaryrefslogtreecommitdiff
path: root/challenge-015/zapwai/perl/ch-2.pl
blob: e2798aed98cd30846ba5912b533919742220c6a9 (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
my $message = "hello world";
my $key = "test";

use v5.38;
my $enc = vigenere(0, $key, $message);
say "Encoded message: $enc";
my $dec = vigenere(1, $key, $enc);
say "Decoded message: $dec";

# mode = 0 to encode, 1 to decode
sub vigenere($mode, $key, $message) {
    my $alph = "abcdefghijklmnopqrstuvwxyz";
    my $q = (length $message) / (length $key);
    $key .= $key x $q;
    while (length $key > length $message) {
	$key = substr $key, 0, -1;
    }
    my @msg_letters = split "", lc $message;
    my @key_letters = split "", lc $key;
    my @rots = map {index $alph, $_} @key_letters;
    my @ans_letters;
    for my $i (0 .. $#msg_letters) {
	if ($msg_letters[$i] =~ /\W/) {
	    push @ans_letters, $msg_letters[$i];
	    next;
	}
	my $v = index $alph, $msg_letters[$i];
	my $x = ($mode == 0) ? ($v + $rots[$i]) % 26 : ($v - $rots[$i]) % 26;
	my $let = substr $alph, $x, 1;
	push @ans_letters, $let;
    }
    return join "", @ans_letters;
}