boggle word check hopefully fixed

master
Stefan Krulj 14 years ago
parent db854ba720
commit dee01dc1df
  1. 73
      modules/active/boggle.py
  2. 27
      testcases/test_boggle.py

@ -30,7 +30,7 @@ DICE.append(['N','O','O','T','U','W'])
DICE.append(['O','O','O','T','T','U']) DICE.append(['O','O','O','T','T','U'])
bog_kern = [[-1,-1], [-1, 0], [-1, 1], bog_kern = [[-1,-1], [-1, 0], [-1, 1],
[ 0,-1] , [ 0, 1], [ 0,-1], [ 0, 0], [ 0, 1],
[ 1,-1], [ 1, 0], [ 1, 1]] [ 1,-1], [ 1, 0], [ 1, 1]]
bog_current = None bog_current = None
@ -135,39 +135,29 @@ def bog_verify(msgs, bog):
ret = []; ret = [];
# TODO migrate to creation of bog_current import sys
bog_pad = [[""]*7]
for i in range(5):
t = [""];
t.extend(bog[i])
t.append("")
bog_pad.append(t)
bog_pad.append([""]*7)
for m in msgs: for m in msgs:
if len(m)<=1: if len(m)<=1:
continue continue
first = m[0].upper() first = m[0].upper()
# loop through bog, if first letter == m[0] then checkmachine # loop through bog, if first letter == m[0] then checkmachine
pos_r = pos_l = -1; pos_r = pos_l = 0;
for r in bog: for r in bog:
pos_r += 1 pos_l = 0
pos_l = -1
for l in r: for l in r:
pos_l += 1 valid = False
if bog[pos_r][pos_l].upper() == first: if bog[pos_r][pos_l].upper() == first:
valid = check_valid(m[ 1:], bog_pad, [[pos_r+1,pos_l+1]]) valid = check_valid(m[1:], bog, [[pos_r,pos_l]])
if(valid):
ret.append(m)
elif bog[pos_r][pos_l].upper() == first+"U": elif bog[pos_r][pos_l].upper() == first+"U":
valid = check_valid(m[ 1:], bog_pad, [[pos_r+1,pos_l+1]]) valid = check_valid(m[1:], bog, [[pos_r,pos_l]])
if m[1].upper()=="U": if m[1].upper()=="U":
valid = valid or check_valid(m[ 2:], bog_pad, [[pos_r+1,pos_l+1]]) valid = valid or check_valid(m[ 2:], bog, [[pos_r,pos_l]])
if(valid): if(valid):
ret.append(m) ret.append(m)
pos_l += 1
pos_r += 1
return list(set(ret)) return list(set(ret))
@ -180,26 +170,29 @@ def check_valid(m, bog, path):
first = m[0].upper() first = m[0].upper()
valid = False
for k in bog_kern: for k in bog_kern:
if ( ( bog[pos[0] + k[0]][pos[1]+k[1]].upper() == first) or \ try:
( bog[pos[0] + k[0]][pos[1]+k[1]].upper() == first+"U") ) and \ if ( ( bog[pos[0] + k[0]][pos[1]+k[1]].upper() == first) or \
( [pos[0] + k[0], pos[1]+k[1]] not in path) : ( bog[pos[0] + k[0]][pos[1]+k[1]].upper() == first+"U") ):
if [pos[0] + k[0], pos[1]+k[1]] in path:
continue
if(len(m) == 1 ):
valid = True
else:
cpath = list(path)
cpath.append([pos[0] + k[0],pos[1] + k[1]])
if check_valid(m[1:], bog, cpath):
valid = True
elif first == "Q":
valid = valid or check_valid(m[ 1:], bog, cpath )
if m[1].upper()=="U":
valid = valid or check_valid(m[ 2:], bog, cpath)
except IndexError:
pass
if(len(m) == len(first) ): return valid
return True
else:
cpath = path
cpath.append([pos[0] + k[0],pos[1] + k[1]])
if check_valid(m[1:], bog, cpath):
return True
elif first == "Q":
valid = check_valid(m[ 1:], bog_pad, cpath )
if m[1].upper()=="U":
valid = valid or check_valid(m[ 2:], bog_pad, cpath )
return valid
return False
def count_points(words): def count_points(words):
count = 0; count = 0;

@ -0,0 +1,27 @@
#!/usr/bin/python
import os, sys
cwd = os.getcwd()
sys.path.append(os.path.join(cwd,"..","modules","active"))
sys.path.append(os.path.join(cwd,"..","sys",))
import boggle
print "test 1",
t1=[['F', 'E', 'D', 'Qu', 'T'],
['L', 'C', 'N', 'E', 'E'],
['E', 'O', 'N', 'L', 'F'],
['A', 'T', 'L', 'R', 'I'],
['F', 'Y', 'E', 'S', 'R']]
w1 = ['sir', 'rise', 'not', 'lone', 'toe', 'tea', 'fat', 'queen', 'lot', 'leaf', 'cone', 'teen','qee']
ans = boggle.bog_verify(w1,t1)
ans.sort()
w1.sort()
i=0
for w in ans:
assert w==w1[i]
i+=1
print "passed"
Loading…
Cancel
Save