RedEnginePress logo
RedEnginePress
AlgorithmsLanguagesPlaygroundAbout

Anagram

P
from __future__ import annotations

import collections
import pprint
from pathlib import Path


def signature(word: str) -> str:
    """
    Return a word's frequency-based signature.

    >>> signature("test")
    'e1s1t2'
    >>> signature("this is a test")
    ' 3a1e1h1i2s3t3'
    >>> signature("finaltest")
    'a1e1f1i1l1n1s1t2'
    """
    frequencies = collections.Counter(word)
    return "".join(
        f"{char}{frequency}" for char, frequency in sorted(frequencies.items())
    )


def anagram(my_word: str) -> list[str]:
    """
    Return every anagram of the given word from the dictionary.

    >>> anagram('test')
    ['sett', 'stet', 'test']
    >>> anagram('this is a test')
    []
    >>> anagram('final')
    ['final']
    """
    return word_by_signature[signature(my_word)]


data: str = Path(__file__).parent.joinpath("words.txt").read_text(encoding="utf-8")
word_list = sorted({word.strip().lower() for word in data.splitlines()})

word_by_signature = collections.defaultdict(list)
for word in word_list:
    word_by_signature[signature(word)].append(word)

if __name__ == "__main__":
    all_anagrams = {word: anagram(word) for word in word_list if len(anagram(word)) > 1}

    with open("anagrams.txt", "w") as file:
        file.write("all_anagrams = \n")
        file.write(pprint.pformat(all_anagrams))