File size: 4,090 Bytes
9c4964a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d9041f1
9c4964a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d9041f1
 
 
9c4964a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d9041f1
 
9c4964a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# Functions used to find the word in order of use
xy_positionsvec2 = []


def find_word (wordsearch, word):
	"""Trys to find word in wordsearch and prints result"""
	# Store first character positions in array
	start_pos = []
	first_char = word[0]
	for i in range(0, len(wordsearch)):
		for j in range(0, len(wordsearch[i])):
			if (checktilde(wordsearch[i][j],first_char) or wordsearch[i][j] == '?'):
				start_pos.append([i,j])
	# Check all starting positions for word
	for p in start_pos:
		found,xy_positionsvec = check_start(wordsearch, word, p)
		if found:
			# Word foundf
			return xy_positionsvec,True
	# Word not found
	#print(word, ' No encontrada')
	return xy_positionsvec,False

def check_start (wordsearch, word, start_pos):
	"""Checks if the word starts at the startPos. Returns True if word found"""
	directions = [[-1,1], [0,1], [1,1], [-1,0], [1,0], [-1,-1], [0,-1], [1,-1]]
	# Iterate through all directions and check each for the word
	for d in directions:
		found,xy_positionsvec = check_dir(wordsearch, word, start_pos, d)
		if (found):
			return True,xy_positionsvec
	return False,xy_positionsvec

def check_dir (wordsearch, word, start_pos, dir):
	"""Checks if the word is in a direction dir from the start_pos position in the wordsearch. Returns True and prints result if word found"""
	xy_positionsvec = []
	found_chars = [word[0]] # Characters found in direction. Already found the first character
	current_pos = start_pos # Position we are looking at
	pos = [start_pos] # Positions we have looked at
	while (chars_match(found_chars, word)):
		if (len(found_chars) == len(word)):
			# If found all characters and all characters found are correct, then word has been found
			#print('')
			#print(word, ' Encontrada en:')
			#print('')
			# Draw wordsearch on command line. Display found characters and '-' everywhere else
			index =1 
			for x in range(0, len(wordsearch)):
				line = ""
				for y in range(0, len(wordsearch[x])):
					is_pos = False
					for z in pos:
						if (z[0] == x) and (z[1] == y):
							is_pos = True
					if (is_pos):
						xy_positions = {}
						xy_positions['x'] = x
						xy_positions['y'] = y
						xy_positionsvec.append(xy_positions)
						if (wordsearch[x][y] == '?'):
							if (dir[1]*dir[0] == -1):
								line = line + " " + word[len(word)-index]
							else:
								line = line + " " + word[index-1]
						else:
							line = line + " " + wordsearch[x][y]
						index = index + 1
					else:
						line = line + " -"
		
				#print(line)
			#print('')
			return True, xy_positionsvec
		# Have not found enough letters so look at the next one
		current_pos = [current_pos[0] + dir[0], current_pos[1] + dir[1]]
		pos.append(current_pos)
		if (is_valid_index(wordsearch, current_pos[0], current_pos[1])):
			found_chars.append(wordsearch[current_pos[0]][current_pos[1]])
		else:
			# Reached edge of wordsearch and not found word

			return False, xy_positionsvec 

	return False, xy_positionsvec 			


def chars_match (found, word):
	"""Checks if the leters found are the start of the word we are looking for"""
	index = 0
	for i in found:
		if ( (not checktilde(i,word[index])) and i != '?'):
			return False
		index += 1
	return True

def is_valid_index (wordsearch, line_num, col_num):
	"""Checks if the provided line number and column number are valid"""
	if ((line_num >= 0) and (line_num < len(wordsearch))):
		if ((col_num >= 0) and (col_num < len(wordsearch[line_num]))):
			return True
	return False

def checktilde (word1, word2):
	if (word1 == word2):
		return True
	if ((word1 == 'A' or word1 == 'Á') and (word2 == 'A' or word2 == 'Á')):
		return True
	if ((word1 == 'E' or word1 == 'É') and (word2 == 'E' or word2 == 'É')):
		return True
	if ((word1 == 'I' or word1 == 'Í') and (word2 == 'I' or word2 == 'Í')):
		return True
	if ((word1 == 'O' or word1 == 'Ó') and (word2 == 'O' or word2 == 'Ó')):
		return True
	if ((word1 == 'U' or word1 == 'Ú') and (word2 == 'U' or word2 == 'Ú')):
		return True
	if ((word1 == 'Ñ' or word1 == 'N') and (word2 == 'N' or word2 == 'Ñ')):
		return True
	return False