diff options
| author | andrezgz <andrezgz@gmail.com> | 2019-11-20 20:01:45 -0300 |
|---|---|---|
| committer | andrezgz <andrezgz@gmail.com> | 2019-11-20 20:01:45 -0300 |
| commit | f6a886a7e93830e5fac4c4f2cacad0b30934bc20 (patch) | |
| tree | d87a63ef9638e9d322484624dacc0cadd6158603 /challenge-035 | |
| parent | 4f8e7522c732ccf2fc27505e6937b364445a8344 (diff) | |
| download | perlweeklychallenge-club-f6a886a7e93830e5fac4c4f2cacad0b30934bc20.tar.gz perlweeklychallenge-club-f6a886a7e93830e5fac4c4f2cacad0b30934bc20.tar.bz2 perlweeklychallenge-club-f6a886a7e93830e5fac4c4f2cacad0b30934bc20.zip | |
challenge-035 andrezgz solution
Diffstat (limited to 'challenge-035')
| -rw-r--r-- | challenge-035/andrezgz/perl5/ch-1.pl | 70 | ||||
| -rw-r--r-- | challenge-035/andrezgz/perl5/ch-2.pl | 89 |
2 files changed, 159 insertions, 0 deletions
diff --git a/challenge-035/andrezgz/perl5/ch-1.pl b/challenge-035/andrezgz/perl5/ch-1.pl new file mode 100644 index 0000000000..0679ef5d80 --- /dev/null +++ b/challenge-035/andrezgz/perl5/ch-1.pl @@ -0,0 +1,70 @@ +#!/usr/bin/perl + +# https://perlweeklychallenge.org/blog/perl-weekly-challenge-035/ +# Task #1 +# Write a program to encode text into binary encoded morse code. +# Pay attention to any changes which might need to be made to the text to make it valid morse code. +# +# Morse code consists of dots, dashes and gaps. It can be encoded in binary in the following fashion: +# https://en.wikipedia.org/wiki/Morse_code +# +# dot: 1 +# dash: 111 +# intra-character gap: 0 +# character gap: 000 +# word gap: 0000000 +# An intra-character gap is inserted between the dots and dashes in a character. + +use strict; +use warnings; + +my %morse = ( + A => '.-', N => '-.', + B => '-...', O => '---', + C => '-.-.', P => '.--.', + D => '-..', Q => '--.-', + E => '.', R => '.-.', + F => '..-.', S => '...', + G => '--.', T => '-', + H => '....', U => '..-', + I => '..', V => '...-', + J => '.---', W => '.--', + K => '-.-', X => '-..-', + L => '.-..', Y => '-.--', + M => '--', Z => '--..', + + 0 => '-----', 5 => '.....', + 1 => '.----', 6 => '-....', + 2 => '..---', 7 => '--...', + 3 => '...--', 8 => '---..', + 4 => '....-', 9 => '----.', +); + +my %morse_bin = ( + '.' => '1', # dot + '-' => '111', # dash + 'i-gap' => '0', # intra-character gap + 'c-gap' => '000', # character gap + 'w-gap' => '0000000', # word gap +); + +die "Usage: $0 <space separated words>" unless @ARGV; + +my $wgap = 0; + +print $wgap++ ? $morse_bin{'w-gap'} : '', + join $morse_bin{'c-gap'}, + map { + join $morse_bin{'i-gap'}, + map { $morse_bin{$_} } + split //; + } + map { $morse{uc $_} } + split // + foreach (@ARGV); + +__END__ + +./ch-1.pl JUST ANOTHER PERL HACKER +101110111011100010101110001010100011100000001011100011101000111011101110001110001010101000100010111010000000101110111010001000101110100010111010100000001010101000101110001110101110100011101011100010001011101 + diff --git a/challenge-035/andrezgz/perl5/ch-2.pl b/challenge-035/andrezgz/perl5/ch-2.pl new file mode 100644 index 0000000000..7930f437ec --- /dev/null +++ b/challenge-035/andrezgz/perl5/ch-2.pl @@ -0,0 +1,89 @@ +#!/usr/bin/perl + +# https://perlweeklychallenge.org/blog/perl-weekly-challenge-035/ +# Task #2 +# Write a program to decode binary morse code. +# Consider how it might be possible to recover from badly formed morse code. +# +# a) by splitting the morse code on gaps +# b) without looking further than one digit ahead + +use strict; +use warnings; + +my %morse = ( + A => '.-', N => '-.', + B => '-...', O => '---', + C => '-.-.', P => '.--.', + D => '-..', Q => '--.-', + E => '.', R => '.-.', + F => '..-.', S => '...', + G => '--.', T => '-', + H => '....', U => '..-', + I => '..', V => '...-', + J => '.---', W => '.--', + K => '-.-', X => '-..-', + L => '.-..', Y => '-.--', + M => '--', Z => '--..', + + 0 => '-----', 5 => '.....', + 1 => '.----', 6 => '-....', + 2 => '..---', 7 => '--...', + 3 => '...--', 8 => '---..', + 4 => '....-', 9 => '----.', +); + +my %morse_inv = map { $morse{$_} => $_ } keys %morse; + +my %morse_bin_inv = ( + '1' => \&add_dot , # dot + '111' => \&add_dash , # dash + '0' => sub { } , # intra-character gap + '000' => \&add_char , # character gap + '0000000' => \&add_word , # word gap +); + +die "Usage: $0 <string of binary encoded morse code>" unless @ARGV == 1; + +my $seq = ''; +my $token = ''; +my $output = [ '' ]; + +my $bmc = $ARGV[0]; + +foreach my $i (0 .. (length $bmc)-1 ) { + my $actual = substr $bmc, $i, 1; + my $next = substr $bmc, $i+1, 1; + $seq .= $actual; + if ($actual ne $next) { + $morse_bin_inv{$seq}->(); + $seq = ''; + } +} +add_char(); + +print join ' ', @$output; +exit 0; + + +sub add_dot { + $token .= '.'; +} + +sub add_dash { + $token .= '-'; +} +sub add_char { + $output->[-1] .= $morse_inv{$token}; + $token = ''; +} +sub add_word { + add_char(); + push @$output, ''; +} + + +__END__ + +./ch-2.pl 101110111011100010101110001010100011100000001011100011101000111011101110001110001010101000100010111010000000101110111010001000101110100010111010100000001010101000101110001110101110100011101011100010001011101 +JUST ANOTHER PERL HACKER |
