aboutsummaryrefslogtreecommitdiff
path: root/challenge-053
diff options
context:
space:
mode:
authorDave Cross <dave@dave.org.uk>2020-03-23 14:58:08 +0000
committerDave Cross <dave@dave.org.uk>2020-03-23 14:58:08 +0000
commitf684a80592855455743ebe48766c4e627dddc79e (patch)
tree5424c96b51009de6646572ce82098e457bbc84ab /challenge-053
parent2e37ab580a8da6a6194a5c993387c17a299c4d62 (diff)
downloadperlweeklychallenge-club-f684a80592855455743ebe48766c4e627dddc79e.tar.gz
perlweeklychallenge-club-f684a80592855455743ebe48766c4e627dddc79e.tar.bz2
perlweeklychallenge-club-f684a80592855455743ebe48766c4e627dddc79e.zip
Challenge #53
Diffstat (limited to 'challenge-053')
-rw-r--r--challenge-053/dave-cross/perl/ch-01.pl47
-rw-r--r--challenge-053/dave-cross/perl/ch-02.pl39
2 files changed, 86 insertions, 0 deletions
diff --git a/challenge-053/dave-cross/perl/ch-01.pl b/challenge-053/dave-cross/perl/ch-01.pl
new file mode 100644
index 0000000000..c958c67144
--- /dev/null
+++ b/challenge-053/dave-cross/perl/ch-01.pl
@@ -0,0 +1,47 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use feature 'say';
+
+sub print_matrix {
+ my ($matrix) = @_;
+
+ for (@$matrix) {
+ say '[', join(', ', @$_), ']';
+ }
+}
+
+sub rotate_matrix {
+ my ($matrix, $degrees) = @_;
+
+ die "Must give rotation in degrees\n" unless $degrees;
+ die "Must rotate by 90, 180 or 270 degrees\n"
+ if $degrees =~ /\D/ or $degrees % 90 or $degrees > 270;
+
+ my $rotated_matrix;
+
+ for (1 .. $degrees / 90) {
+ $rotated_matrix = [];
+ for my $i (0 .. $#$matrix) {
+ for my $j (0 .. $#{$matrix->[$i]}) {
+ $rotated_matrix->[$j][$#{$matrix->[$i]} - $i] = $matrix->[$i][$j];
+ }
+ }
+ $matrix = $rotated_matrix;
+ }
+
+ return $rotated_matrix;
+}
+
+my $input = [
+ [1, 2 ,3],
+ [4, 5, 6],
+ [7, 8, 9],
+];
+say "Original matrix:";
+print_matrix($input);
+for (90, 180, 270) {
+ say "Rotating by $_ degrees:";
+ print_matrix(rotate_matrix($input, $_));
+}
diff --git a/challenge-053/dave-cross/perl/ch-02.pl b/challenge-053/dave-cross/perl/ch-02.pl
new file mode 100644
index 0000000000..b1ce0a4882
--- /dev/null
+++ b/challenge-053/dave-cross/perl/ch-02.pl
@@ -0,0 +1,39 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use feature 'say';
+
+my $count = get_arg();
+
+my %strings = (
+ a => [qw[e i]],
+ e => [qw[i]],
+ i => [qw[a e o u]],
+ o => [qw[a u]],
+ u => [qw[o e]],
+);
+
+my @words = map { [ $_ ] } keys %strings;
+
+@words = add_letter(@words) for 2 .. $count;
+
+say @$_ for sort { "@$a" cmp "@$b" } @words;
+
+sub get_arg {
+ die "Must give an integer between 1 and 5\n"
+ if !@ARGV or $ARGV[0] =~ /\D/ or ! $ARGV[0] or $ARGV[0] > 5;
+
+ return $ARGV[0];
+}
+
+sub add_letter {
+ my @input = @_;
+ my @output;
+
+ for my $in (@input) {
+ push @output, map { [ @$in, $_ ]} @{$strings{$in->[-1]}};
+ }
+
+ return @output;
+}