Stel dat we aan de hand van deze vergelijkingen een waarde toekennen aan 17 (Franse) letters:

A = elk F = 13-3N O = 0 S = 2N-4 Z = 16-4N
C = A-5N-4 H = 4N-11 P = 2 T = 14-5N  
D = 2N I = 2N+4 Q = 2N+5-A U = 1-N  
E = 3N-5 N = elk R = N-11 X = 6-4N  

Er kan een willekeurig getal ingevuld worden op alle plaatsen waar elk staat. Daardoor zijn er oneindig veel oplossingen mogelijk, bijvoorbeeld (voor A=20 en N=7):

A C D E F H I N O P Q R S T U X Z
20 -19 14 16 -8 17 18 7 0 2 -1 -4 10 -21 -6 -22 -12

Voor alle waarden die we op deze manier aan het alfabet van 17 letters toekennen, geldt dat:

Z+E+R+O = (16-4N) + (3N-5) + (N-11) + 0 = 0
U+N = (1-N) + N = 1
D+E+U+X = (2N) + (3N-5) + (1-N) + (6-4N) = 2
T+R+O+I+S = (14-5N) + (N-11) + 0 + (2N+4) + (2N-4) = 3
Q+U+A+T+R+E = (2N+5-A) + (1-N) + A + (14-5N) + (N-11) + (3N-5)
= 4
C+I+N+Q = (A-5N-4) + (2N+4) + N + (2N+5-A) = 5
S+I+X = (2N-4) + (2N+4) + (6-4N) = 6
S+E+P+T = (2N-4) + (3N-5) + 2 + (14-5N) = 7
H+U+I+T = (4-11N) + (1-N) + (2N+4) + (14-5N) = 8
N+E+U+F = N + (3N-5) + (1-N) + (13-3N) = 9
D+I+X = (2N) + (2N+4) + (6-4N) = 10
O+N+Z+E = 0 + N + (16-4N) + (3N-5) = 11
D+O+U+Z+E = (2N) + 0 + (1-N) + (16-4N) + (3N-5)
= 12
T+R+E+I+Z+E = (14-5N) + (N-11) + (3N-5) + (2N+4) + (16-4N) + (3N-5)
= 13

Er kan aangetoond worden dat bovenstaand stelsel vergelijkingen het enige is waarvoor Z+E+R+O=0, U+N=1, …. Elke uitbreiding van de Franse getallen voorbij TREIZE is onmogelijk zonder dat verschillende letters eenzelfde waarde toegekend krijgen.

Opgave

Een alfabet stellen we voor als een reeks hoofdletters (str) waarin elke letter hoogstens één keer voorkomt.

De waarden toegekend aan de letters van een alfabet stellen we voor als een reeks (list of tuple) gehele getallen (int). Elke waarde correspondeert met de letter op de overeenkomstige positie in het alfabet, waardoor het aantal getallen in de reeks gelijk moet zijn aan het aantal letters in het alfabet.

Een woord is een reeks hoofdletters (str) waarin dezelfde letter meerdere keren mag voorkomen. Een reeks woorden stellen we voor als een string (str) waarin de woorden van elkaar gescheiden worden door komma's (,).

Gevraagd wordt:

Alle bovenstaande functies mogen ervan uitgaan dat de gegeven woorden enkel bestaan uit hoofdletters die voorkomen in het gegeven alfabet, zonder dat ze dit expliciet moeten controleren.

Voorbeeld

>>> frans_alfabet = 'ACDEFHINOPQRSTUXZ'
>>> franse_waarden = [20, -19, 14, 16, -8, 17, 18, 7, 0, 2, -1, -4, 10, -21, -6, -22, -12]
>>> franse_getallen = 'ZERO,UN,DEUX,TROIS,QUATRE,CINQ,SIX,SEPT,HUIT,NEUF,DIX,ONZE,DOUZE,TREIZE'

>>> engels_alfabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> engelse_waarden = [-10, -14, 17, -6, -14, 17, 17, 5, -12, 6, 7, 18, 3, -6, -3, 15, -16, -15, -10, 11, -12, -13, -7, 20, -16, 17]
>>> engelse_getallen = 'ZERO,ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN'

>>> woordwaarde('ZERO', frans_alfabet, franse_waarden)
0
>>> woordwaarde('UN', frans_alfabet, franse_waarden)
1
>>> woordwaarde('DEUX', frans_alfabet, franse_waarden)
2
>>> woordwaarde('TROIS', frans_alfabet, franse_waarden)
3
>>> woordwaarde('QUATRE', frans_alfabet, franse_waarden)
4

>>> woordwaarden(engelse_getallen, engels_alfabet, engelse_waarden)
(-15, -23, 1, -27, -13, -22, -2, -57, 7, -38, -9)
>>> woordwaarden(franse_getallen, frans_alfabet, franse_waarden)
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)
>>> woordwaarden(franse_getallen, engels_alfabet, engelse_waarden)
(-15, -18, -12, -29, -56, -17, -2, 2, -8, -15, 2, -6, -18, -27)

>>> isgesorteerd((0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13))
True
>>> isgesorteerd((0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13), strikt=True)
True
>>> isgesorteerd((0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13), dalend=True)
False
>>> isgesorteerd((0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13), dalend=True, strikt=True)
False
>>> isgesorteerd((13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0), dalend=True, strikt=True)
True

>>> sorteer(engelse_getallen, engels_alfabet, engelse_waarden)
['SEVEN', 'NINE', 'THREE', 'ONE', 'FIVE', 'ZERO', 'FOUR', 'TEN', 'SIX', 'TWO', 'EIGHT']
>>> sorteer(franse_getallen, frans_alfabet, franse_waarden, True)
['TREIZE', 'DOUZE', 'ONZE', 'DIX', 'NEUF', 'HUIT', 'SEPT', 'SIX', 'CINQ', 'QUATRE', 'TROIS', 'DEUX', 'UN', 'ZERO']
>>> sorteer(franse_getallen, engels_alfabet, engelse_waarden, dalend=True)
['SEPT', 'DIX', 'SIX', 'ONZE', 'HUIT', 'DEUX', 'ZERO', 'NEUF', 'CINQ', 'UN', 'DOUZE', 'TREIZE', 'TROIS', 'QUATRE']