mypy clean!
[python_utils.git] / unscrambler.py
index 05f810a225ccf88b5e0232669179170fc6978b33..d9e4253e4cd77165fae6c4962d5957d74b619d9c 100644 (file)
@@ -121,10 +121,7 @@ class Unscrambler(object):
 
     # 52 bits
     @staticmethod
-    def _compute_word_fingerprint(
-            word: str,
-            population: Mapping[str, int]
-    ) -> int:
+    def _compute_word_fingerprint(word: str, population: Mapping[str, int]) -> int:
         fp = 0
         for pair in sorted(population.items(), key=lambda x: x[1], reverse=True):
             letter = pair[0]
@@ -140,9 +137,9 @@ class Unscrambler(object):
     # 32 bits
     @staticmethod
     def _compute_word_letter_sig(
-            letter_sigs: Mapping[str, int],
-            word: str,
-            population: Mapping[str, int],
+        letter_sigs: Mapping[str, int],
+        word: str,
+        population: Mapping[str, int],
     ) -> int:
         sig = 0
         for pair in sorted(population.items(), key=lambda x: x[1], reverse=True):
@@ -201,7 +198,7 @@ class Unscrambler(object):
         unless you want to populate the same exact files.
 
         """
-        words_by_sigs = {}
+        words_by_sigs: Dict[int, str] = {}
         seen = set()
         with open(dictfile, "r") as f:
             for word in f:
@@ -221,29 +218,19 @@ class Unscrambler(object):
                 word = words_by_sigs[sig]
                 print(f'0x{sig:x}+{word}', file=f)
 
-    def lookup(
-            self,
-            word: str,
-            *,
-            include_fuzzy_matches: bool = False
-    ) -> Dict[str, bool]:
+    def lookup(self, word: str, *, window_size: int = 5) -> Dict[str, bool]:
         """Looks up a potentially scrambled word optionally including near
         "fuzzy" matches.
 
         >>> u = Unscrambler()
-        >>> u.lookup('eanycleocipd', include_fuzzy_matches=False)
+        >>> u.lookup('eanycleocipd', window_size=0)
         {'encyclopedia': True}
 
         """
         sig = Unscrambler.compute_word_sig(word)
-        return self.lookup_by_sig(sig, include_fuzzy_matches=include_fuzzy_matches)
-
-    def lookup_by_sig(
-            self,
-            sig: int,
-            *,
-            include_fuzzy_matches:bool = False
-    ) -> Dict[str, bool]:
+        return self.lookup_by_sig(sig, window_size=window_size)
+
+    def lookup_by_sig(self, sig: int, *, window_size: int = 5) -> Dict[str, bool]:
         """Looks up a word that has already been translated into a signature by
         a previous call to Unscrambler.compute_word_sig.  Optionally returns
         near "fuzzy" matches.
@@ -253,23 +240,23 @@ class Unscrambler(object):
         18491949645300288339
 
         >>> u = Unscrambler()
-        >>> u.lookup_by_sig(sig, include_fuzzy_matches=True)
+        >>> u.lookup_by_sig(sig)
         {'pupigerous': False, 'pupigenous': False, 'unpurposing': False, 'superpurgation': False, 'unsupporting': False, 'superseptuaginarian': True, 'purpurogallin': False, 'scuppaug': False, 'purpurigenous': False, 'purpurogenous': False, 'proppage': False}
 
         """
         ret = {}
         (exact, location) = list_utils.binary_search(self.sigs, sig)
-        start = location - 5
+        start = location - window_size
         if start < 0:
             start = 0
-        end = location + 6
+        end = location + 1 + window_size
         if end > len(self.words):
             end = len(self.words)
 
         for x in range(start, end):
             word = self.words[x]
             fsig = self.sigs[x]
-            if include_fuzzy_matches is True or (fsig == sig):
+            if window_size > 0 or (fsig == sig):
                 ret[word] = fsig == sig
         return ret