Beschouw een string die elk van de 26 letters van het alfabet juist één keer bevat, bijvoorbeeld

jfbqpwcvuamozhilgrxtkndesy

Deze permutatie kan gebruikt worden als de sleutel van een substitutiecodering, die in het geval van bovenstaand voorbeeld de letter a afbeeldt op de letter j, de letter b op de letter f, enzoverder. Deze sleutel codeert bijgevolg het woord bakker als fjmmpr. Merk hierbij op dat de letters van het gecodeerde woord fjmmpr in alfabetische volgorde staan. De uitdaging bestaat erin een permutatie van de letters van het alfabet te vinden, die een maximaal aantal woorden uit een gegeven woordenlijst codeert als woorden die in alfabetische volgorde staan.

Opgave

Je opdracht bestaat erin een programma te schrijven dat kan gebruikt worden om de score te bepalen van het bovenstaande optimalisatieprobleem voor een gegeven sleutel en een gegeven woordenlijst. De score wordt bepaald als het aantal woorden van de gegeven woordenlijst die gecodeerd worden als woorden waarvan de letters in alfabetische volgorde staan. Hiervoor ga je als volgt te werk:

Voorbeeld

Bij onderstaande voorbeeldsessie gaan we ervan uit dat het tekstbestand zes-letter-woorden.txt1 zich in de huidige directory bevindt.

>>> geldigeSleutel('jfbqpwcvuamozhilgrxtkndesy')
True
>>> geldigeSleutel('jfbqpwcxvuamozhilgrxtkndesy')
False
>>> geldigeSleutel('jfbqpwvuamozhilgrxtkndesy')
False
>>> geldigeSleutel('jfbqpwxvuamozhilgrxtkndesy')
False
>>> geldigeSleutel(123456789)
False

>>> codeer('bakker', 'jfbqpwcvuamozhilgrxtkndesy')
'fjmmpr'
>>> codeer('slager', 'jfbqpwcvuamozhilgrxtkndesy')
'xojcpr'
>>> codeer('bullet', 'jfbqpwcvuamozhilgrxtkndesy')
'fkoopt'
>>> codeer('bakker', 'jfbqpwcvuamozhilgrxakndesy')
Traceback (most recent call last):
AssertionError: ongeldige sleutel

>>> alfabetisch('bakker')
False
>>> alfabetisch('fjmmpr')
True
>>> alfabetisch('bullet')
False
>>> alfabetisch('fkoopt')
True

>>> score('jfbqpwcvuamozhilgrxtkndesy', 'zes-letter-woorden.txt')
44
>>> score('idsxvaqtobuefpgcjwzrkmhnyl', 'zes-letter-woorden.txt')
172