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.
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:
Schrijf een functie woordwaarde waaraan drie argumenten moeten doorgegeven worden: i) een woord, ii) een alfabet en iii) waarden toegekend aan de letters van het alfabet. De functie moet de som (int) teruggeven van de waarden toegekend aan de letters van het gegeven woord. Deze som wordt de woordwaarde van het woord genoemd.
Schrijf een functie woordwaarden waaraan drie argumenten moeten doorgegeven worden: i) een reeks woorden, ii) een alfabet en iii) waarden toegekend aan de letters van het alfabet. De functie moet een tuple teruggeven met de woordwaarde (int) van elk woord in de gegeven reeks woorden.
Schrijf een functie isgesorteerd waaraan een reeks (list of tuple) gehele getallen (int) moet doorgegeven worden. De functie heeft ook nog een tweede optionele parameter dalend waaraan een Booleaanse waarde (bool, standaardwaarde: False) kan doorgegeven worden. De functie heeft ook nog een derde optionele parameter strikt waaraan een Booleaanse waarde (bool, standaardwaarde: False) kan doorgegeven worden. De functie moet een Booleaanse waarde (bool) teruggeven die aangeeft of de gegeven reeks getallen in stijgende (dalend=False) of dalende (dalend=True) opgelijst is. Als de waarde True wordt doorgegeven aan de parameter strikt, dan mag hetzelfde getal niet meerdere keren in de reeks voorkomen (en moet de reeks dus strikt stijgend of strikt dalend zijn).
Schrijf een functie sorteer waaraan drie argumenten moeten doorgegeven worden: i) een reeks woorden, ii) een alfabet en iii) waarden toegekend aan de letters van het alfabet. De functie heeft ook nog een vierde optionele parameter dalend waaraan een Booleaanse waarde (bool, standaardwaarde: False) kan doorgegeven worden. De functie moet een lijst (list) met de woorden (str) uit de gegeven reeks teruggeven. Daarbij moeten de woorden volgens stijgende (dalend=False) of dalende (dalend=True) woordwaarde opgelijst worden. Woorden met dezelfde woordwaarde moeten in alfabetische (dalend=False) of omgekeerd alfabetische (dalend=True) volgorde opgelijst worden.
Zowel de methode sort1 als de ingebouwde functie sorted2 hebben een parameter key waaraan een functie kan doorgegeven worden. Deze functie wordt op elk element aangeroepen voordat de elementen met elkaar te vergeleken worden. Aan de functie wordt één argument doorgegeven en de waarde die de functie teruggeeft wordt gebruikt bij het sorteren. Meer info3.
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.
>>> 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']