Skip to content

Commit 44aa761

Browse files
committed
Latest version
1 parent 5ba8b2e commit 44aa761

File tree

1 file changed

+34
-9
lines changed

1 file changed

+34
-9
lines changed

wssolve.py

+34-9
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,16 @@
1414
import readline
1515
import atexit
1616
from wsutils import Pattern, Catalog
17+
from time import perf_counter_ns
18+
19+
#---------------------------------------------------------------------------
20+
def tictocDo(func, name, *args, **kwargs):
21+
tic = perf_counter_ns()
22+
retval = func(*args, **kwargs)
23+
toc = perf_counter_ns()
24+
duration = (toc - tic) / 10**9
25+
print(f"{name:<42} took {duration:>2.4f}S")
26+
return retval
1727

1828
#---------------------------------------------------------------------------
1929
class Letters:
@@ -103,7 +113,7 @@ def _bits(cls, letters):
103113

104114
#---------------------------------------------------------------------------
105115
class Cipher:
106-
def __init__(self, crypted, decrypted=""):
116+
def __init__(self, crypted, decrypted="", noLetterToItself=False):
107117
self.map = {}
108118
processed = set()
109119
for cipherLetter, plainLetter in zip_longest(crypted, decrypted):
@@ -112,7 +122,10 @@ def __init__(self, crypted, decrypted=""):
112122
self.map[cipherLetter] = Letters(plainLetter)
113123
processed.add(cipherLetter)
114124
else:
115-
self.map[cipherLetter] = Letters.all()
125+
letters = Letters.all()
126+
if noLetterToItself:
127+
letters.unset(cipherLetter)
128+
self.map[cipherLetter] = letters
116129
if decrypted:
117130
self.reduce()
118131

@@ -277,7 +290,11 @@ def sharedLetters(self, word2):
277290
shared = self.cryptedLetters & word2.cryptedLetters
278291
return "".join(sorted(shared))
279292

280-
293+
#---------------------------------------------------------------------------
294+
#class SolveAttempt:
295+
# def __init__(self, words):
296+
# self.words = words
297+
#
281298
#---------------------------------------------------------------------------
282299
class Solver:
283300
def __init__(self, catalog, crypted, known):
@@ -289,7 +306,8 @@ def __init__(self, catalog, crypted, known):
289306
self.cat = catalog
290307
self.cryptedWords = cryptedWords
291308
self.words = [Word(word) for word in uniqueWords]
292-
self.cipher = Cipher(cryptedLetters, knownLetters)
309+
self.cipher = Cipher(cryptedLetters, knownLetters,
310+
noLetterToItself=True)
293311
self.root = None
294312
self.unlinked = []
295313

@@ -348,17 +366,24 @@ def prepare(self):
348366
word.guesses = self.cat.words(word.pattern, glob)
349367
self.cipher.process(word.crypted, word.guesses)
350368
words = deque(sorted(self.words, key=attrgetter("count")))
369+
bestSort = (len(words)+1, [])
351370
for n in range(len(words)):
352371
self._buildTree(words)
353-
# try for no more than 2 unlinked words
354-
if len(self.unlinked) < 3:
372+
unlinkedCount = len(self.unlinked)
373+
if unlinkedCount == 0:
355374
break
375+
elif unlinkedCount < bestSort[0]:
376+
bestSort = (unlinkedCount, deque(words))
377+
# try for no more than 2 unlinked words
378+
#if len(self.unlinked) < 3:
379+
# break
356380
for word in words:
357381
word.links = []
358382
words.rotate(-1)
359383
else:
360384
# back at the beginning
361-
self._buildTree(self.words)
385+
self._buildTree(bestSort[1])
386+
#self._buildTree(self.words)
362387

363388
def _buildTree(self, words):
364389
others = list(words)
@@ -436,7 +461,7 @@ def filter(self):
436461
for word in self.words
437462
if word.count))
438463
numReductions = self.cipher.reduce()
439-
#print("Reduced {} possibles in go {}".format(numReductions, go))
464+
print("Reduced {} cipher possibles in go {}".format(numReductions, go))
440465
else:
441466
numReductions = 0
442467
if numReductions:
@@ -618,7 +643,7 @@ def main():
618643
known = cleanInput("Enter any known letters: ")
619644
with closing(Catalog(path)) as cat:
620645
solver = Solver(cat, cryptogram, known)
621-
solver.solve()
646+
tictocDo(solver.solve, "solver.solve")
622647
solver.print()
623648

624649
def cleanInput(prompt):

0 commit comments

Comments
 (0)