X-Git-Url: https://wannabe.guru.org/gitweb/?a=blobdiff_plain;f=unscrambler.py;h=8fcd65d4e3ef732bc529cd15f3d3de1fa13dede2;hb=4c8cd8d958afa46eafceda7a7295e31bfd884a8c;hp=3abb6d817a633147382d0ac82fea37cf4450e816;hpb=36fea7f15ed17150691b5b3ead75450e575229ef;p=python_utils.git diff --git a/unscrambler.py b/unscrambler.py index 3abb6d8..8fcd65d 100644 --- a/unscrambler.py +++ b/unscrambler.py @@ -121,13 +121,9 @@ 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 - ): + for pair in sorted(population.items(), key=lambda x: x[1], reverse=True): letter = pair[0] if letter in fprint_feature_bit: count = pair[1] @@ -146,9 +142,7 @@ class Unscrambler(object): population: Mapping[str, int], ) -> int: sig = 0 - for pair in sorted( - population.items(), key=lambda x: x[1], reverse=True - ): + for pair in sorted(population.items(), key=lambda x: x[1], reverse=True): letter = pair[0] if letter not in letter_sigs: continue @@ -189,9 +183,7 @@ class Unscrambler(object): """ population = list_utils.population_counts(word) fprint = Unscrambler._compute_word_fingerprint(word, population) - letter_sig = Unscrambler._compute_word_letter_sig( - letter_sigs, word, population - ) + letter_sig = Unscrambler._compute_word_letter_sig(letter_sigs, word, population) assert fprint & letter_sig == 0 sig = fprint | letter_sig return sig @@ -226,25 +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 - ) + return self.lookup_by_sig(sig, window_size=window_size) - def lookup_by_sig( - self, sig: int, *, include_fuzzy_matches: bool = False - ) -> Dict[str, bool]: + 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. @@ -254,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