use strict;
#===== Copyright 2008, Webpraxis Consulting Ltd. - ALL RIGHTS RESERVED - Email: webpraxis@gmail.com ============================
# __turtle.pl: Trek a turtle around a checkerboard.
#===============================================================================================================================
# 0) INITIALIZE:
my $No_Rows	= 8;
my $No_Cols	= 8;
my %Turtle	= (	HEADING	=> 'S', 															#place turtle at top left corner, pointing south
				X		=> 0,
				Y		=> 0
			  );

my @Tracks;																					#array for recording turtle's locations
my $No_Consecutive_Turns;																	#number of consecutive left turns by turtle
#-------------------------------------------------------------------------------------------------------------------------------
# 1) PUT TURTLE IN MOTION:
$Tracks[$Turtle{X}][$Turtle{Y}] = 1; 														#record turtle's initial location
until( $No_Consecutive_Turns == 4 ) {														#repeat
	if( &noTracksAhead() and &noBoundaryAhead() ) {											# if next step forward is permitted
		&stepForward();																		#  move forward one step
	} else {																				# else
		&turnLeft();																		#  turn left
	}																						# end if-else
}																							#until complete spin around
exit;
#===== SUBROUTINES =============================================================================================================
sub noTracksAhead {
	if   ( $Turtle{HEADING} eq 'S' ) { return !$Tracks[$Turtle{X}][$Turtle{Y}+1]; }
	elsif( $Turtle{HEADING} eq 'N' ) { return !$Tracks[$Turtle{X}][$Turtle{Y}-1]; }
	elsif( $Turtle{HEADING} eq 'E' ) { return !$Tracks[$Turtle{X}+1][$Turtle{Y}]; }
	elsif( $Turtle{HEADING} eq 'W' ) { return !$Tracks[$Turtle{X}-1][$Turtle{Y}]; }
}
sub noBoundaryAhead {
	if   ( $Turtle{HEADING} eq 'S' ) { return $Turtle{Y} + 1 <  $No_Rows; }
	elsif( $Turtle{HEADING} eq 'N' ) { return $Turtle{Y} - 1 >= 0;        }
	elsif( $Turtle{HEADING} eq 'E' ) { return $Turtle{X} + 1 <  $No_Cols; }
	elsif( $Turtle{HEADING} eq 'W' ) { return $Turtle{X} - 1 >= 0;        }
}
sub stepForward {
	if   ( $Turtle{HEADING} eq 'S' ) { ++$Turtle{Y}; }
	elsif( $Turtle{HEADING} eq 'N' ) { --$Turtle{Y}; }
	elsif( $Turtle{HEADING} eq 'E' ) { ++$Turtle{X}; }
	elsif( $Turtle{HEADING} eq 'W' ) { --$Turtle{X}; }
	$Tracks[$Turtle{X}][$Turtle{Y}] = 1;													# update turtle's accessed locations
	$No_Consecutive_Turns			= 0;													# reset the turn count
	print "stepForward: $Turtle{X}, $Turtle{Y}\n";
}
sub turnLeft {
	$Turtle{HEADING} =~ tr/NSEW/WENS/;														# set new heading
	++$No_Consecutive_Turns;																# increment the turn count
	print "turnLeft: $Turtle{HEADING}\n";
}
#===== Copyright 2008, Webpraxis Consulting Ltd. - ALL RIGHTS RESERVED - Email: webpraxis@gmail.com ============================
# end of __turtle.pl

