aboutsummaryrefslogtreecommitdiff
path: root/challenge-067
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2020-07-01 19:08:27 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2020-07-01 19:08:27 +0100
commit033813ec45b89fbe5653bc0189688aed724c5650 (patch)
tree65dc6aa433347e2273a1ae1e6cde9a4762e979e5 /challenge-067
parentf72c755fe1ea941c51d44a88c808d9d423d4e8b8 (diff)
downloadperlweeklychallenge-club-033813ec45b89fbe5653bc0189688aed724c5650.tar.gz
perlweeklychallenge-club-033813ec45b89fbe5653bc0189688aed724c5650.tar.bz2
perlweeklychallenge-club-033813ec45b89fbe5653bc0189688aed724c5650.zip
- Added Letter Phone task in Perl.
Diffstat (limited to 'challenge-067')
-rw-r--r--challenge-067/mohammad-anwar/perl/ch-2.pl57
-rw-r--r--challenge-067/mohammad-anwar/perl/ch-2a.pl69
2 files changed, 126 insertions, 0 deletions
diff --git a/challenge-067/mohammad-anwar/perl/ch-2.pl b/challenge-067/mohammad-anwar/perl/ch-2.pl
new file mode 100644
index 0000000000..aa3d7d2389
--- /dev/null
+++ b/challenge-067/mohammad-anwar/perl/ch-2.pl
@@ -0,0 +1,57 @@
+#!/usr/bin/perl
+
+#
+# Perl Weekly Challenge - 067
+#
+# Task #2: Letter Phone
+#
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-067/
+#
+
+use strict;
+use warnings;
+
+binmode STDOUT, 'encoding(UTF-8)';
+print join "\n", phone_letters($ARGV[0]), '';
+
+sub phone_letters {
+ my ($digits) = @_;
+
+ die "ERROR: Missing digits.\n"
+ unless defined $digits;
+ die "ERROR: Invalid digits [$digits].\n"
+ unless ($digits =~ /^[0-9\*\#]+$/);
+
+ # letter phone
+ my %letter_of = (
+ '1' => '_,@',
+ '2' => 'abc',
+ '3' => 'def',
+ '4' => 'ghi',
+ '5' => 'jlk',
+ '6' => 'mno',
+ '7' => 'pqrs',
+ '8' => 'tuv',
+ '9' => 'wxyz',
+ '0' => '0',
+ '#' => '#',
+ '*' => chr(9251),
+ );
+
+ # prepare data set
+ my @data = ();
+ foreach my $digit (split //,$digits) {
+ push @data, [ split //, $letter_of{$digit} ];
+ }
+
+ # generate all possible combinations
+ my @combinations = ('');
+ foreach my $members (@data) {
+ @combinations = map {
+ my $member = $_;
+ map $member.$_, @$members
+ } @combinations;
+ }
+
+ return @combinations;
+}
diff --git a/challenge-067/mohammad-anwar/perl/ch-2a.pl b/challenge-067/mohammad-anwar/perl/ch-2a.pl
new file mode 100644
index 0000000000..99b8c14cad
--- /dev/null
+++ b/challenge-067/mohammad-anwar/perl/ch-2a.pl
@@ -0,0 +1,69 @@
+#!/usr/bin/perl
+
+#
+# Perl Weekly Challenge - 067
+#
+# Task #2: Letter Phone
+#
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-067/
+#
+
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Deep;
+
+is_deeply( [ phone_letters('35') ],
+ [ 'dj', 'dl', 'dk', 'ej', 'el', 'ek', 'fj', 'fl', 'fk' ],
+ 'testing digits 35' );
+is_deeply( [ phone_letters('10') ],
+ [ '_0', ',0', '@0' ],
+ 'testing digits 10' );
+is_deeply( [ phone_letters('2#') ],
+ [ 'a#', 'b#', 'c#' ],
+ 'testing digits 2#' );
+
+done_testing;
+
+sub phone_letters {
+ my ($digits) = @_;
+
+ die "ERROR: Missing digits.\n"
+ unless defined $digits;
+ die "ERROR: Invalid digits [$digits].\n"
+ unless ($digits =~ /^[0-9\*\#]+$/);
+
+ # letter phone
+ my %letter_of = (
+ '1' => '_,@',
+ '2' => 'abc',
+ '3' => 'def',
+ '4' => 'ghi',
+ '5' => 'jlk',
+ '6' => 'mno',
+ '7' => 'pqrs',
+ '8' => 'tuv',
+ '9' => 'wxyz',
+ '0' => '0',
+ '#' => '#',
+ '*' => chr(9251),
+ );
+
+ # prepare data set
+ my @data = ();
+ foreach my $digit (split //,$digits) {
+ push @data, [ split //, $letter_of{$digit} ];
+ }
+
+ # generate all possible combinations
+ my @combinations = ('');
+ foreach my $members (@data) {
+ @combinations = map {
+ my $member = $_;
+ map $member.$_, @$members
+ } @combinations;
+ }
+
+ return @combinations;
+}