aboutsummaryrefslogtreecommitdiff
path: root/challenge-015
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2019-07-04 12:18:52 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2019-07-04 12:18:52 +0100
commitfd5fc8c34b095516d28f358313a1f6206ac7a92f (patch)
tree68d1b8d71400a224caf3381d3425d8f6fd4e60b3 /challenge-015
parente650bbd6e95fa92f446cc7ec08372621ce14ad8c (diff)
downloadperlweeklychallenge-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.p630
-rw-r--r--challenge-015/kevin-colyer/perl6/ch-2.p648
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 ;
+}
+