Rostálunk

Arra jutottunk tehát, hogy ha egy szót már korábban előállítottunk (ha már szerepel a fában, ha előfordul a listánkban), akkor azt ne illesszük be az eddigiek után.

Két kézenfekvő lehetőség is kínálkozik ennek megvalósítására.

Az egyik az, hogy az egyes szabályoknál külön-külön vizsgáljuk, hogy az újonnan előállított szót megkaptuk-e már korábban, s ha igen, akkor eldobjuk azt – ez azt jelenti, hogy négy helyen kell ugyanúgy kiegészíteni a programunkat, amivel valószínűleg nehezebben olvashatóvá válik (de hatékonyabb lehet).

A másik az, hogy a négy függvény minden újonnan előállítható szót visszaad, s ezeket a (rész)eredményeket egységesen vizsgáljuk: a felesleges szavakat elvetjük, a többit beillesztjük a lista végére – így a program olvashatóbb, de várhatóan kevésbé hatékony lesz.

Mi most a második utat választjuk – annál is inkább, mert hamarosan a másikat is kipróbáljuk…

def rule1(list, i):
    word= list[i]
    if word[-1]=='I':
        return [ word+'U' ]
    else:
        return []

def rule2(list, i):
    word= list[i]
    return [ word+word[1:] ]

def rule3(list, i):
    word= list[i]
    lisu= []
    for j in range(1, len(word)-2):
        if word[j:j+3]=='III':
            lisu+= [ word[:j]+'U'+word[j+3:] ]
    return lisu

def rule4(list, i):
    word= list[i]
    lisu= []
    for j in range(1, len(word)-1):
        if word[j:j+2]=='UU':
            lisu+= [ word[:j]+word[j+2:] ]
    return lisu

def filt(list, lisu):
    for word in lisu:
        if not word in list:
            list+= [ word ]

def rules(list, i):
    lisu= rule1(list, i)
    filt(list, lisu)
    lisu= rule2(list, i)
    filt(list, lisu)
    lisu= rule3(list, i)
    filt(list, lisu)
    lisu= rule4(list, i)
    filt(list, lisu)
    return list, i+1

i= 0
list= [ 'MI' ]
while i<11:
    list, i= rules(list, i)
print(list)

És íme, megszűntek a lista duplumai (a kimenet ismét áttördelve):

[
 'MI',
 'MIU', 'MII',
 'MIUIU', 'MIIU', 'MIIII',
 'MIUIUIUIU', 'MIIUIIU', 'MIIIIU', 'MIIIIIIII', 'MUI',
 'MIUIUIUIUIUIUIUIU', 'MIIUIIUIIUIIU', 'MIIIIUIIIIU', 'MUIU', 'MIUU', …
 … 'MIIIIIIIIU', 'MIIIIIIIIIIIIIIII', 'MUIIIII', 'MIUIIII', 'MIIUIII', …
 … 'MIIIUII', 'MIIIIUI', 'MIIIIIU', 'MUIUI'
]