import random from collections import defaultdict from untitled import content, rules def generate_trait_sentence(traits): article = "An" if traits["size"][0] in "aeiou" else "A" description = f'{article} {traits["size"]} {traits["color"]} kitten with {traits["eyes"]} eyes who {traits["personality"]}' return description def generate_cat_choice(personality=None): size = random.choice(content.CAT_SIZES) color = random.choice(content.CAT_COLORS) eyes = random.choice(content.CAT_EYE_COLORS) personality = personality or random.choice(content.CAT_PERSONALITIES) traits = { "size": size, "color": color, "eyes": eyes, "personality": personality, } return generate_trait_sentence(traits), traits def generate_cat_choices(n=5): personalities = random.sample(content.CAT_PERSONALITIES, n) return [generate_cat_choice(p) for p in personalities] # NAME GEN MODEL def _pad_names_for_model(names): new_names = [] for name in names: new_names.append(f"<<{name}>") return new_names def _build_model(words): model = defaultdict(list) for word in words: for pos in range(len(word) - 2): model[word[pos] + word[pos + 1]].append(word[pos + 2]) return model def _make_name(model): result = "<<" while True: window = result[-2:] nxt = random.choice(model[window]) if nxt == ">": break result += nxt return result.removeprefix("<<") def generate_name(): while True: name = _make_name(_model) if ( any(c in "aeiou" for c in name.lower()) and len(name) <= 9 and rules.validate_cat_name(name) is None ): return name.capitalize() def _load_raw_names(): names = [] with open("untitled/assets/cat_names.txt") as f: for name in f.readlines(): names.append(name.strip()) return names _model = _build_model(_pad_names_for_model(_load_raw_names()))