diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2019-08-26 01:00:13 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2019-08-26 01:00:13 +0100 |
| commit | c1c07da29db1f3e3e00b383435a641ea71e5538d (patch) | |
| tree | 14d66d8d39e1780425c863e9213611af521c29a4 /challenge-022 | |
| parent | ff5c8fc253ad9ae8c2b07e9c697056f5544d68c8 (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rw-r--r-- | challenge-022/arne-sommer/perl6/ch-1.p6 | 6 | ||||
| -rw-r--r-- | challenge-022/arne-sommer/perl6/ch-2.p6 | 67 |
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] +} |
