in reply to Re: Knight's Tour Problem in Perl
in thread Knight's Tour Problem in Perl

Actually hardly any of the OP's lines were more than one line. However, processing the OP code through Perl tidy and with a little hand tidying (including adding strictures and some blank lines) the code is still only 62 lines long:

use strict; use warnings; print "\nUse: SIZE START_X START_Y [0,1]" and exit if @ARGV < 4; my ($N, $X0, $Y0, $VERBOSE) = @ARGV; my $MOVES = 0; my @moves = ([-2, -1], [-1, -2], [-2, 1], [-1, 2], [2, -1], [1, -2], [ +2, 1], [1, 2]); my @board; my $last_move = [$X0, $Y0] and inform_board (); $last_move = inform_board ($last_move) while $MOVES < $N * $N; sub init { return ($_[0] > $N / 2) ? init ($N - 1 - $_[0], $_[1]) : ( $_[1] > $N / 2 ? init ($_[0], $N - 1 - $_[1]) : ( $_[0] >= 2 && $_[1] >= 2 ? 8 : ( ($_[0] >= 2 && $_[1] == 1 || $_[1] >= 2 && $_[0] == +1) ? 6 : ($_[0] + $_[1] > 1 ? 4 : ($_[0] + $_[1] == 1 ? 3 : 2 +))) ) ); } sub inRange { my ($pos, $D) = @_; my ($x, $y) = ($pos->[0] + $D->[0], $pos->[1] + $D->[1]); return ($x >= 0 && $x < $N && $y >= 0 && $y < $N && $board[$x][$y] + >= 0) ? [$x, $y] : 0; } sub inform_board { my ($moved_to) = @_; if ($moved_to) { $MOVES++; print "\n$MOVES.$moved_to->[0], $moved_to->[1]" if $VERBOSE; my ($MIN, $next_to_move) = (10, []); foreach (@moves) { if (my $finalPos = inRange ($moved_to, $_)) { my $value_ref = \$board[$finalPos->[0]][$finalPos->[1] +]; ($MIN, $next_to_move, $board[$moved_to->[0]][$moved_to +->[1]]) = ($$value_ref, $finalPos, 0) if (--$$value_ref >= 0 && $$value_ref < $MIN); } } return $next_to_move; } else { push @board, [(0) x $N] for (1 .. $N); for my $i (0 .. $N - 1) { $board[$i][$_] = init ($i, $_) for 0 .. $N - 1; } } }

Perl's payment curve coincides with its learning curve.