Coding_for_Crosswords_in_Py.../a.py

120 lines
3.2 KiB
Python
Raw Normal View History

def ToUpper(s):
return s.upper()
## ----------------------------------------------------------------------------
##-Words
class Words:
def __init__(self):
self.word = []
## ----------------------------------------------------------------------------
##-Library
2021-07-16 19:17:37 +02:00
class Library:
def __init__(self):
# master vector of word
self.words_ = Words()
self.counts_ = {}
# hash table
self.word_map_ = {}
# Returns NULL if can't find any matches to the given pattern
def FindWord(self, s):
print(list(key for key, values in self.word_map_.items() if s in values))
def IsWord(self, s):
return s in self.word_map_
2021-07-16 19:17:37 +02:00
def ComputeStats(self):
# assert self.counts == {}
for i in range(18):
self.counts_[i] = []
for s in self.words_:
_len = len(s.word)
2021-07-16 19:17:37 +02:00
if _len <= 18:
self.counts_[_len-1].append(_len)
2021-07-16 19:17:37 +02:00
def PrintStats(self):
print("Here are the counts of each word length")
for k,v in self.counts_.items():
2021-07-16 19:17:37 +02:00
# print(v)
if k != 0:
print(f"[{k}] {len(v)}")
def GetWord(self, i):
assert (i >= 0 and i < len(self.words_))
return self.words_[i]
2021-07-16 19:17:37 +02:00
def CreatePatternHash(self, w):
len_w = len(w)
num_patterns = 1 << len_w
# print(f"PATTERN HASH on {w}")
self.word_map_[w] = []
for i in range(num_patterns):
# print(f" {i}")
tmp = list(w)
for j in range(len_w):
if ((i >> j) & 1):
tmp[j] = "-"
# print(f' {"".join(tmp)}')
self.word_map_[w].append("".join(tmp))
2021-07-16 19:17:37 +02:00
def ReadFromFile(self, filename):
with open(filename, 'r') as f:
for line in f:
line = ToUpper(line.rstrip())
self.words_.word.append(line)
self.CreatePatternHash(line)
print(f"Read {len(self.words_.word)} words from file '{filename}'")
def DebugBuckets(self):
2021-07-27 17:32:26 +02:00
for i, (k,v) in enumerate(self.word_map_.items()):
print(f"[{i}] {len(v)}")# {self.word_map_[i]}")
2021-07-16 19:17:37 +02:00
2021-07-14 21:10:44 +02:00
class Grid:
def __init__(self, n):
self.name = n
self.lines = []
def rows(self):
return len(self.lines)
def cols(self):
if self.lines == []:
return 0
else:
return len(self.lines[0])
2021-07-15 17:45:54 +02:00
def LoadFromFile(self, filename):
with open(filename, 'r') as f:
for line in f:
#print(f"{line.rstrip()} ({len(line.rstrip())})")
if not line.startswith('#'):
self.lines.append(list(line.rstrip()))
2021-07-14 21:10:44 +02:00
def Check(self):
for s in self.lines:
assert len(s) == self.cols()
def Print(self):
print(f"Grid: {self.name} "
f"(rows={self.rows()},"
f" cols={self.cols()})")
for s in self.lines:
print(f" {''.join(s)}")
2021-07-11 19:11:55 +02:00
if __name__ == "__main__":
2021-07-16 19:17:37 +02:00
lib = Library()
lib.ReadFromFile("top_12000.txt")
lib.FindWord("D--")
2021-07-14 21:10:44 +02:00
2021-07-16 19:17:37 +02:00
# grid = Grid("MY GRID")
# grid.LoadFromFile("test")
# grid.Check()
# grid.Print()