diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2019-07-04 12:18:52 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2019-07-04 12:18:52 +0100 |
| commit | fd5fc8c34b095516d28f358313a1f6206ac7a92f (patch) | |
| tree | 68d1b8d71400a224caf3381d3425d8f6fd4e60b3 /challenge-015 | |
| parent | e650bbd6e95fa92f446cc7ec08372621ce14ad8c (diff) | |
| download | perlweeklychallenge-club-fd5fc8c34b095516d28f358313a1f6206ac7a92f.tar.gz perlweeklychallenge-club-fd5fc8c34b095516d28f358313a1f6206ac7a92f.tar.bz2 perlweeklychallenge-club-fd5fc8c34b095516d28f358313a1f6206ac7a92f.zip | |
- Added solutions by Kevin Colyer.
Diffstat (limited to 'challenge-015')
| -rw-r--r-- | challenge-015/kevin-colyer/perl6/ch-1.p6 | 30 | ||||
| -rw-r--r-- | challenge-015/kevin-colyer/perl6/ch-2.p6 | 48 |
2 files changed, 78 insertions, 0 deletions
diff --git a/challenge-015/kevin-colyer/perl6/ch-1.p6 b/challenge-015/kevin-colyer/perl6/ch-1.p6 new file mode 100644 index 0000000000..7fa0a914ac --- /dev/null +++ b/challenge-015/kevin-colyer/perl6/ch-1.p6 @@ -0,0 +1,30 @@ +#!/usr/bin/perl6 +use v6; + +use Test; + +# 15.1 Write a script to generate first 10 strong and weak prime numbers. +# +# For example, the nth prime number is represented by p(n). +# +# p(1) = 1 +# p(2) = 3 +# p(3) = 5 +# +# Strong Prime number p(n) when p(n) > [ p(n-1) + p(n+1) ] / 2 +# Weak Prime number p(n) when p(n) < [ p(n-1) + p(n+1) ] / 2 + +my @p = (2,3,*+2 ... ∞).grep: *.is-prime; + +my @weak = (1 .. ∞).map: { @p[$_] if @p[$_] < ( @p[$_-1] + @p[$_+1] ) /2 }; +my @strong = (1 .. ∞).map: { @p[$_] if @p[$_] > ( @p[$_-1] + @p[$_+1] ) /2 }; + + +sub MAIN($num where *>1) +{ + say "$num weak primes"; + say @weak[^$num]; + + say "$num strong primes"; + say @strong[^$num]; +} diff --git a/challenge-015/kevin-colyer/perl6/ch-2.p6 b/challenge-015/kevin-colyer/perl6/ch-2.p6 new file mode 100644 index 0000000000..fac6762f81 --- /dev/null +++ b/challenge-015/kevin-colyer/perl6/ch-2.p6 @@ -0,0 +1,48 @@ +#!/usr/bin/perl6 +use v6; + +use Test; + +# 15.2 +# Write a script to implement Vigenère cipher. The script should be able encode and decode. https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher + +#| Encodes or Decodes a text using Vigenère cipher. +multi sub MAIN(Str $text , Str $key, Bool :$encode=True, Bool :$decode=False) { + + die "key needs to be smaller or equal to text" unless $text.chars > 0 and $key.chars > 0 and $key.chars <= $text.chars; + die "key [$key] must be ASCII" unless $key ~~ m:i /^ <[A..Z]>+ $/; + die "text [$text] must be ASCII" unless $text ~~ m:i /^ <[A..Z]>+ $/; + my $which=$encode && ! $decode; + + say VigenereCipher($text,$key,$which); +}; + +multi sub MAIN(Bool :$test=False) { + say $*USAGE and exit() unless $test==True; + + say "Testing"; + my $plaintext = "ATTACKATDAWN"; + my $key = "LEMONLEMONLE"; + my $ciphertext = "LXFOPVEFRNHR"; + is VigenereCipher($plaintext,$key,True), $ciphertext,"VigenereCipher encrypts ok"; + is VigenereCipher($ciphertext,$key,False),$plaintext ,"VigenereCipher decrypts ok"; + done-testing; +} + +sub VigenereCipher($text,$key,$encode) { + my $offset="A".ord; + my @t = $text.uc.comb.map(*.ord-$offset); + my @k = $key .uc.comb.map(*.ord-$offset); + my @result; + my $EorD = $encode==True ?? 1 !! -1; + + my $i=0; + + for ^@t -> $j { + @result.push: chr($offset + ( (@t[$j]+ $EorD*@k[$i]) mod 26) ); + $i=($i+1) mod @k.elems; + + } + return @result.join ; +} + |
