aboutsummaryrefslogtreecommitdiff
path: root/challenge-022
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2019-08-26 01:00:13 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2019-08-26 01:00:13 +0100
commitc1c07da29db1f3e3e00b383435a641ea71e5538d (patch)
tree14d66d8d39e1780425c863e9213611af521c29a4 /challenge-022
parentff5c8fc253ad9ae8c2b07e9c697056f5544d68c8 (diff)
downloadperlweeklychallenge-club-c1c07da29db1f3e3e00b383435a641ea71e5538d.tar.gz
perlweeklychallenge-club-c1c07da29db1f3e3e00b383435a641ea71e5538d.tar.bz2
perlweeklychallenge-club-c1c07da29db1f3e3e00b383435a641ea71e5538d.zip
- Added solutions by Arne Sommer.
Diffstat (limited to 'challenge-022')
-rw-r--r--challenge-022/arne-sommer/blog.txt1
-rw-r--r--challenge-022/arne-sommer/perl6/ch-1.p66
-rw-r--r--challenge-022/arne-sommer/perl6/ch-2.p667
3 files changed, 74 insertions, 0 deletions
diff --git a/challenge-022/arne-sommer/blog.txt b/challenge-022/arne-sommer/blog.txt
new file mode 100644
index 0000000000..bf3776b1e4
--- /dev/null
+++ b/challenge-022/arne-sommer/blog.txt
@@ -0,0 +1 @@
+https://perl6.eu/prime-lzw.html
diff --git a/challenge-022/arne-sommer/perl6/ch-1.p6 b/challenge-022/arne-sommer/perl6/ch-1.p6
new file mode 100644
index 0000000000..cc7feb0f85
--- /dev/null
+++ b/challenge-022/arne-sommer/perl6/ch-1.p6
@@ -0,0 +1,6 @@
+my $primes := (1 .. Inf).grep(*.is-prime);
+
+my $sexy-primes := $primes.grep({ ($_ + 6).is-prime }); # [1]
+
+say "{ $_ +1 }: ($sexy-primes[$_],{ $sexy-primes[$_] +6 })" for ^10; # [2]
+
diff --git a/challenge-022/arne-sommer/perl6/ch-2.p6 b/challenge-022/arne-sommer/perl6/ch-2.p6
new file mode 100644
index 0000000000..7d7315543f
--- /dev/null
+++ b/challenge-022/arne-sommer/perl6/ch-2.p6
@@ -0,0 +1,67 @@
+multi sub MAIN (Str $string) # [1]
+{
+ my ($alphabet, $encoded) = encode($string); # [2]
+ say "'" ~ $alphabet ~ "' $encoded" ; # [2]
+}
+
+multi sub MAIN (Str $alphabet, Str $binary) # [3]
+{
+ say decode($alphabet, $binary); # [4]
+}
+
+sub encode (Str $string) # [1]
+{
+ my @alphabet = ('#', $string.comb).flat.unique; # [2]
+ my @dict = @alphabet; # [3]
+ my %dict = @alphabet.kv.reverse; # [4]
+
+ my @chars = $string.comb; # [5]
+ my $binary = ""; # [6]
+
+ while @chars # [7]
+ {
+ my $char = @chars.shift; # [8]
+
+ last if $char eq "#"; # [9]
+
+ $char ~= @chars.shift while @chars.elems && %dict{$char ~ @chars[0]}; # [10]
+
+ my $bits = @dict.elems.base(2).chars; # [11]
+ my $fmt = '%0' ~ $bits ~ 'b'; # [12]
+ my $add = %dict{$char}.fmt($fmt); # [13]
+ $binary ~= $add; # [14]
+
+ if @chars.elems && @chars[0] ne "#" # [15]
+ {
+ @dict.push($char ~ @chars[0]); # [16]
+ %dict{$char ~ @chars[0]} = @dict.end; # [17]
+ }
+ }
+
+ return @alphabet.join, $binary; # [18]
+}
+
+sub decode (Str $alphabet, Str $binary is copy) # [1]
+{
+ my @alphabet = $alphabet.comb; # [2]
+
+ @alphabet.unshift('#') unless @alphabet[0] eq "#"; # [3]
+
+ my $prev; # [4]
+ my $output; # [5]
+
+ while $binary.chars # [6]
+ {
+ my $size = (@alphabet.elems +1).base(2).chars; # [7]
+ my $current = $binary.substr(0, $size); # [8]
+ $binary.substr-rw(0, $size) = ""; # [9]
+
+ my $value = @alphabet[$current.parse-base(2)]; # [10]
+ @alphabet.push($prev ~ $value) if $prev.defined; # [11]
+
+ $output ~= $value; # [12]
+ $prev = $value; # [13]
+ }
+
+ return $output; # [14]
+}