Gee, after this, how can we NOT do this? :-)

Given an Array of Arrays of letters as $g = \@grid, with 'height' $h and width $w, and a word to look for in that grid as $p. All characters are in uppercase.

Find the perl golf solution that locates that word in the grid. The output should be an array; the first two items are the across and down positions in the grid, given the top-left corner is at 0,0; the remaining parameters may be one of the following (whichever makes the golf easist to solve - you only need to have the return in one of these formats, and assume the rest of the program can handle the format you choose):

. If the word cannot be found, the sub should return undef.

Example usage:

my @grid = ( [ split( //, 'ABPR' ) ], [ split( //, 'CAEL' ) ], [ split( //, 'TSRX' ) ], [ split( //, 'OILW' ) ] ); my $h = 4; my $w = 4; sub find { ... } my @results = find( \@grid, $w, $h, "PERL" ); # # @results can be: # ( 2, 0, 4 ) if using 1-8 numbers # ( 2, 0, 0, 1 ) if using direction # ( 2, 0, 2, 3 ) if using end point my @results = find( \@grid, $w, $h, "GOLD" ); # @results = ()

Update - Fixed order of width/height passage, and an error in one of the example.

-----------------------------------------------------
Dr. Michael K. Neylon - mneylon-pm@masemware.com || "You've left the lens cap of your mind on again, Pinky" - The Brain
It's not what you know, but knowing how to find it if you don't know that's important

Replies are listed 'Best First'.
Re: (Golf) Word Search Solver
by chipmunk (Parson) on Aug 30, 2001 at 00:54 UTC
    177 characters, returning (X-pos, Y-pos, X-dir, Y-dir):

    sub find { (*g,$w,$h,$_)=@_;@w=/./g;for$y(0..$h){for$x(0..$w){for$Y(-1..1){for$X( +-1..1){map$Y|$X&&($q=$y+$_*$Y)>=0&($p=$x+$_*$X)>=0&&$w[$_]eq$g[$q][$p +]||next,0..$#w;return$x,$y,$X,$Y}}}}$, }
Re: (Golf) Word Search Solver
by dragonchild (Archbishop) on Aug 29, 2001 at 21:30 UTC
    Of course, someone had to golf this! :)
    @w=pop=~/./g;($g,$a,$b)=@_;@s=(0,[-1,0],[-1,1],[0,1],[1,1],[1,0],[1,-1 +],[0,-1],[-1,-1]);sub t{my($D,$N,@C)=@_;@C=map{$C[$_]+$s[$D][$_]}(0,1 +);if(!($C[0]+1)||$C[0]==$a){0}elsif(!($C[1]+1)||$C[1]==$b){0}elsif($w +[$N]ne$g->[$C[0]][$C[1]]){0}elsif($N==$#w){1}else{t($D,$N+1,@C)}}for$ +x(0..$a-1){for$y(0..$b-1){next if($g->[$x][$y]ne$w[0]);for$d(1..8){re +turn($x,$y,$d)if t($d,1,$x,$y)}}}undef
    394 characters. I'm sure it can be reduced considerably, but it's a start. *groans at the thought of japhy or OeufMayo coming in at 126 characters on the next post*

    ------
    We are the carpenters and bricklayers of the Information Age.

    Vote paco for President!