In [7]:
#Ordina alfabeticamente le lettere di una parola
def ordina_lettere(parola):
    lista = list(parola)        
    lista.sort()    
    parola_ordinata = "".join(lista)    
    return parola_ordinata
#Controlla se le due parole sono una l'anagramma dell'altra
def anagramma(parola1, parola2):
    parola2 = ordina_lettere(parola2)
    parola1 = ordina_lettere(parola1)
    if parola1 == parola2:
        return True
    return False
#controlla se parola2 è parola1 con l'aggiunta di una lettera, o se parola1 è parola2 senza una lettera
def aggiunta_tolta(parola1, parola2):
    for i in range(len(parola2)):
        temp = parola2[0:i] + parola2[i+1:len(parola2)]
        if parola1 == temp: 
            return True
    return False
#Controlla se tra le due parole cambia solo una lettera
def lettera_cambiata(parola1, parola2):
    conta = 0
    if len(parola1) != len(parola2) : 
        return False    
    for i in range(len(parola1)):
        if parola1[i] != parola2[i] : 
            conta = conta + 1             
    if conta == 1 : 
        return True            
    return False
#Controlla se parola2 è derivabile da parola1 con le regole del gioco
def is_next(parola1, parola2):
    temp = lettera_cambiata(parola1, parola2)  + aggiunta_tolta(parola1, parola2)  + aggiunta_tolta(parola2, parola1)
    temp = temp + anagramma(parola1, parola2)    
    if temp == 1 :
        return True    
    return False
#Restituisce ila prima stringa nella lista parole derivabile da parola 
def next_word(parole, parola):
    for x in parole:
        if is_next(parola, x):
            return x
    return False
#Toglie parola dalla lista parole
def escludi(parole, parola):
    nuove_parole = []
    for x in parole:
        if x != parola:
            nuove_parole = nuove_parole + [x]

    return nuove_parole

In [8]:
#restituisce la lista parole ordinata secondo le regole del gioco
def ordina(parole):    
    finito = False
    start = parole[0]
    parole = escludi(parole, start)
    parole_ordinate = [] + [start]
    while not(finito):
        prossima = next_word(parole, parole_ordinate[len(parole_ordinate)-1] )
        parole_ordinate = parole_ordinate + [prossima]
        parole = escludi(parole, prossima)
        if (next_word(parole, parole_ordinate[len(parole_ordinate)-1] ) == False) :
            finito = True          
    
    
    return parole_ordinate

In [12]:
def gioco(input_file, output_file):
    fh = open(input_file).read()
    parole = fh.split("\n")
    parole = parole[0:len(parole)-1]
    parole_ord = ordina(parole)
    fh = open(output_file, "w").write( "\n".join(parole_ord) )
    return True

In [13]:
gioco("input.txt", "output.txt")

#parole_ordinate = ordina(parole)
#parole_ordinate


Out[13]:
True

In [ ]: