#!/usr/bin/perl

if (2 != scalar @ARGV) {
  print STDERR "Usage: search.pl <words> <grid>\n";
  exit;
}

$word_file = $ARGV[0];
$grid_file = $ARGV[1];

open WORDS, "<$word_file";
@wordlist = <WORDS>;
close WORDS;
chomp @wordlist;

open GRID, "<$grid_file";
@grid = <GRID>;
close GRID;
chomp @grid;

$width = length ($grid[0]);
foreach (@grid) {
  $width = length $_ if (length $_ > $width);
}
foreach (@grid) {
  $_ .= ' 'x($width - length $_);
}

$height = scalar (@grid);

#make the grids.

print STDERR "Making subsidiary grids...\n";

###############################
@egrid = @grid;
###############################
@wgrid = @grid;
foreach (@wgrid) {
  $_ = reverse $_;
}
###############################
@sgrid = ();
foreach $row (1..$height) {
  foreach $col (1..$width) {
    $sgrid[$col-1] .= substr($grid[$row-1],$col-1,1);
  }
}
###############################
@ngrid = @sgrid;
foreach (@ngrid) {
  $_ = reverse $_;
}
###############################
@segrid = ();
foreach $row (1..$height) {
  foreach $col (1..$width) {
    $segrid[$width-1-$col+$row] 
       .= substr($grid[$row-1],$col-1,1);
  }
}
###############################
@nwgrid = @segrid;
foreach (@nwgrid) {
  $_ = reverse $_;
}
###############################
@swgrid = ();
foreach $row (1..$height) {
  foreach $col (1..$width) {
    $swgrid[$col+$row-1] 
       .= substr($grid[$row-1],$col-1,1);
  }
}
###############################
@negrid = @swgrid;
foreach (@negrid) {
  $_ = reverse $_;
}
###############################

$wordsfound = 0;
$insfound = 0;

print STDERR "Subsidiary grids made.\n";
print STDERR "Dr Row Col Text\n";
# across.
foreach $word (@wordlist) {
  $instancesfound = 0;

   $word =~ s/[^A-Za-z]//g;

  foreach $row (0..$#egrid) {
    $rowtext = $egrid[$row];
    if ($rowtext =~ /^(.*)$word/i) {
      printf " E %3d %3d %s\n", 
      ($row+1), 
      ((length $1) + 1), 
      $word;
      ++$instancesfound;
    }
  }

  foreach $row (0..$#wgrid) {
    $rowtext = $wgrid[$row];
    if ($rowtext =~ /^(.*)$word/i) {
      printf " W %3d %3d %s\n", 
      ($row+1), 
      ($width - (length $1)), 
      $word;
      ++$instancesfound;
    }
  }

  foreach $row (0..$#sgrid) {
    $rowtext = $sgrid[$row];
    if ($rowtext =~ /^(.*)$word/i) {
      printf " S %3d %3d %s\n", 
      ((length $1) + 1), 
      ($row+1), 
      $word;
      ++$instancesfound;
    }
  }

  foreach $row (0..$#ngrid) {
    $rowtext = $ngrid[$row];
    if ($rowtext =~ /^(.*)$word/i) {
      printf " N %3d %3d %s\n", 
      ($height - (length $1)), 
      ($row+1), 
      $word;
      ++$instancesfound;
    }
  }

  foreach $row (0..$#segrid) {
    $rowtext = $segrid[$row];
    if ($rowtext =~ /^(.*)$word/i) {
      $a = length $1;
      printf "SE %3d %3d %s\n", 
      ($row < $width) ? ($a + 1) : ($row+$a-$width+2),
      ($row < $width) ? ($width-$row+$a) : ($a + 1), 
      $word;
      ++$instancesfound;
    }
  }

  foreach $row (0..$#nwgrid) {
    $rowtext = $nwgrid[$row];
    if ($rowtext =~ /^(.*)$word/i) {
      $a = length ($rowtext) - 1 - length $1;
      printf "NW %3d %3d %s\n", 
      ($row < $width) ? ($a + 1) : ($row+$a-$width+2),
      ($row < $width) ? ($width-$row+$a) : ($a + 1), 
      $word;
      ++$instancesfound;
    }
  }

  foreach $row (0..$#swgrid) {
    $rowtext = $swgrid[$row];
    if ($rowtext =~ /^(.*)$word/i) {
      $a = length $1;
      printf "SW %3d %3d %s\n", 
      ($row < $width) ? ($a + 1) : ($row+$a-1),
      ($row < $width) ? ($row-$a) : ($width-$a), 
      $word;
      ++$instancesfound;
    }
  }

  foreach $row (0..$#negrid) {
    $rowtext = $negrid[$row]; 
    if ($rowtext =~ /^(.*)$word/i) {
      $a = length ($rowtext) - 1 - length $1;
      printf "NE %3d %3d %s\n", 
      ($row < $width) ? ($a + 1) : ($row+$a-1),
      ($row < $width) ? ($row-$a) : ($width-$a), 
      $word;
      ++$instancesfound;
    }
  }

  $wordsfound += ($instancesfound > 0) ? 1 : 0;
  $insfound += $instancesfound;

}
print STDERR "$wordsfound words found.\n";
print STDERR "$insfound instances found.\n";
