in reply to Finding words within a character set
sampe run using the scrabble enable.txt dictionary#!/usr/local/bin/perl use strict vars; my ($w, $size, $entry, $eval, $cont, $line, $word); my (@combs, @word); my (%anagrams, %bysize, %combs); #read dictionary file my $file = shift; open(FILE, "$file") or die "cannot open file $file: $!\n"; print "reading dictionary...\n"; push( @{ $anagrams{join("", sort( split(//,$w) ) )} }, $w ) while( cho +mp($w = <FILE>) ); close(FILE); print "enter word and size(q to quit) "; chomp($cont = <STDIN>); while($cont !~ m/^q$/i) { %combs = @combs = %bysize = (); ($word, $size) = split(" ", $cont); if($size =~ m/^\d$/) { $eval = '$combs{$entry} = 1 if ($entry =~ m/^\w{' . $size . '} +$/ )'; } elsif($size =~ m/-/) { my ($fnum, $snum) = $size =~ m/(\d+)\s*-\s*(\d+)/; $eval = '$combs{$entry} = 1 if ($entry =~ m/^\w{' . $fnum . ', +' . $snum . '}$/)'; } elsif($size ne "") { $eval = '$combs{$entry} = 1 if length($entry)' . " $size"; } #find all combinations in word @word = split(//, $word); foreach (&combinations(@word)) { $entry = join("", sort(@$_)); if($size eq "") { $combs{$entry} = 1 if length($entry) > 0; } else { eval $eval; } } @combs = sort(keys %combs); # store each word in bysize hash arranged by size foreach (@combs) { push( @{ $bysize{ length($_) } }, @{ $anagrams{$_} } ) if @{ $ +anagrams{$_} }; } # print words &print_set(); print "enter word and size(q to quit) "; chomp($cont = <STDIN>); } sub print_set() { my ($key, $count, $total); my @words; foreach $key ( sort { $a <=> $b } keys %bysize ) { @words = sort( @{ $bysize{$key} } ); print "\nwords of size $key:\n"; $count = 0; foreach (@words) { $count++; print "$_ "; print "\n" if $count % 7 == 0; } $total += $count; print "\n"; } print "\ntotal words: $total\n"; print "\n\n"; } sub combinations() { return [] unless @_; my $first = shift; my @rest = combinations(@_); return @rest, map { [$first, @$_] } @rest; } exit;
The other things the fuller program does isD:\PerlProjects\anagram>anagram.pl enable.txt reading dictionary... enter word and size(q to quit) perlmonks 3-5 words of size 3: elk elm els ems ens eon ern ers ken kep kop kor kos lek lop mel men mol mon mop mor mos nom nor nos oes oke ole oms one ons ope ops ore ors ose pen per pes pol pom pro rem rep res roe rom sel sen ser sol son sop words of size 4: elks elms enol eons epos erns eros kelp kemp keno kens keps kern knop koel kops kore kors leks leno lens lone lope lops lore lorn lose mels meno merk merl moke mole mols monk mons mope mops more morn mors mosk noel noes nome noms nope norm nose okes oles omen omer ones open opes ores orle pens peon perk perm peso poem poke pole pols pome poms pone pons pore pork porn pose prom pros rems repo reps roes role romp roms rope rose skep sloe slop soke sole some sone sore sorn words of size 5: enols enorm enrol kelps kemps kenos kerns knops knosp koels krone lemon lenos loner loper lopes lores loser melon merks merls meson mokes moles monks moper mopes morel mores morns morse nerol noels nomes norms omens omers opens orles pelon peons perks perms plonk poems poker pokes poler poles pomes pones pores porks porns poser proem prole proms prone prose repos roles romps ropes senor skelm skelp slope smerk smoke snore sorel sperm spoke spore total words: 223 enter word and size(q to quit) q
|
|---|