aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2019-11-19 13:42:39 +0000
committerGitHub <noreply@github.com>2019-11-19 13:42:39 +0000
commit527913f8f218bcd9866af162e28693362611a300 (patch)
tree50e16db16c38c94e29b56165f4dfa360160a6100
parent4b5f8423cee1b75c862ce9c50cc22da4196432c4 (diff)
parent679d52cfd4a38857786c23414383ec283948c436 (diff)
downloadperlweeklychallenge-club-527913f8f218bcd9866af162e28693362611a300.tar.gz
perlweeklychallenge-club-527913f8f218bcd9866af162e28693362611a300.tar.bz2
perlweeklychallenge-club-527913f8f218bcd9866af162e28693362611a300.zip
Merge pull request #946 from Scimon/master
Here we go
-rw-r--r--challenge-035/simon-proctor/perl6/ch-1.p633
-rw-r--r--challenge-035/simon-proctor/perl6/ch-2.p638
2 files changed, 71 insertions, 0 deletions
diff --git a/challenge-035/simon-proctor/perl6/ch-1.p6 b/challenge-035/simon-proctor/perl6/ch-1.p6
new file mode 100644
index 0000000000..2e0021b8fc
--- /dev/null
+++ b/challenge-035/simon-proctor/perl6/ch-1.p6
@@ -0,0 +1,33 @@
+#!/usr/bin/env perl6
+
+# I suck at bit twiddling.
+# This explains why I did what I did.
+
+use v6;
+
+constant %MORSE-MAP = (
+ A => '10111', B => '111010101', C => '11101011101', D => '1110101',
+ E => '1', F => '101011101', G => '111011101', H => '1010101',
+ I => '101', J => '1011101110111', K => '111010111', L => '101110101',
+ M => '1110111', N => '11101', O => '11101110111', P => '10111011101',
+ Q => '1110111010111', R => '1011101', S => '10101', T => '111',
+ U => '1010111', V => '101010111', W => '101110111', X => '11101010111',
+ Y => '1110101110111', Z => '11101110101', ' ' => '0'
+);
+
+#| Help
+multi sub MAIN( Bool :h(:$help) where so * ) {
+ say $*USAGE;
+}
+
+#| Converts an sentence (a-z only) into morse and stores it as binary.
+#| Reads from STDIN write to STDOUT ASCII encoded.
+multi sub MAIN() {
+ my $input = $*IN.slurp.chomp.uc;
+ die "A-Z AND SPACES ONLY STOP PLEASE TRY AGAIN STOP" unless $input ~~ m!^ <[A..Z \ \n \t]>+ $!;
+
+ my $bin-morse = $input.comb().map( { $_.subst( /\n|\t/, " " ) } ).map( { %MORSE-MAP{$_} } ).join('000');
+ $bin-morse = "{'0' x 7 - ( $bin-morse.codes % 7 ) }{$bin-morse}";
+ my @stream = $bin-morse.comb(/. ** {7}/).map( *.parse-base(2) );
+ print Blob.new(@stream).decode("ascii");
+}
diff --git a/challenge-035/simon-proctor/perl6/ch-2.p6 b/challenge-035/simon-proctor/perl6/ch-2.p6
new file mode 100644
index 0000000000..f4eac525df
--- /dev/null
+++ b/challenge-035/simon-proctor/perl6/ch-2.p6
@@ -0,0 +1,38 @@
+#!/usr/bin/perl6
+
+# See my earlier comment on Bit twiddling.
+# I should probably make it work with streams...
+
+use v6;
+
+constant %REVERSE-MORSE-MAP = (
+ '10111' => 'A', '111010101' => 'B', '11101011101' => 'C', '1110101' => 'D',
+ '1' => 'E', '101011101' => 'F', '111011101' => 'G', '1010101' => 'H',
+ '101' => 'I', '1011101110111' => 'J', '111010111' => 'K', '101110101' => 'L',
+ '1110111' => 'M', '11101' => 'N', '11101110111' => 'O', '10111011101' => 'P',
+ '1110111010111' => 'Q', '1011101' => 'R', '10101' => 'S', '111' => 'T',
+ '1010111' => 'U', '101010111' => 'V', '101110111' => 'W', '11101010111' => 'X',
+ '1110101110111' => 'Y', '11101110101' => 'Z', '0000000' => ' ', '000' => '',
+);
+
+#| Help
+multi sub MAIN( Bool :h(:$help) where so * ) {
+ say $*USAGE;
+}
+
+#| Converts an encoded
+#| Reads from STDIN write to STDOUT
+multi sub MAIN() {
+ say $*IN
+ .slurp(:bin)
+ .decode("ascii")
+ .comb()
+ .map( *.ord )
+ .map( *.base(2) )
+ .map( *.fmt( "%07s" ) )
+ .join("")
+ .subst( /^0+/, "" )
+ .split("0000000")
+ .map( *.split("000").map( { %REVERSE-MORSE-MAP{$_} } ).join("") ).join(" ")
+ ;
+}