3915 - anagrame cv

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 nu există două vocale alăturate și nici două consoane alăturate.

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 vocalele și consoanele alternează (nu există două vocale alăturate și nici două consoane alăturate).

Restricții și precizări

  • cuvântul s are cel mult 11 caractere și este format din litere mici distincte
  • dacă nu există soluții, atunci se va afișa mesajul IMPOSIBIL.

Exemplu:

Intrare

cosmina

Ieșire

caminos
camison
camonis
camosin
canimos
canisom
canomis
canosim
casimon
casinom
casomin
casonim
cimanos
cimason
cimonas
cimosan
cinamos
cinasom
cinomas
cinosam
...
sonimac
(în total 144 de anagrame)

Exemplu:

Intrare

cosmin

Ieșire

IMPOSIBIL

Exemplu:

Intrare

ana

consola

Cuvântul trebuie să aibă cel mult 11 litere mici distincte.

Rezolvare

def sunt_alternante(cuvant):
    # Verificăm dacă vocalele și consoanele alternează în cuvânt
    for i in range(1, len(cuvant)):
        if (cuvant[i-1] in 'aeiou' and cuvant[i] in 'aeiou') or (cuvant[i-1] not in 'aeiou' and cuvant[i] not in 'aeiou'):
            return False
    return True

def genereaza_anagrame_alternante(curent, ramase, rezultat):
    if not ramase:
        if sunt_alternante(curent):
            rezultat.append(curent)
        return

    for i in range(len(ramase)):
        genereaza_anagrame_alternante(curent + ramase[i], ramase[:i] + ramase[i+1:], rezultat)

def valideaza_cuvant(cuvant):
    # Verificăm restricțiile
    return 1 <= len(cuvant) <= 11 and len(set(cuvant)) == len(cuvant) and cuvant.islower()

def main():
    try:
        # Citim cuvântul de la tastatură
        cuvant = input("Introduceți un cuvânt: ")

        # Verificăm restricțiile utilizând funcția separată
        if not valideaza_cuvant(cuvant):
            print("Cuvântul trebuie să aibă cel mult 11 litere mici distincte.")
            return

        # Inițializăm o listă pentru a stoca anagramele rezultate
        anagrame = []

        # Generăm anagramele cuvântului în care vocalele și consoanele alternează
        genereaza_anagrame_alternante('', cuvant, anagrame)

        # Sortăm și afișăm anagramele sau afișăm mesajul IMPOSIBIL dacă nu există soluții
        if anagrame:
            for anagrama in sorted(anagrame):
                print(anagrama)
        else:
            print("IMPOSIBIL")

    except Exception as e:
        print(f"A intervenit o eroare: {e}")

if __name__ == "__main__":
    main()