A (deceptively tricky?) Python question
I am writing a Scrabble AI, and I want to handle blank tiles. Right now, I want to expand a string containing blank tiles into a list of strings composed of words created by all possible interpretations of the blanks.
So, "H_LLO" ==> ["HALLO", "HBLLO", ... "HZLLO"] (length is 26)
However, Scrabble has 2 blank tiles, so I can't just do a simple for loop and replace.
For example, "H_LL_" ==> ["HALLA", "HALLB", ... "HBLLA", ... "HZLLZ"] (length is 26x26 = 676)
What is the cleanest way to do this? The best I could come up with is the following, but I don't much like it:
import re
from itertools import product
w = "H_LL_"
expanded = []
product_args = list()
for _ in xrange(w.count("_")):
product_args.append( map(chr, range(65, 91)) )
for repl_str in product(*tuple(product_args)):
wtemp = w
for c in repl_str:
wtemp = re.sub('_', c, wtemp)
expanded.append(wtemp)
11 comments
[ 94.9 ms ] story [ 643 ms ] threadIf you want all possibilities, I might suggest wrapping it in a function that can lazily return the possibilities one by one as needed (see the yield keyword).
If you want only valid entries, you will probably want something more sophisticated (e.g. a search tree)
$ grep -i ^H.LL.$ /usr/share/dict/words
Maybe a similar method using the re module and then matching on your dictionary?
The reason is that internal Python operations are orders of magnitude faster than a looping construct where the loop is written in Python.
So I'd have a set for the allowed word list, generate a set of permutations and then ask Python for the intersection, rather than iterating through the permutations on the fly.
Another almost as trivial solution would be to have a string with two blanks and permute away !
So for your example, you start at the H node and follow all paths. Then follow the L path if it exists. Then follow the next L path. Then follow all paths from that node. Then check if the word has ended.