3155 - anagrame4

De la Universitas MediaWiki

Cerința

Se citește de la tastatură un cuvânt s format din cel mult 11 litere mici distincte. Să se genereze în ordine alfabetică și să se afișeze toate anagramele cuvântului s în care consoanele sunt puncte fixe.

Date de intrare

Programul citește de la tastatură cuvântul s.

Date de ieșire

Programul va afișa pe ecran pe rânduri separate anagramele cuvântului citit în care consoanele rămân pe pozițiile inițiale.

Restricții și precizări

  • cuvântul s are cel mult 11 caractere și este format din litere mici distincte

Exemplu 1

Intrare

sorina

Iesire

sarino
saroni
sirano
sirona
sorani
sorina

Rezolvare

import itertools

def read_input():
    return input().strip()

def write_output(anagrams):
    for anagram in anagrams:
        print(anagram)

def generate_anagrams(word):
    vowels = 'aeiou'
    vowel_positions = [(i, char) for i, char in enumerate(word) if char in vowels]
    fixed_positions = [(i, char) for i, char in enumerate(word) if char not in vowels]
    
    if not vowel_positions:
        return [word]
    
    vowel_chars = [char for _, char in vowel_positions]
    vowel_permutations = sorted(set(itertools.permutations(vowel_chars)))
    
    anagrams = []
    for perm in vowel_permutations:
        perm_word = list(word)
        for (i, _), char in zip(vowel_positions, perm):
            perm_word[i] = char
        anagrams.append("".join(perm_word))
    
    return anagrams

def main():
    word = read_input()
    
    if not (1 <= len(word) <= 11):
        raise ValueError("Cuvântul trebuie să aibă între 1 și 11 caractere.")
    if not all(char.islower() and char.isalpha() for char in word):
        raise ValueError("Cuvântul trebuie să fie format doar din litere mici distincte.")
    
    anagrams = generate_anagrams(word)
    write_output(anagrams)

if __name__ == '__main__':
    main()