# Solve Wordbrain puzzles
# Works for 2x2, 3x3, 4x4 and 5x5 puzzles
# By Karstein Kvistad @ phobic.no
# 2017
# Import libraries used
import json
import time
# Global variables
global start_time
# Import all dictionaries
wordDictStart = [0]
for i in range(1,10):
wordDictStart.append(json.loads(open('wordDictStart'+str(i)+'.txt').read()))
wordDict = json.loads(open('wordDict.txt').read())
def pathListToString(path):
#Converts a list - ['a','b','c'] - to a string - 'abc'
if path != None:
temp = ''
for item in path:
temp+=''.join(item)
pathString = ''.join([i for i in temp if not i.isdigit()])
return pathString
else:
return []
def filterPaths(newpaths):
if not newpaths == {}:
print('Newpaths: ' + str(len(newpaths[0])) + ' ' + str(newpaths))
#print('DEBUG: Newpath length: ' + str(len(newpath)))
if len(newpaths[0]) > 8:
print(str(len(newpaths[0])) + ' is longer than 8 - BREAK')
if not (len(newpaths[0]) == 4 or len(newpaths[0]) == 6 or len(newpaths[0]) == 7 or len(newpaths[0]) == 8):
print('NOT 4,6,7 or 8 - BREAK')
if newpaths[0][0]+newpaths[0][1]+newpaths[0][-2]+newpaths[0][-1] not in wordDict_secondfirstLast:
print('NOT in dict - BREAK')
return path
#DEBUG: l,m1,g,p,s1,a1,ø,n1,r1,b,r2,n2,a2,e1,u,d,s2,r3,e2,m2,e3,r4,e4,e5,s3
def find_all_paths_from_to(graph, start, end, path=[], dictPaths = {}):
path = path + [start]
if start == end:
return [path]
if start not in graph:
return []
paths = [] # Set as Return to fix to original
#print('DEBUG: dictPaths: ' + str(dictPaths))
#print('DEBUG: Path: ' + str(pathListToString(path))) # Print the actual word-paths found
if len(path) < 9:
for node in graph[start]:
if node not in path:
newpaths = find_all_paths_from_to(graph, node, end, path)
#if not (newpaths == {} or newpaths == []):
#print('DEBUG: newpaths[0]) - '+ str(newpaths[0]))
#print('DEBUG: newpaths - '+ str(newpaths))
if not (str(type(newpaths)) == "<class 'dict'>"): # Filters the {} which sometimes appear
if (len(pathListToString(newpaths[0])) > 1):
for newpath in newpaths:
# print('DEBUG: Newpath: ' + str(len(newpath)) + ' ' + pathListToString(newpath))
newPathString = pathListToString(newpath)
i=0
for i in range(1,10):
if (len(newPathString) == i) and (newPathString in wordDictStart[i]) and (newPathString in wordDict):
dictPaths.update({newPathString:newPathString})
#print('DEBUG: This word is plausible: ' + newPathString)
return dictPaths
def make2x2graph(pos1, pos2, pos3, pos4):
"""
Returns a tree as dictionary with startnode as key.
First value is same as startnode, and the rest is neighbour nodes
pos1 - pos2
| X |
pos3 - pos4
"""
return {pos1: [pos1, pos2, pos3, pos4],
pos2: [pos2, pos4, pos3, pos1],
pos3: [pos3, pos1, pos2, pos4],
pos4: [pos4, pos3, pos1, pos2]}
def make3x3graph(pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8, pos9):
"""
Returns a dictionary with startnode as key.
First value is same as startnode, and the rest is neighbour nodes
pos1 - pos2 - pos3
| X | X |
pos4 - pos5 - pos6
| X | X |
pos7 - pos8 - pos9
"""
return {pos1: [pos1, pos2, pos5, pos4],
pos2: [pos2, pos3, pos6, pos5, pos4, pos1],
pos3: [pos3, pos6, pos5, pos2],
pos4: [pos4, pos1, pos2, pos5, pos8, pos7],
pos5: [pos5, pos1, pos2, pos3, pos6, pos9, pos8, pos7, pos4],
pos6: [pos6, pos2, pos3, pos9, pos8, pos5],
pos7: [pos7, pos4, pos5, pos8],
pos8: [pos8, pos4, pos5, pos6, pos9, pos7],
pos9: [pos9, pos5, pos6, pos8]}
def make4x4graph(pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16):
"""
Returns a dictionary with startnode as key.
First value is same as startnode, and the rest is neighbour nodes
pos1 - pos2 - pos3 - pos4
| X | X | X |
pos5 - pos6 - pos7 - pos8
| X | X | X |
pos9 - pos10 - pos11 - pos12
| X | X | X |
pos13 - pos14 - pos15 - pos16
"""
return { pos1: [pos1, pos2, pos6, pos5],
pos2: [pos2, pos1, pos3, pos7, pos6, pos5],
pos3: [pos3, pos2, pos4, pos8, pos7, pos6],
pos4: [pos4, pos3, pos8, pos7],
pos5: [pos5, pos1, pos2, pos6, pos10, pos9],
pos6: [pos6, pos1, pos2, pos3, pos7, pos11, pos10, pos9, pos5],
pos7: [pos7, pos2, pos3, pos4, pos8, pos12, pos11, pos10, pos6],
pos8: [pos8, pos3, pos4, pos12, pos11, pos7],
pos9: [pos9, pos5, pos6, pos10, pos14, pos13],
pos10: [pos10, pos5, pos6, pos7, pos11, pos15, pos14, pos13, pos9],
pos11: [pos11, pos6, pos7, pos8, pos12, pos16, pos15, pos14, pos10],
pos12: [pos12, pos7, pos8, pos16, pos15, pos11],
pos13: [pos13, pos9, pos10, pos14],
pos14: [pos14, pos9, pos10, pos11, pos15, pos13],
pos15: [pos15, pos10, pos11, pos12, pos16, pos14],
pos16: [pos16, pos11, pos12, pos15]}
def make5x5graph(pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25):
"""
Returns a dictionary with startnode as key.
First value is same as startnode, and the rest is neighbour nodes
pos1 - pos2 - pos3 - pos4 - pos5
| X | X | X | X |
pos6 - pos7 - pos8 - pos9 - pos10
| X | X | X | X |
pos11 - pos12 - pos13 - pos14 - pos15
| X | X | X | X |
pos16 - pos17 - pos18 - pos19 - pos20
| X | X | X | X |
pos21 - pos22 - pos23 - pos24 - pos25
"""
return { pos1: [pos1, pos2, pos7, pos6],
pos2: [pos2, pos1, pos3, pos8, pos7, pos6],
pos3: [pos3, pos2, pos4, pos9, pos8, pos7],
pos4: [pos4, pos3, pos5, pos10, pos9, pos8],
pos5: [pos5, pos4, pos10, pos9],
pos6: [pos6, pos1, pos2, pos7, pos12, pos12],
pos7: [pos7, pos1, pos2, pos3, pos8, pos13, pos12, pos11, pos6],
pos8: [pos8, pos2, pos3, pos4, pos9, pos14, pos13, pos12, pos7],
pos9: [pos9, pos3, pos4, pos5, pos10, pos15, pos14, pos13, pos8],
pos10: [pos10, pos4, pos5, pos15, pos14, pos9],
pos11: [pos11, pos6, pos7, pos12, pos17, pos16],
pos12: [pos12, pos6, pos7, pos8, pos13, pos18, pos17, pos16, pos11],
pos13: [pos13, pos7, pos8, pos9, pos14, pos19, pos18, pos17, pos12],
pos14: [pos14, pos8, pos9, pos10, pos15, pos20, pos19, pos18, pos13],
pos15: [pos15, pos9, pos10, pos20, pos19, pos14],
pos16: [pos16, pos11, pos12, pos17, pos22, pos21],
pos17: [pos17, pos11, pos12, pos13, pos18, pos23],
pos18: [pos18, pos12, pos13, pos14, pos19, pos24, pos23, pos22, pos17],
pos19: [pos19, pos13, pos14, pos15, pos20, pos25, pos24, pos23, pos18],
pos20: [pos20, pos14, pos15, pos25, pos24, pos19],
pos21: [pos21, pos16, pos17, pos22],
pos22: [pos22, pos16, pos17, pos18, pos23, pos21],
pos23: [pos23, pos17, pos18, pos19, pos24, pos22],
pos24: [pos24, pos18, pos19, pos20, pos25, pos23],
pos25: [pos25, pos19, pos20, pos24]}
def makeEndPoints2x2(pos1, pos2, pos3, pos4):
"""
Possible endpoints from startpoint on 2x2
Get value with endpoints[key][item]
"""
return {pos1: [pos1, pos2, pos3, pos4],
pos2: [pos2, pos1, pos3, pos4],
pos3: [pos3, pos1, pos2, pos4],
pos4: [pos4, pos1, pos2, pos3]}
def makeEndPoints3x3(pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8, pos9):
"""
Possible endpoints from startpoint on 3x3
First value is Start node.
"""
return {pos1: [pos1,pos2,pos3,pos4,pos5,pos6,pos7,pos8,pos9],
pos2: [pos2,pos1,pos3,pos4,pos5,pos6,pos7,pos8,pos9],
pos3: [pos3,pos1,pos2,pos4,pos5,pos6,pos7,pos8,pos9],
pos4: [pos4,pos1,pos2,pos3,pos5,pos6,pos7,pos8,pos9],
pos5: [pos5,pos1,pos2,pos3,pos4,pos6,pos7,pos8,pos9],
pos6: [pos6,pos1,pos2,pos3,pos4,pos5,pos7,pos8,pos9],
pos7: [pos7,pos1,pos2,pos3,pos4,pos5,pos6,pos8,pos9],
pos8: [pos8,pos1,pos2,pos3,pos4,pos5,pos6,pos7,pos9],
pos9: [pos9,pos1,pos2,pos3,pos4,pos5,pos6,pos7,pos8]}
def makeEndPoints4x4(pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16):
"""
Possible endpoints from startpoint on 4x4
First value is Start node.
"""
return { pos1: [pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16],
pos2: [pos2, pos1, pos3, pos4, pos5, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16],
pos3: [pos3, pos1, pos2, pos4, pos5, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16],
pos4: [pos4, pos1, pos2, pos3, pos5, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16],
pos5: [pos5, pos1, pos2, pos3, pos4, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16],
pos6: [pos6, pos1, pos2, pos3, pos4, pos5, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16],
pos7: [pos7, pos1, pos2, pos3, pos4, pos5, pos6, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16],
pos8: [pos8, pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16],
pos9: [pos9, pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8, pos10, pos11, pos12, pos13, pos14, pos15, pos16],
pos10: [pos10, pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8, pos9, pos11, pos12, pos13, pos14, pos15, pos16],
pos11: [pos11, pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8, pos9, pos10, pos12, pos13, pos14, pos15, pos16],
pos12: [pos12, pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8, pos9, pos10, pos11, pos13, pos14, pos15, pos16],
pos13: [pos13, pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos14, pos15, pos16],
pos14: [pos14, pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos15, pos16],
pos15: [pos15, pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos16],
pos16: [pos16, pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15]}
def makeEndPoints5x5(pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25):
"""
Possible endpoints from startpoint on 5x5
First value is Start node.
"""
return { pos1: [pos1, pos2, pos3, pos4, pos5, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos2: [pos2, pos1, pos3, pos4, pos5, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos3: [pos3, pos2, pos1, pos4, pos5, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos4: [pos4, pos3, pos2, pos1, pos5, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos5: [pos5, pos4, pos3, pos2, pos1, pos6, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos6: [pos6, pos5, pos4, pos3, pos2, pos1, pos7, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos7: [pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos8, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos8: [pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos9, pos10, pos11, pos12, pos13, pos14, pos15, pos16, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos9: [pos9, pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos10, pos11, pos12, pos13, pos14, pos15, pos16, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos10: [pos10, pos9, pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos11, pos12, pos13, pos14, pos15, pos16, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos11: [pos11, pos10, pos9, pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos12, pos13, pos14, pos15, pos16, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos12: [pos12, pos11, pos10, pos9, pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos13, pos14, pos15, pos16, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos13: [pos13, pos12, pos11, pos10, pos9, pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos14, pos15, pos16, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos14: [pos14, pos13, pos12, pos11, pos10, pos9, pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos15, pos16, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos15: [pos15, pos14, pos13, pos12, pos11, pos10, pos9, pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos16, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos16: [pos16, pos15, pos14, pos13, pos12, pos11, pos10, pos9, pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos17, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos17: [pos17, pos16, pos15, pos14, pos13, pos12, pos11, pos10, pos9, pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos18, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos18: [pos18, pos17, pos16, pos15, pos14, pos13, pos12, pos11, pos10, pos9, pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos19, pos20, pos21, pos22, pos23, pos24, pos25],
pos19: [pos19, pos18, pos17, pos16, pos15, pos14, pos13, pos12, pos11, pos10, pos9, pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos20, pos21, pos22, pos23, pos24, pos25],
pos20: [pos20, pos19, pos18, pos17, pos16, pos15, pos14, pos13, pos12, pos11, pos10, pos9, pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos21, pos22, pos23, pos24, pos25],
pos21: [pos21, pos20, pos19, pos18, pos17, pos16, pos15, pos14, pos13, pos12, pos11, pos10, pos9, pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos22, pos23, pos24, pos25],
pos22: [pos22, pos21, pos20, pos19, pos18, pos17, pos16, pos15, pos14, pos13, pos12, pos11, pos10, pos9, pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos23, pos24, pos25],
pos23: [pos23, pos22, pos21, pos20, pos19, pos18, pos17, pos16, pos15, pos14, pos13, pos12, pos11, pos10, pos9, pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos24, pos25],
pos24: [pos24, pos23, pos22, pos21, pos20, pos19, pos18, pos17, pos16, pos15, pos14, pos13, pos12, pos11, pos10, pos9, pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1, pos25],
pos25: [pos25, pos24, pos23, pos22, pos21, pos20, pos19, pos18, pos17, pos16, pos15, pos14, pos13, pos12, pos11, pos10, pos9, pos8, pos7, pos6, pos5, pos4, pos3, pos2, pos1]}
def show2x2pathsPossible(endpoints2x2, twoGraph, start_time):
all_paths = {}
for item in endpoints2x2.values(): #Result: ['k1', 's', 'k2', 'o']
path_start_time = time.time()
#print(item)
# item1->item2, item1->item3, item1->item4
# i->i+1, i->i+2, i->i+3, i->i+len(item)-1
for i in range(1,len(item)):
pathsFound = (find_all_paths_from_to(twoGraph, item[0], item[i]))
end_time = time.time() - start_time
print('From: ' + str(item[0]) + ' to: ' + str(item[i]) + ' - Time used so far: ' + str(round(end_time, 3)))
#print(pathsFound)
all_paths.update(pathsFound)
return all_paths
def show3x3pathsPossible(endpoints3x3, threeGraph, start_time):
all_paths = {}
for item in endpoints3x3.values():
path_start_time = time.time()
for i in range(1,len(item)):
pathsFound = (find_all_paths_from_to(threeGraph, item[0], item[i]))
end_time = time.time() - start_time
print('From: ' + str(item[0]) + ' to: ' + str(item[i]) + ' - Time used so far: ' + str(round(end_time, 3)))
#print(pathsFound)
all_paths.update(pathsFound)
return all_paths
def show4x4pathsPossible(endpoints4x4, fourGraph, start_time):
all_paths = {}
for item in endpoints4x4.values():
path_start_time = time.time()
for i in range(1,len(item)):
pathsFound = (find_all_paths_from_to(fourGraph, item[0], item[i]))
end_time = time.time() - start_time
print('From: ' + str(item[0]) + ' to: ' + str(item[i]) + ' - Time used so far: ' + str(round(end_time, 3)))
all_paths.update(pathsFound)
#print(pathsFound)
return all_paths
def show5x5pathsPossible(endpoints5x5, fiveGraph, start_time):
all_paths = {}
for item in endpoints5x5.values():
path_start_time = time.time()
for i in range(1,len(item)):
pathsFound = (find_all_paths_from_to(fiveGraph, item[0], item[i]))
end_time = time.time() - start_time
print('From: ' + str(item[0]) + ' to: ' + str(item[i]) + ' - Time used so far: ' + str(round(end_time, 3)))
all_paths.update(pathsFound)
#print('DEBUG: all_paths: ' + str(all_paths) + ' pathsFound: ' + str(pathsFound))
return all_paths
def manualInput2x2(start_time, ch0, ch1, ch2, ch3):
letter = [{}]
for n in range(0,10):
letter.append({})
twoGraph = make2x2graph(ch0, ch1, ch2, ch3)
endpoints2x2 = makeEndPoints2x2(ch0, ch1, ch2, ch3)
possibleTwo = show2x2pathsPossible(endpoints2x2, twoGraph, start_time)
print('\n', 'Words in Wordlist:'), print(sorted(possibleTwo))
for words in possibleTwo.keys():
for i in range(2,10):
if len(words) == i:
letter[i].update({words:words})
print()
for i in range(2,10):
if not letter[i] == {}:
print(str(i)+'-letter words: ' + str(sorted(letter[i])))
def manualInput3x3(start_time, ch0, ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8):
# Input: e,n1,g,s,n2,r,t,o,u --> 'e','n1','g','s','n2','r','t','o','u'
letter = [{}]
for n in range(0,10):
letter.append({})
threeGraph = make3x3graph(ch0, ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8)
# Result: 'Startnode': ['neighbour1', 'neighbour2', 'neighbour3', 'neighbour4']
#{'e': ['e', 'n', 'n', 's'], 'n': ['n', 'e', 'n', 'g', 'r', 'u', 'o', 't', 's'],
# 'g': ['g', 'r', 'n', 'n'], 's': ['s', 'e', 'n', 'n', 'o', 't'],
# 'r': ['r', 'n', 'g', 'u', 'o', 'n'], 't': ['t', 's', 'n', 'o'],
# 'o': ['o', 's', 'n', 'r', 'u', 't'], 'u': ['u', 'n', 'r', 'o']}
endpoints3x3 = makeEndPoints3x3(ch0, ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8)
# Result: 'Startnode': ['endpoint1', 'endpoint2', 'endpoint3', 'endpoint1', '.......']
#{'e': ['e', 'n', 'g', 's', 'n', 'r', 't', 'o', 'u'], 'n': ['n', 'e', 'n', 'g', 's', 'r', 't', 'o', 'u'],
# 'g': ['g', 'e', 'n', 's', 'n', 'r', 't', 'o', 'u'], 's': ['s', 'e', 'n', 'g', 'n', 'r', 't', 'o', 'u'],
# 'r': ['r', 'e', 'n', 'g', 's', 'n', 't', 'o', 'u'], 't': ['t', 'e', 'n', 'g', 's', 'n', 'r', 'o', 'u'],
# 'o': ['o', 'e', 'n', 'g', 's', 'n', 'r', 't', 'u'], 'u': ['u', 'e', 'n', 'g', 's', 'n', 'r', 't', 'o']}
possibleThree = show3x3pathsPossible(endpoints3x3, threeGraph, start_time)
print('\n', 'Words in Wordlist:'), print(sorted(possibleThree))
for words in possibleThree.keys():
for i in range(2,10):
if len(words) == i:
letter[i].update({words:words})
print()
for i in range(2,10):
if not letter[i] == {}:
print(str(i)+'-letter words:')
print(str(sorted(letter[i]))), print()
def manualInput4x4(start_time, ch0, ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, ch9, ch10, ch11, ch12, ch13, ch14, ch15):
letter = [{}]
for n in range(0,10):
letter.append({})
fourGraph = make4x4graph(ch0, ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, ch9, ch10, ch11, ch12, ch13, ch14, ch15)
endpoints4x4 = makeEndPoints4x4(ch0, ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, ch9, ch10, ch11, ch12, ch13, ch14, ch15)
possibleFour = show4x4pathsPossible(endpoints4x4, fourGraph, start_time)
print('\n', 'Words in Wordlist:'), print(sorted(possibleFour))
for words in possibleFour.keys():
for i in range(2,10):
if len(words) == i:
letter[i].update({words:words})
print()
for i in range(2,10):
if not letter[i] == {}:
print(str(i)+'-letter words:')
print(str(sorted(letter[i]))), print()
def manualInput5x5(start_time, ch0, ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, ch9, ch10, ch11, ch12, ch13, ch14, ch15, ch16, ch17, ch18, ch19, ch20, ch21, ch22, ch23, ch24):
letter = [{}]
for n in range(0,10):
letter.append({})
fiveGraph = make5x5graph(ch0, ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, ch9, ch10, ch11, ch12, ch13, ch14, ch15, ch16, ch17, ch18, ch19, ch20, ch21, ch22, ch23, ch24)
endpoints5x5 = makeEndPoints5x5(ch0, ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, ch9, ch10, ch11, ch12, ch13, ch14, ch15, ch16, ch17, ch18, ch19, ch20, ch21, ch22, ch23, ch24)
possibleFive = show5x5pathsPossible(endpoints5x5, fiveGraph, start_time)
print('\n', 'Words in Wordlist:'), print(sorted(possibleFive))
for words in possibleFive.keys():
for i in range(2,10):
if len(words) == i:
letter[i].update({words:words})
print()
for i in range(2,10):
if not letter[i] == {}:
print(str(i)+'-letter words:')
print(str(sorted(letter[i]))), print()
def inputchar(wordDict):
char = []
print('Skriv inn dine bokstaver adskilt med *komma*:')
input_str = input('Legg til nummerering på like bokstaver (n1, r, n2...)' + '\n')
input_str = [x.strip() for x in input_str.split(',')] # Strip and divide by , and put in a list
print(input_str)
if len(input_str) == 4:
start_time = time.time()
manualInput2x2(start_time, input_str[0], input_str[1], input_str[2], input_str[3])
end_time = time.time() - start_time
print('\nTotal time used: '),print(round(end_time, 3)),print('\n')
input_str=''
if len(input_str) == 9:
start_time = time.time()
manualInput3x3(start_time, input_str[0], input_str[1], input_str[2], input_str[3], input_str[4],
input_str[5], input_str[6], input_str[7], input_str[8])
end_time = time.time() - start_time
print('\nTotal time used: '),print(round(end_time, 3)),print('\n')
input_str=''
if len(input_str) == 16:
print('Estimert tid er 40 sekunder.')
start_time = time.time()
manualInput4x4(start_time, input_str[0], input_str[1], input_str[2], input_str[3],
input_str[4], input_str[5], input_str[6], input_str[7],
input_str[8], input_str[9], input_str[10], input_str[11],
input_str[12], input_str[13], input_str[14], input_str[15])
end_time= time.time() - start_time
print('\nTotal time used: '),print(round(end_time, 3)),print('\n')
input_str=''
if len(input_str) == 25:
print('Estimert tid er 7 minutter.')
start_time = time.time()
manualInput5x5(start_time, input_str[0], input_str[1], input_str[2], input_str[3], input_str[4],
input_str[5], input_str[6], input_str[7], input_str[8], input_str[9],
input_str[10], input_str[11], input_str[12], input_str[13], input_str[14],
input_str[15], input_str[16], input_str[17], input_str[18], input_str[19],
input_str[20], input_str[21], input_str[22], input_str[23], input_str[24])
end_time = time.time() - start_time
print('\nTotal time used: '),print(round(end_time, 3)),print('\n')
input_str=''
# Run program
while True:
try:
inputchar(wordDict)
except ValueError:
print(),print('ERROR:')
print('+----------------------------------------------------------------------------+')
print('| Oops! Maybe you forgot to add numbering to same type letters. Try again... |')
print('| Example: k,å,k,r,e,l,k,e,m => k1,å,k2,r,e1,l,k,e2,m |')
print('+----------------------------------------------------------------------------+')
print()
#l,m1,g,p,s1,a1,ø,n,r1,b,r2,n,a2,e1,u,d,s2,r3,e2,m2,e3,r4,e4,e5,s3