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' ]