# read in file, make circuit ... use Data::Dumper; # 012345678901 <--(i)--> # 0 B+.....1.... # | 1 - . # (j) 2 . . # | 3 . . # 4 .........2.. open (CIRC, "circ.txt"); $cnt = 0; $i = 0; $j = 0; $on_cap = undef; while () { # put elements of circuit into m-d array last if $_ =~ /=+/; chomp; $i = 0; for $char (split //, $_) { push @{$Circ->[$i++][$j]}, $char } $j++; } $i = 1; $j = 0; if ($Circ->[0][0][0] eq 'B' && $Circ->[1][0][0] eq '+' && $Circ->[0][1][0] eq '-') { $Circ->[0][0][0] = '.'; $Circ->[1][0][0] = '.'; $Circ->[0][1][0] = '.'; } else { die "malconfigured circuit" } $on_i = $i; $on_j = $j; &make_circ ($i,$j); sub make_circ { # count caps, make sure > 1 for $x (0..scalar @$Circ-1) { for $y (0..scalar @{$Circ->[$x]}-1) { if ($Circ->[$x][$y][0] =~ /\d/) { $cnt++ } } } goto END if $cnt <= 1; $cnt = 0; $i = $_[0]; $j = $_[1]; goto END if $ignore[$i][$j]; $looked_at[$i][$j] = 1; Iter ($i,$j); END: } sub Iter { $i = $_[0]; $j = $_[1]; $val = LookAt ($i,$j); if ($val == 0) { if ($j-1 > 0) { Iter ($i,$j-1) unless $looked_at[$i][$j-1] } if ($j+1 < scalar @{$Circ->[$i]}-1) { Iter ($i,$j+1) unless $looked_at[$i][$j+1]} if ($i-1 > 0) { Iter ($i-1,$j) unless $looked_at[$i-1][$j] } if ($i+1 < scalar @$Circ-1) { Iter ($i+1,$j) unless $looked_at[$i+1][$j] } } elsif ($val == 1) { $ignore[$i][$j] = 1; } else { for $idx (0..$#looked_at) { for (0..scalar @{$looked_at[$idx]}-1) { $looked_at[$idx][$_] = 0; } } } if (defined $on_cap) { for $id (@{$circuit->[$on_cap][0]}) { if (defined $id) { $circuit->[$id][0] = $on_cap } } # when done with Cid, replace with '.' $Circ->[$on_i][$on_j] = ['.']; $on_cap = undef; make_circ ($i,$j); } } sub LookAt { $l_i = $_[0]; $l_j = $_[1]; $cell = $Circ->[$l_i][$l_j]; if ($cell->[0] eq '.') { $ret = 0 } elsif ($cell->[0] =~ /(\d)/) { if (defined $on_cap) { push @{$circuit->[$on_cap][0]}, $1; $ret = 2 } else { $on_cap = $1; $on_i = $l_i; $on_j = $l_j; $ret = 0; } } else { $ret = 1 } return $ret; } # AND THE FILE # CIRC.TXT B+.....1.... - . . . . . .........2.. ============ 1:5 2:6