aboutsummaryrefslogtreecommitdiff
path: root/challenge-035
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2019-11-24 08:02:15 +0000
committerGitHub <noreply@github.com>2019-11-24 08:02:15 +0000
commit8c02e9358616dd48c25a3cececf61aa17bf36608 (patch)
tree05ba511ec4c016aa417c698b8bf44de78c4414a7 /challenge-035
parent944a72876a09cd98e518cbba3fb88a85cbae8682 (diff)
parent458f4cfb5835586390e39acb59960377f3c1e528 (diff)
downloadperlweeklychallenge-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/README9
-rwxr-xr-xchallenge-035/ruben-westerberg/perl/ch-1-and-2.pl110
-rwxr-xr-xchallenge-035/ruben-westerberg/raku/ch-1-and-2.p6133
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;
+}
+