--- symmetry.pl 2007/08/26 14:15:26 6 +++ symmetry.pl 2007/08/26 14:45:26 7 @@ -87,54 +87,15 @@ $visited[$pos]++; } -my ( $tr_x, $tr_y ); -my ( $bl_x, $bl_y ); - sub x_y { my $p = shift; - my $update = 0; - if ( ! defined( $p ) ) { - $p = $pos; - $update = 1; - } + $p ||= $pos; my $y = int($p / ($ll*2)); my $x = int(($p % $ll) / 2); - warn "??? x_y($p) $x,$y tr: $tr_x,$tr_y bl: $bl_x,$bl_y\n"; - - if ( $update ) { - -# $tr_x = $x if $x > $tr_x && $y == $tr_y; -# $tr_y = $y if $y < $tr_y && $x == $tr_x; - - if ( - $y < $tr_y - || - $y <= $tr_y && $x > $tr_x - ) { - ( $tr_x, $tr_y ) = ( $x, $y ); - warn "## UPDATED tr: $tr_x,$tr_y\n"; - } - - if ( - $x < $bl_x - || - $y > $bl_y - ) { - ( $bl_x, $bl_y ) = ( $x, $y ); - warn "## UPDATED bl: $bl_x,$bl_y\n"; - } - -# $bl_x = $x if $x < $bl_x; # && $y == $bl_y; -# $bl_y = $y if $y > $bl_y; # && $x == $bl_x; - - } - - warn "## x_y($p) -> $x,$y ", - $update ? " tr: $tr_x,$tr_y bl: $bl_x,$bl_y" : '', - "\n"; + warn "## x_y($p) -> $x,$y\n"; # return ($x,$y) if wantarray; return "$x,$y"; @@ -157,6 +118,8 @@ my $ok_path = qr/[\|\-]/; +my @corners; + sub can_turn { my $try_step = shift; die "no step?" unless defined $try_step; @@ -172,8 +135,10 @@ $trace[ $turn_pos ] = $old; if ( $board[ $turn_pos ] =~ $ok_path ) { - warn "OK can_turn $try_step $step_name[$try_step] turn_pos = $turn_pos b($board[$turn_pos]) t($trace[$turn_pos])\n"; + my $xy = x_y($turn_pos); + warn "OK can_turn $try_step $step_name[$try_step] turn_pos = $turn_pos b($board[$turn_pos]) t($trace[$turn_pos]) to $xy\n"; $step = $try_step; + push @corners, $xy; return 1; } else { warn "NOPE can_turn $try_step $step_name[$try_step] turn_pos = $turn_pos b($board[$turn_pos]) t($trace[$turn_pos])\n"; @@ -199,18 +164,12 @@ @trace = ($unknown) x ( $#board + 1 ); @directions = (); + @corners = (); trace; my $len = 0; - ( $tr_x, $tr_y ) = ( $x,$y ); - ( $bl_x, $bl_y ) = ( $x,$y ); $step = 0; - if ( $visited[$pos] > 3 ) { - warn "*** shape from $x,$y pos: $pos iterated 4 times, skipping\n"; - return; - } - warn "<<< shape from $x,$y pos: $pos\n"; while( 1 ) { @@ -232,8 +191,6 @@ } warn draw; - warn "## tr: $tr_x,$tr_y bl: $bl_x,$bl_y\n"; - if ( $debug ) { print "WAIT> press enter | ",show_directions; my $foo = ; } @@ -241,18 +198,14 @@ push @shapes_found, { x => $x, y => $y, len => $len, directions => show_directions }; - my $tr = "$tr_x,$tr_y"; - my $bl = "$bl_x,$bl_y"; + warn "### corners: ",join(' ', @corners),"\n"; + warn ">>> ended at $pos, line length: $len, directions traversed: ",show_directions,"\n"; - warn ">>> ended at $pos, line length: $len, directions traversed: ",show_directions," tr: $tr bl: $bl\n"; - - if ( ! grep( /\Q$tr\E/, @shapes_start ) && $tr_x < 8 ) { - warn "INFO: added $tr top-right\n"; - push @shapes_start, $tr; - } - if ( ! grep( /\Q$bl\E/, @shapes_start ) && $bl_y < 8 ) { - warn "INFO: added $bl bottom-left\n"; - push @shapes_start, $bl; + foreach my $c ( @corners ) { + if ( ! grep( /\Q$c\E/, @shapes_start ) ) { + warn "INFO: added corner $c as shape start\n"; + push @shapes_start, $c; + } } print "WAIT> press enter"; my $foo = ; @@ -261,8 +214,13 @@ } foreach my $start ( @shapes_start ) { - my $len = shape( split(/,/,$start) ); - warn "## $start has $len elements\n"; + my ($x,$y) = split(/,/,$start); + if ( $x < 8 && $y < 8 ) { + my $len = shape( split(/,/,$start) ); + warn "## $start has $len elements\n"; + } else { + warn "SKIPPED $start\n"; + } } print ">>> RESULTS:\n";