## Rotation in R^2 - CY's take on PWC#053 Task 1

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
```
- - - - - - - - - - - - - - -
The idea behind this so-called "advanced" version is based on linear transformations on plane. In words:

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,
\$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)