from bisect import bisect_left

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


def is_nederlands (woord):
    index = bisect_left(woorden5letters,woord)
    return index != len(woorden5letters) and woord == woorden5letters[index]


# Telt in hoeveel posities woord1 en woord2 van elkaar verschillen.
def tel_verschillen(woord_1, woord_2):
    verschillen = 0
    for i in range(len(woord_1)):
        if woord_1[i] != woord_2[i]:
            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
    
    # eventueel "-" verwerken
    if nieuw_woord == '-':
        print('slechts 1 woord meer aanwezig!')
        return voldaan
    
    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 ("> ")
    
    # eventueel "-" verwerken
    while nieuw_woord == '-' and len(lijst) > 1:
        lijst.pop()
        print(f"= {lijst[-1]}")
        vorig_woord = lijst[-1]
        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 (f"\nJe 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)

