aboutsummaryrefslogtreecommitdiff
path: root/challenge-035
diff options
context:
space:
mode:
authorandrezgz <andrezgz@gmail.com>2019-11-20 20:01:45 -0300
committerandrezgz <andrezgz@gmail.com>2019-11-20 20:01:45 -0300
commitf6a886a7e93830e5fac4c4f2cacad0b30934bc20 (patch)
treed87a63ef9638e9d322484624dacc0cadd6158603 /challenge-035
parent4f8e7522c732ccf2fc27505e6937b364445a8344 (diff)
downloadperlweeklychallenge-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.pl70
-rw-r--r--challenge-035/andrezgz/perl5/ch-2.pl89
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