head	1.1;
access;
symbols;
locks
	mjd:1.1; strict;
comment	@# @;


1.1
date	2004.05.31.03.14.55;	author mjd;	state Exp;
branches;
next	;


desc
@@


1.1
log
@Initial revision
@
text
@#!/usr/bin/perl
#
# Hangman

my ($dict, $wrong_guesses) = @@ARGV;
defined($wrong_guesses) or usage();

chomp(my @@dict = grep !/[^a-z\n]/, qx{cat $dict});
@@dict or usage();

my $wordlen = 0;
{ my @@n;
  for my $word (@@dict) {
    $n[length $word]++;
  } 
  my $maxct = 0;
  for (0..$#n) { 
    if ($maxct < $n[$_]) {
      $wordlen = $_;
      $maxct = $n[$_];
    }
  }
}      
@@dict = grep length($_) == $wordlen, @@dict;

my $display = "_" x $wordlen;

my %guessed;
while ($wrong_guesses > 0) {
  print "\t$display\n";
  chomp(my $guess = <STDIN>);
  last unless $guess =~ /^[a-z]$/;
  redo if $guessed{$guess}++;
  $wrong_guesses -= select_worst($guess, \@@dict, \$display);
  unless ($display =~ /_/) {
    print "\tLIFE!\n";
    exit;
  }
}
print "\tDEATH!\n";
print "My word was '$dict[0]'.\n";
print "Loser.\n";

# return 0 if this was a correct guess, 1 if it was a wrong guess
# modify dictionary and display appropriately.
sub select_worst {
  my ($let, $dict, $disp) = @@_;
  my %d;
  for my $word (@@$dict) {
    my $key = $word;
    $key =~ s/[^$let]/_/g;
    push @@{$d{$key}}, $word;
  }
  my ($n, $loc) = (0, "");
  for my $k (keys %d) {
    if (@@{$d{$k}} > $n) {
      $loc = $k; $n = @@{$d{$k}};
    }
  }
  @@$dict = @@{$d{$loc}};
  for my $pos (0 .. length($disp)-1) {
    next if substr($$disp, $pos, 1) ne "_";
    substr($$disp, $pos, 1) = $let if substr($loc, $pos, 1) ne "_";
  }
  return $loc !~ /$let/;
}


@
