/[symmetry-circle]/symmetry.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /symmetry.pl

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 4 by dpavlin, Sun Aug 26 10:59:01 2007 UTC revision 12 by dpavlin, Fri Aug 31 15:17:11 2007 UTC
# Line 30  my $debug = shift @ARGV || 0; Line 30  my $debug = shift @ARGV || 0;
30    
31  my @board = map { split(//) } split(/\n/, $board);  my @board = map { split(//) } split(/\n/, $board);
32  my @trace;  my @trace;
33    my @visited = (' ') x ($#board + 1);
34    
35  # line length  # line length
36  my $ll = 8 * 2 + 1;  my $ll = 8 * 2 + 1;
# Line 47  my $unknown = ' '; Line 48  my $unknown = ' ';
48  # path traversed  # path traversed
49  my @directions;  my @directions;
50    
51  my @found;  my @shapes_found;
52    
53    my @shapes_start = ( '0,0' ); #( qw/0,0 1,0 0,3/ );
54    
55  sub draw {  sub draw {
56          my $o = 0;          my $o = 0;
57          my $out;          my $out = "\n  " . join('',
58                    ('0 1 2 3 4 5 6 7 8 | ') x 3
59            ) . "\n";
60          while ( $o < $#board ) {          while ( $o < $#board ) {
61                    my $l = '|';
62                    if ( $o % ($ll*2) == 0) {
63                            my $y = int($o / ($ll*2));
64                            $out .= "$y ";
65                            $l = $y;
66                    } else {
67                            $out .= "  ";
68                    }
69    
70                  $out .= join('', @board[ $o .. $o + $ll - 1 ]);                  $out .= join('', @board[ $o .. $o + $ll - 1 ]);
71                  $out .= '   ';                  $out .= " $l ";
72                  $out .= join('', @trace[ $o .. $o + $ll - 1 ]);                  $out .= join('', @trace[ $o .. $o + $ll - 1 ]);
73                  $out .= "\n";                  $out .= " $l ";
74                    $out .= join('', @visited[ $o .. $o + $ll - 1 ]);
75                    $out .= " $l\n";
76                  $o += $ll;                  $o += $ll;
77          }          }
78    
79            $out .= "\n";
80    
81          return $out;          return $out;
82  }  }
83    
84  sub trace {  sub trace {
85          warn "## trace $pos\n";          warn "## trace $pos\n";
86          $trace[ $pos ] = $board[ $pos ];          $trace[ $pos ] = $board[ $pos ];
87            $visited[$pos]++;
88    }
89    
90    sub x_y {
91            my $p = shift;
92    
93            $p ||= $pos;
94    
95            my $y = int($p / ($ll*2));
96            my $x = int(($p % $ll) / 2);
97    
98            warn "## x_y($p) -> $x,$y\n";
99    
100    #       return ($x,$y) if wantarray;
101            return "$x,$y";
102  }  }
103    
104  sub move {  sub move {
         warn "move $step $step_name[$step]\n";  
105          $pos += $move_by[ $step ];          $pos += $move_by[ $step ];
106          trace;          trace;
107          $pos += $move_by[ $step ];          $pos += $move_by[ $step ];
108          trace;          trace;
109          push @directions, $step;          push @directions, $step;
110            warn "move $step $step_name[$step] to ", x_y, "\n";
111  }  }
112    
113  sub follow {  sub follow {
# Line 84  sub follow { Line 118  sub follow {
118    
119  my $ok_path = qr/[\|\-]/;  my $ok_path = qr/[\|\-]/;
120    
121    my @corners;
122    my $corners_usage;
123    
124  sub can_turn {  sub can_turn {
125          my $try_step = shift;          my $try_step = shift;
126          die "no step?" unless defined $try_step;          die "no step?" unless defined $try_step;
# Line 94  sub can_turn { Line 131  sub can_turn {
131    
132          my $old = $trace[ $turn_pos ];          my $old = $trace[ $turn_pos ];
133          $trace[ $turn_pos ] = '?';          $trace[ $turn_pos ] = '?';
134          warn "TEST\n",draw( @trace );          $trace[ $pos ] = '*';
135            warn "TEST ", x_y($turn_pos), "\n",draw;
136          $trace[ $turn_pos ] = $old;          $trace[ $turn_pos ] = $old;
137    
138          if ( $board[ $turn_pos ] =~ $ok_path ) {          if ( $board[ $turn_pos ] =~ $ok_path ) {
139                  warn "OK can_turn $try_step $step_name[$try_step] turn_pos = $turn_pos b($board[$turn_pos]) t($trace[$turn_pos])";                  my $xy = x_y($pos);
140                    warn "OK can_turn $try_step $step_name[$try_step] turn_pos = $turn_pos b($board[$turn_pos]) t($trace[$turn_pos]) from $xy\n";
141                  $step = $try_step;                  $step = $try_step;
142                    push @corners, $xy;
143                    $corners_usage->{$xy}++;
144                  return 1;                  return 1;
145          } else {          } else {
146                  warn "NOPE can_turn $try_step $step_name[$try_step] turn_pos = $turn_pos b($board[$turn_pos]) t($trace[$turn_pos])";                  warn "NOPE can_turn $try_step $step_name[$try_step] turn_pos = $turn_pos b($board[$turn_pos]) t($trace[$turn_pos])\n";
147                  return 0;                  return 0;
148          }          }
149  }  }
# Line 123  sub shape { Line 164  sub shape {
164    
165          $pos = $y * $ll * 2 + $x * 2;          $pos = $y * $ll * 2 + $x * 2;
166    
         warn "<<< shape from $x,$y pos: $pos\n";  
167          @trace = ($unknown) x ( $#board + 1 );          @trace = ($unknown) x ( $#board + 1 );
168          @directions = ();          @directions = ();
169            @corners = ();
170          trace;          trace;
171    
172          my $len = 0;          my $len = 0;
173            $step = 0;
174    
175            my $usage = $corners_usage->{"$x,$y"} || 0;
176    
177            warn "<<< shape from $x,$y [usage: $usage] pos: $pos\n";
178    
179            if ( $usage > 4 ) {
180                    warn "SKIPPED, usage > 4\n";
181                    return 0;
182            }
183    
184          while( 1 ) {          while( 1 ) {
185    
# Line 147  sub shape { Line 198  sub shape {
198                          warn "find line continuation from $step $step_name[$step]...\n";                          warn "find line continuation from $step $step_name[$step]...\n";
199                          can_turn( $step - 1 ) || can_turn( $step + 1 ) || die "can't find new direction";                          can_turn( $step - 1 ) || can_turn( $step + 1 ) || die "can't find new direction";
200                  }                  }
201                  warn draw( @trace );                  warn draw;
202    
203                  if ( $debug ) {                  if ( $debug ) {
204                          print "WAIT> press enter | ",show_directions; my $foo = <STDIN>;                          print "WAIT> press enter | ",show_directions; my $foo = <STDIN>;
205                  }                  }
206          }          }
207    
208          push @found, { x => $x, y => $y, len => $len, directions => show_directions };          push @shapes_found, { x => $x, y => $y, len => $len, directions => show_directions };
209    
210            warn "### corners: ",join(' ', map { $_ . " [" . $corners_usage->{$_} . "]" } @corners),"\n";
211          warn ">>> ended at $pos, line length: $len, directions traversed: ",show_directions,"\n";          warn ">>> ended at $pos, line length: $len, directions traversed: ",show_directions,"\n";
212    
213            foreach my $c ( @corners ) {
214                    if ( ! grep( /\Q$c\E/, @shapes_start ) ) {
215                            warn "INFO: added corner $c as shape start\n";
216                            push @shapes_start, $c;
217                    }
218            }
219    
220          print "WAIT> press enter"; my $foo = <STDIN>;          print "WAIT> press enter"; my $foo = <STDIN>;
221    
222          return $len;          return $len;
223  }  }
224    
225  my $shapes = '0,0 1,0 0,3';  foreach my $start ( @shapes_start ) {
226            my ($x,$y) = split(/,/,$start);
227            if ( $x < 8 && $y < 8 ) {
228                    my $len = shape( split(/,/,$start) );
229                    warn "## $start has $len elements\n";
230            } else {
231                    warn "SKIPPED $start\n";
232            }
233    }
234    
235    sub is_symmetric {
236            my $path = shift || die "no path?";
237    
238  foreach my $start ( split(/\s/,$shapes) ) {          my $h = length($path)/2;
239          my $len = shape( split(/,/,$start) );          return 0 if int($h) != $h;
240          warn "## $start has $len elements\n";          my ($l,$r) = ( substr($path,0,$h), substr($path,$h) );
241            $r =~ tr/lrud/rldu/;
242    #       warn "$l -- $r\n";
243            return 0 unless $l eq $r;
244            return 1;
245  }  }
246    
247  print ">>> RESULTS:\n";  print ">>> RESULTS:\n";
248  foreach my $r ( @found ) {  foreach my $r ( @shapes_found ) {
249          printf "%2d,%-2d len: %-4d directions: %s\n", $r->{x}, $r->{y}, $r->{len}, $r->{directions};          printf "%2d,%-2d len: %-4d directions: %s %s\n",
250            $r->{x}, $r->{y}, $r->{len},
251            is_symmetric($r->{directions}) ? 'OK' : '!!',
252            $r->{directions},
253            ;
254  }  }

Legend:
Removed from v.4  
changed lines
  Added in v.12

  ViewVC Help
Powered by ViewVC 1.1.26