obfuscated
nobull
<a href="http://reg.ru/">reg.ru</a> sponsors of YAPC::EU::2013 set <a href="http://contest.reg.ru/">this challenge</a> based on the game of Go:
<blockquote>
<ol>
<li> Problems are given for a Go training board with the size of 9×9.
<li> Black moves first.
<li> There are no stones already captured on the board.
</ol>
<p>Input: nine lines which represent the playing board are sent to STDIN.
Lines consist of spaces (for vacant points on the board), "w" symbols (for white stones) and "b" symbols (black stones) and end with the new line symbol ("\n").
<p>Output: сoordinates (row and column numbers separated with a space, counted from one) of points, a move to which results in the capture of white stones. Results must be sent to STDOUT, one point per line. Results must contain all the possible moves on the board which would lead to the capture of white stones. Points are to be output in the order of their position on the board (left to right, top to bottom).
</blockquote>
<p>This is my first attempt at Perl-golf and (because BooK wasn't here this year) I actually won with 205 characters. (Woo hoo!)
<code>
#!perl
$b=++$/x11 .<>;for$i(9..99){if(($x=$b)=~s/^(.{$i}) /$1x/s){while($x=~/w/g){$_="$`W$'";1while
s/w((?<=W.{10})|(?<=W.)|(?=.{9}W|W))/W/s;/W((?<= .{10})|(?<= .)|(?=.{9} | ))/s||$i=~/./+(print"$& $'\n")+last}}}
</code>
Or with comments and whitespace
<code>
#!perl
$b = ++$/ x 11 . <>; # $/='1' (not present in input). Slurp STDIN.
# Prepend '11111111111' so top left is at 11.
# Leave the "\n" in to act as border and make
# rows 10 so linear pos is also row/col.
for $i (9..99) { # Scan all possible cells (including border).
if( ($x=$b) =~ s/^(.{$i}) /$1x/s ) { # If cell is ' ' place 'x' in a copy of board.
while( $x=~/w/g ) { # Consider each 'w' in turn and
$_ = "$`W$'"; # copy board highighing that 'w' as 'W'.
1 while # Until you run out,
s/w((?<=W.{10})|(?<=W.)|(?=.{9}W|W))/W/s; # highlight a neighbouring 'w'.
/W((?<= .{10})|(?<= .)|(?=.{9} | ))/s # Find a 'W' neighbouring a ' '.
|| # If there is no such peg we have captured.
$i=~/./ + # Split row number out of cell number.
(print"$& $'\n") + # Print row and colunm.
last # Advance to next possible cell.
}
}
}
</code>
<p>Improvements from the Monks welcome.