Thanks to the numerous examples, along with some deep thought, I have some success to report!
While it isn't the prettiest code, my reduce subroutine passes the automated tests. There are still some issues to work out, but the main problems I solved were:
1. Picking which test subroutine to use. I ended up using is_deeply, based on the post by AnomalousMonk. With that example, and some study of the Perl documentation, I figured out how to pass the test data to the subroutine correctly.
2. Due to the assumptions I made when initially writing the script, I had hoped returning the entire array would have been sufficient.
I had the issue that the array that was returned contained values from prior calls that are generally non-existent when I use the command line.
This affected the structure equality comparisons. I ended up simply returning a list of scalars, which corrected the problem.
I will likely re-write this and extend it using some of the suggestions of Perlancer. But the initial goal of getting the tests to run has been met.
reduce.t
#!/usr/bin/env/perl
use strict;
use warnings;
use Test::More 'no_plan';
my $test_path = "C:/Users/Greyhat/PDL_Old/trig/src";
ok( require( "$test_path/reduce.pl" ), 'Load file correctly.' ) or ex
+it;
# Not implemented
#my $test_2 = [0,0,0];
#my $answer_2 = [0,0,0];
#my $note_2 = "@$test_2 | @$answer_2 | 2. Call with no value.";
my $test_3 = [180, 59, 58];
my $answer_3 = [180, 59, 58];
my $note_3 = "@$test_3 | @$answer_3 | 3. already reduced";
my $test_4 = [19, 0, 60];
my $answer_4 = [19, 1, 0];
my $note_4 = "@$test_4 | @$answer_4 | 4. test if single carry wo
+rks correctly";
my $test_5 = [179, 59, 60];
my $answer_5 = [180, 0, 0];
my $note_5 = "@$test_5 | @$answer_5 | 5. tests if multiple carry
+ works correctly";
my $test_6 = [-179, 60, 0];
my $answer_6 = [-178, 0, 0];
my $note_6 = "@$test_6 | @$answer_6 | 6. test addition with nega
+tives";
my $test_7 = [ 0, 0, -60];
my $answer_7 = [-1, 59, 0];
my $note_7 = "@$test_7 | @$answer_7 | 7. test negative borrow wo
+rks correctly";
my $test_8 = [90, 360, 360];
my $answer_8 = [96, 6, 0];
my $note_8 = "@$test_8 | @$answer_8 | 8. tests if multiple reduc
+e calls work correct";
sub main {
reduce( @ARGV );
}
# Degree Reduction Tests
# Need to pass array refs to is_deeply
#ok( &main() == $answer_2, $note_2 );
# From perl monks test code
# is_deeply [ reduce(@$ar_args) ], $ar_expected, $full_comment;
is_deeply [ reduce(@$test_3 ) ], $answer_3, $note_3 ;
+
is_deeply [ reduce(@$test_4 ) ], $answer_4, $note_4 ;
+
is_deeply [ reduce(@$test_5 ) ], $answer_5, $note_5 ;
+
is_deeply [ reduce(@$test_6 ) ], $answer_6, $note_6 ;
+
is_deeply [ reduce(@$test_7 ) ], $answer_7, $note_7 ;
+
is_deeply [ reduce(@$test_8 ) ], $answer_8, $note_8 ;
# Degree Subtraction Tests
# Degree Multiplication Tests
# Degree Division Tests
reduce.pl
#!/usr/bin/env/perl
use strict;
use warnings;
my ($a, $b, $c) = 0;
print "0. Value of ARGV is @ARGV; Value of magic array var is @_.\n";
# Take list of arguments from any of the 4 other subroutines
# In principle, should accept variable length arguments
# and recursively reduce the items in list from right to left.
#
# Termination: @angle has 1 length. This is pushed onto @answer array
+.
# Case 1: reduce negative number by adding 60 to it, and
# subtracting 1 from number on left.
# Case 2: reduce positive number >= 60 by subtracting 60 and
# adding 1 to number on left.
#
# NOTE 1: CHECK BRACKETS AROUND UNTIL LOOP! MAY NEED TO MOVE CLOSING
+BRACKET!
# NOTE 2: Add check to test for length of @angle array! Then it shou
+ld work.
# NOTE 3: Add elsif to test for case where $c is ok value but scalar(
+@angle) > 1.
# Just push value to answer array.
# NOTE 4: Does not handle multiples of 60 correctly. Likely scope is
+sue.
my @answer;
sub reduce {
# print "0. Value of magic array var is @_.\n";
my @angle = @_;
# @_ = undef;
my ($b, $c) = ($angle[-2], $angle[-1]); # reduce from end.
if ($c < 0 && scalar(@angle) > 1) {
until ($c >= 0 && $c < 60) {
$c += 60;
$b -= 1;
}
unshift(@answer, $c);
pop(@angle);
@angle[-1] = $b;
# Debug print statements
print "2. b = $b, c = $c\n";
print "2. Angle array is @angle.\n ";
print "2. Value of magic array var is @_.\n";
print "2. Values in answer array: @answer.\n";
####
&reduce(@angle);
} elsif ($c >= 60 && scalar(@angle) > 1 ) {
until ($c < 60 && $c >= 0) {
$c -= 60;
$b += 1;
}
unshift(@answer, $c);
pop(@angle);
@angle[-1] = $b;
# Debug print statements
print "3. b = $b, c = $c\n";
print "3. Angle array is @angle.\n ";
print "3. Value of magic array var is @_.\n";
print "3. Values in answer array: @answer.\n";
####
&reduce(@angle);
} elsif ( ($c >= 0 && $c < 60 ) && scalar(@angle) > 1) {
unshift(@answer, $c);
pop(@angle);
&reduce(@angle);
} else {
unshift(@answer, @angle);
print "Reduced answer: @answer \n";
return $answer[0], $answer[1], $answer[2];
}
}
main( @ARGV ) unless caller();
sub main {
reduce( @_ );
}
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.