Algorithm-Search

 view release on metacpan or  search on metacpan

t/ws.t  view on Meta::CPAN

#!/usr/bin/perl
#Copyright 2008 Arthur S Goldstein
#word search
use Test::More tests => 1;

  package words;

  our %word_list;
  our $tree = {};

my $count = 0;
#  my $dictionary = "/Users/arthurgoldstein/downloads/TWL06.txt";
  my $dictionary = "t/wsdict";
  my $fh;
  open $fh, "<", $dictionary;
  while (my $word = <$fh>) {
    $word = uc $word;
    $word =~ s/[^A-Z]//g;
    $word_list{$word}=1;
    my @letters = split //,$word;
    my $add_to_tree = $tree;
    foreach my $letter (@letters) {
#print STDERR "Letter $letter\n";
      $add_to_tree->{$letter} = $add_to_tree->{$letter} || {};
      $add_to_tree = $add_to_tree->{$letter};
    }
#print STDERR "end of word $word\n";
  }
  close $fh;
#use Data::Dumper;
#print STDERR Dumper($tree)."\n";
#print STDERR "is AD a word?  ";
#print STDERR $word_list{'AD'};
#print STDERR "\n";

#exit;
#  print STDERR "Word count ".scalar(keys %word_list);
  sub new {return bless {}}

  sub set_position {
    my $self = shift;
    my ($row, $column, $board) = @_;
#print STDERR "board is $board\n";
    $self->{row} = $row;
    $self->{column} = $column;
    $self->{tree} = $tree;
    my @rows = split (" ", $board);
    my $row_count = 0;
    foreach my $row_in (@rows) {
      my $column_count = 0;
      foreach my $letter (split (//,$row_in)) {
        $self->{board}->[$row_count]->[$column_count++] = $letter;
      }
      $self->{max_column} = $column_count-1;
      $row_count++;
    }
    $self->{max_row} = $row_count-1;
#print STDERR "max row set to ".$self->{max_row}."\n";
#print STDERR "row is $row and col is $column\n";
    my $letter = $self->{board}->[$self->{row}]->[$self->{column}];
    $self->{chosen}->[$self->{row}]->[$self->{column}]++;
    $self->{tree} = $self->{tree}->{$letter};
    $self->{word} = $letter;
  }

  sub value {
    my $self = shift;
    return $self->{row}.' '.$self->{column};
  }

  sub move {
    my $self = shift;
    my $direction = shift;
    if ($direction eq 'U' || $direction eq 'UL' || $direction eq 'UR') {
      if ($self->{row} == 0) {
#print STDERR "cannot move up\n";
         return}
      $self->{row}--;
    }
    if ($direction eq 'D' || $direction eq 'DL' || $direction eq 'DR') {
      if ($self->{row} == $self->{max_row}) {
#print STDERR "cannot move down\n";
         return}
      $self->{row}++;
    }
    if ($direction eq 'L' || $direction eq 'UL' || $direction eq 'DL') {
      if ($self->{column} == 0) {
#print STDERR "cannot move left\n";
         return}
      $self->{column}--;



( run in 0.731 second using v1.01-cache-2.11-cpan-39bf76dae61 )