diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2019-11-19 13:42:39 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-11-19 13:42:39 +0000 |
| commit | 527913f8f218bcd9866af162e28693362611a300 (patch) | |
| tree | 50e16db16c38c94e29b56165f4dfa360160a6100 | |
| parent | 4b5f8423cee1b75c862ce9c50cc22da4196432c4 (diff) | |
| parent | 679d52cfd4a38857786c23414383ec283948c436 (diff) | |
| download | perlweeklychallenge-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.p6 | 33 | ||||
| -rw-r--r-- | challenge-035/simon-proctor/perl6/ch-2.p6 | 38 |
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(" ") + ; +} |
