from bisect import bisect_left

# Lees het bestand in in een lijst
with open("woorden5letters.txt", "r") as bestand:
    woorden5letters = bestand.read().splitlines()

# binair zoeken of een woord in de lijst zit, gebruikt voor de verandering
# een bibliotheekfunctie
def is_Nederlands (woord):
    i = bisect_left (woorden5letters,woord)
    return i != len(woorden5letters) and woorden5letters[i] == woord

# Telt in hoeveel posities woord1 en woord2 van elkaar verschillen.
# PS. Je kan ook stoppen zodra je minstens 2 verschillen gevonden hebt
def tel_verschillen(woord1, woord2):
    verschillen = 0
    for index in range(5):
        if woord1[index] != woord2[index]:
            verschillen += 1
    return verschillen

# Controleert alle regels. Geeft True terug als die voldaan zijn, geeft
# anders False terug EN drukt een gepaste melding af
def zijn_regels_voldaan (vorig_woord, nieuw_woord):
    voldaan = False
    if len(nieuw_woord) != 5:
        print ("Het woord moet uit precies 5 letters bestaan")
    else:
        verschillen = tel_verschillen(vorig_woord, nieuw_woord)
        if verschillen == 0:
            print ("Je moet minstens één letter veranderen")
        elif verschillen  > 1:
            print (f"'{nieuw_woord}' kan niet de volgende stap zijn na '{vorig_woord}'")
        elif not is_Nederlands(nieuw_woord):
            print (f"'{nieuw_woord}' is geen Nederlands woord")
        else:
            voldaan = True        
    return voldaan
        
# I/O functie: leest een woord in en blijft dit herhalen tot het geldig is
def volgend_woord (vorig_woord):
    nieuw_woord = input ("> ")
    while not zijn_regels_voldaan(vorig_woord, nieuw_woord):
        nieuw_woord = input ("? ")
    return nieuw_woord

# start_woord en eind_woord kan je ook willekeurig kiezen uit
# woorden5letters, maar helaas geeft dit bijna nooit een puzzel
# die een oplossing heeft
start_woord = input("Met welk woord wil je starten? ")
eind_woord  = input("Met welk woord wil je eindigen? ")
lijst = []

print()
print (f"Je start met '{start_woord}' en je moet eindigen met '{eind_woord}'")
woord = start_woord
lijst.append (woord)
while woord != eind_woord:
    woord = volgend_woord(woord)
    lijst.append (woord)

print ("Dit is de woordenreeks die je hebt gebruikt:")
for woord in lijst:
    print (woord)
