diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2019-11-24 08:02:15 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-11-24 08:02:15 +0000 |
| commit | 8c02e9358616dd48c25a3cececf61aa17bf36608 (patch) | |
| tree | 05ba511ec4c016aa417c698b8bf44de78c4414a7 /challenge-035 | |
| parent | 944a72876a09cd98e518cbba3fb88a85cbae8682 (diff) | |
| parent | 458f4cfb5835586390e39acb59960377f3c1e528 (diff) | |
| download | perlweeklychallenge-club-8c02e9358616dd48c25a3cececf61aa17bf36608.tar.gz perlweeklychallenge-club-8c02e9358616dd48c25a3cececf61aa17bf36608.tar.bz2 perlweeklychallenge-club-8c02e9358616dd48c25a3cececf61aa17bf36608.zip | |
Merge pull request #963 from drclaw1394/master
ruben/drclaw solution for W35 ch1 and ch2 perl and raku
Diffstat (limited to 'challenge-035')
| -rw-r--r-- | challenge-035/ruben-westerberg/README | 9 | ||||
| -rwxr-xr-x | challenge-035/ruben-westerberg/perl/ch-1-and-2.pl | 110 | ||||
| -rwxr-xr-x | challenge-035/ruben-westerberg/raku/ch-1-and-2.p6 | 133 |
3 files changed, 247 insertions, 5 deletions
diff --git a/challenge-035/ruben-westerberg/README b/challenge-035/ruben-westerberg/README index 4bd6acfd21..10a86d1ab4 100644 --- a/challenge-035/ruben-westerberg/README +++ b/challenge-035/ruben-westerberg/README @@ -1,13 +1,12 @@ Solution by Ruben Westerberg -ch-1.pl and ch-1.p6 +ch-1-and-2.(pl and p6) ================== -Run the program to see differnt ways to slice arrays and hashes +Run the program to demonstrate encoding and decoding of morse code. A single command line argument can be give to as the input string. Remember to use quotes to include spaces" + +Decoding also fixes the trailing bits leftover in the last byte. -ch-2.pl and ch-2.p6 -================== -Run the program to see random execution of function stored in a dispatch table diff --git a/challenge-035/ruben-westerberg/perl/ch-1-and-2.pl b/challenge-035/ruben-westerberg/perl/ch-1-and-2.pl new file mode 100755 index 0000000000..158486de60 --- /dev/null +++ b/challenge-035/ruben-westerberg/perl/ch-1-and-2.pl @@ -0,0 +1,110 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use experimental qw<switch>; +use v5.26; + +my %forwardTable=map { join "0",split "",$_}( + a=>".-", + b=>"-...", + c=>"-.-.", + d=>"-..", + e=>".", + f=>"..-.", + g=>"--.", + h=>"....", + i=>"..", + j=>".---", + k=>"-.-", + l=>".-...", + n=>"-.", + m=>"--", + o=>"---", + p=>".--.", + q=>"--.-", + r=>".-.", + s=>"...", + t=>"-", + u=>"..-", + v=>"...-", + w=>".--", + x=>"-..-", + y=>"-.--", + z=>"--..", + 1=>".----", + 2=>"..---", + 3=>"...--", + 4=>"....-", + 5=>".....", + 6=>"-....", + 7=>"--...", + 8=>"---..", + 9=>"----.", + 0=>"-----", + " "=>"" +); + +my %reverseTable; +$reverseTable{$forwardTable{$_}}=$_ for (keys %forwardTable); + +my $string= $ARGV[0]//"abc"; +$string=~tr/A-Z/a-z/; + +print "Original String: $string\n"; + +my $e=encode($string); +print "Encoded: $e\n"; + +my $packed=pack("B*",$e); + +my $unpacked=unpack("B*",$packed); +print "Unpacked: ".$unpacked."\n"; + +my $d=decode($unpacked); +print "Decoded: $d\n"; + +#=== +sub encode { + my ($in)=@_; + my @codes= map { ($_,"000") } @forwardTable{split "", $in}; + pop @codes; #Remove last charater gap + my $out=""; + for (map { split "", $_}@codes) { + when (/\./) { + $out.="1"; + } + when (/-/) { + $out.="111"; + } + when (/0/) { + $out.="0"; + } + default { + } + } + $out; +} + +sub decode { + + my ($in)=@_; + my $out=""; + for (split "000", $in) { + when (/^$/) { + $out.=" "; + } + default { + s/111/-/g; + s/1/./g; + # s/0//g; + my $c=$reverseTable{$_}; + + while (! $c ){ #fix extra bits at end of byte + $_=substr($_,0,length($_) -1); + $c=$reverseTable{$_}; + } + $out.=$c; + } + } + $out; +} diff --git a/challenge-035/ruben-westerberg/raku/ch-1-and-2.p6 b/challenge-035/ruben-westerberg/raku/ch-1-and-2.p6 new file mode 100755 index 0000000000..b9d2c5b821 --- /dev/null +++ b/challenge-035/ruben-westerberg/raku/ch-1-and-2.p6 @@ -0,0 +1,133 @@ +#!/usr/bin/env perl6 + +my %forwardTable=map { (.key=> join("0",comb "",.value))}, ( + a=>".-", + b=>"-...", + c=>"-.-.", + d=>"-..", + e=>".", + f=>"..-.", + g=>"--.", + h=>"....", + i=>"..", + j=>".---", + k=>"-.-", + l=>".-...", + n=>"-.", + m=>"--", + o=>"---", + p=>".--.", + q=>"--.-", + r=>".-.", + s=>"...", + t=>"-", + u=>"..-", + v=>"...-", + w=>".--", + x=>"-..-", + y=>"-.--", + z=>"--..", + 1=>".----", + 2=>"..---", + 3=>"...--", + 4=>"....-", + 5=>".....", + 6=>"-....", + 7=>"--...", + 8=>"---..", + 9=>"----.", + 0=>"-----", + " "=>"" +); + +my %reverseTable; +%reverseTable{%forwardTable{$_}}=$_ for (keys %forwardTable); + +my $string= @*ARGS[0]//"abc"; +$string~~tr/A..Z/a..z/; + +print "Original String: $string\n"; + +my $e=encode($string); +print "Encoded: $e\n"; + +my $packed=packbitstring($e); + +my $unpacked=unpackbitstring($packed); + +put "Unpacked: $unpacked"; + +my $d=decode($unpacked); +put "Decoded: $d"; + +sub encode ($in) { + + my @codes=map { |($_,"000") }, %forwardTable{$in.comb("")}; + @codes.pop; + my $out=""; + for (map { |(comb "", $_)}, @codes) { + when /\./ { + $out~="1"; + } + when /\-/ { + $out~="111"; + } + when /0/ { + $out~="0"; + } + default { + } + } + $out; +} + +sub decode($in) { + + my $out=""; + for (split "000", $in) { + when (/^$/) { + $out~=" "; + } + default { + my $a=S:g/111/-/; + $a~~s:g/1/./; + my $c=%reverseTable{$a}; + + while (! $c ) { #fix extra bits at end of byte + $a=substr($a,0,chars($a) -1); + $c=%reverseTable{$a}; + } + $out~=$c; + } + } + $out; +} + sub packbitstring($in) { + my uint8 $byte=0; + my Buf $out.=new; + for ($in.comb) { + state $i=0; + $byte+|= $_.Int +< (7-$i++); + if $i %% 8 { + $i=0; + $out.append: $byte; + $byte=0; + } + LAST { + $out.append: $byte if $byte; + } + } + $out; + } + +sub unpackbitstring($in) { + my @bits; + for $in[] { + my $byte=$_; + for 0..7 { + @bits.push: ($byte +< $_ +& 0x80)??"1"!!"0"; + } + } + @bits.join; +} + |
