This is a part of Perl Weekly Challenge(PWC) #053 and the followings are related to my solution. If you want to challenge yourself on Perl, go to https://perlweeklychallenge.org, code the latest challenges, submit codes on-time (by GitHub or email) if possible, before reading my blog post.
Do tell me if I am wrong or you strongly oppose my statements!
Oh. Task #1 has been funner than what I thought. I would like to introduce the "advanced" version I coded; it requests a specific module to run; well, I write these codes while I am studying OO hence a package (or module?or class? Which word is more suitable?) exists).
I have supplied a simpler script on GitHub, where the idea is based on a spiral.
#the spiral for the simpler script
3, 2, 1,
4, X, 0,
5, 6, 7
- - - - - - - - - - - - - - -
new_position_vector = ReverseTranslation(Rotation(Translation(old_position_vector))) .
Content inside xy.pm
package xy;
use strict;
sub new {
my ($class) = @_;
bless{
_value=> $_[1],
_x=>$_[2],
_y=>$_[3],
}, $class;
}
sub x{ $_[0]->{_x}}
sub y{ $_[0]->{_y}}
sub value{ $_[0]->{_value} }
1;
Highlights of the Content in ch-1a.pl
#!/usr/bin/perl
use strict;
use xy;
# Perl Weekly Challenge #053 Task #1
# 90/180/270 degree clockwise Rotation of a N x N square matrix
# Usage(example): put the module in proper place, then:
# $ ch-1a.pl 3 90 1 2 3 4 5 6 7 8 9
my $N = shift @ARGV;
my $ANGLE = shift @ARGV;
my $hN = $N/2 + 0.5;
#...
sub rcaqx {
#short for Rotation_Clockwise_A_Quarter, x stands for multiple
if ($_[2]>=1) {
my ($xcoord, $ycoord) = ($_[0], $_[1]);
$_[0] = $ycoord;
$_[1] = -$xcoord;
return rcaqx($_[0], $_[1], $_[2]-1);
# I know we can skip the use of temporary variables to be more concise
# but the version now is more readable to me
} else {return ($_[0], $_[1])}
}
#...
sub position {
return $_[0] + $N*($N-$_[1]) - 1
}
for $i (1..$N*$N) {
$newmatrix->[$i] = xy->new($matrix->[$i]->value,
translation_add_negT(rcaqx ((translation_add_T(
$matrix->[$i]->x, $matrix->[$i]->y) ), $ANGLE/90 )) );
$coordinateplane[position( $newmatrix->[$i]->x, $newmatrix->[$i]->y )]
= $newmatrix->[$i]->value;
}
# print out the result
for (0..$N*$N-1) {
if ($_ % $N == 0) {print "\n"};
printf "%3d " , $coordinateplane[$_];
}
# ref: https://en.wikipedia.org/wiki/Rotation_matrix
# For N=3, the coordinates and the corresponding index of @coordinateplane:
# (1,3) (2,3) (3,3) 0, 1, 2,
# (1,2) (2,2) (3,2) 3, 4, 5,
# (1,1) (2,1) (3,1) 6, 7, 8
# For N=5:
# (1,5) (2,5) (3,5) (4,5) (5,5) 0, 1 ,2 ,3, 4,
# (1,4) (2,4) (3,4) (4,4) (5,4) 5, 6, 7, 8, 9,
# (1,3) (2,3) (3,3) (4,3) (5,3) 10,11,12,13,14,
# (1,2) (2,2) (3,2) (4,2) (5,2) 15,16,17,18,19,
# (1,1) (2,1) (3,1) (4,1) (5,1) 20,21,22,23,24
============================
Notes/Aftermath:
- Just discover that more than one source codes can be submitted for a same task in PWC; we just name the late comers by ch-1a.pl ch-1b.pl ch-1c.pl ...
- Having been using the web interface of GitHub, I have a short-term goal: learning to use Git and GitHub in console.
- Just read the review of my mentionable code for PWC #049 Task #1, reviewed by Ryan. Yet another short-term goal: Need to learn how to document and name the variables well. XP
- Yet one more short-term goal: learn to use Test::More and Test::Deep .
- ++: (optional) learn to use perl default debugger .
There are lots of things to be discovered in the serious coders' world... (17:43 in GMT+8 Timezone)