In de Word Ways editie van augustus 20061 kwam James Mayfield met deze ingenieuze vergelijking op de proppen:
BEAR + RARE + ERE = RHYME
Het is een alfametische puzzel: een geldige wiskundige vergelijking waarin elk cijfer werd vervangen door een hoofdletter. Elke hoofdletter stelt een verschillend cijfer voor. Door welke cijfers moeten we de hoofdletters vervangen om deze vergelijking te laten opgaan?
Als A=5, B=7, E=9, H=0, M=8, R=1 en Y=3 dan krijgen we:
7951 1519 + 919 ----- 10389
In zijn artikel geeft Mayfield nog 94 andere alfametische puzzels met een ingebouwde associatie tussen de woorden in het linkerlid en het woord in het rechterlid. Deze staat er bijvoorbeeld ook tussen:
BRUTUS + STABS = CAESAR
Hij heeft geen oplossingen voor de puzzels, maar je kan deze handige rekenmachine2 gebruiken als je vast zou zitten bij het oplossen ervan.
Een woord (str) is een reeks hoofdletters waarin dezelfde letter meerdere keren mag voorkomen.
Een som van woorden (str) is een reeks woorden die van elkaar gescheiden worden door plustekens (+). Voor en na de plustekens staat er telkens één spatie.
De opgave (str) van een alfametische puzzel is een vergelijking met als linkerlid een som van twee of meer woorden en als rechterlid een woord. Voor en na het gelijkteken (=) staat er telkens één spatie.
Het alfabet (str) van een alfametische puzzel bestaat uit alle hoofdletters in de opgave van de puzzel. Daarin komt elke letter juist één keer voor en staan de letters in alfabetische volgorde.
Een oplossing (str) van een alfametische puzzel bestaat uit een reeks cijfers die allemaal verschillend zijn. Elk cijfer van de oplossing correspondeert met de letter op de overeenkomstige positie in het alfabet van de puzzel, waardoor het aantal cijfers in de oplossing dus gelijk moet zijn aan het aantal letters in het alfabet.
Gevraagd wordt:
Schrijf een functie alfabet waaraan de opgave van een alfametische puzzel moet doorgegeven worden. De functie moet het alfabet van de puzzel teruggeven.
Schrijf een functie getal waaraan drie argumenten moeten doorgegeven worden: i) een woord $$w$$ uit de opgave van een alfametische puzzel, ii) het alfabet van de puzzel en iii) een oplossing van de puzzel. De functie moet het getal (int) teruggeven dat men bekomt door in woord $$w$$ alle hoofdletters te vervangen door de corresponderende cijfers, conform de oplossing van de puzzel.
Schrijf een functie getallen waaraan drie argumenten moeten doorgegeven worden: i) de som $$s$$ uit het linkerlid van een alfametische puzzel, ii) het alfabet van de puzzel en iii) een oplossing van de puzzel. De functie moet een tuple teruggeven met de getallen (int) die men bekomt door in alle woorden uit de som $$s$$ de hoofdletters te vervangen door de corresponderende cijfers, conform de oplossing van de puzzel.
Schrijf een functie woord waaraan drie argumenten moeten doorgegeven worden: i) een getal (int) dat bekomen werd door in een woord $$w$$ uit de opgave van een alfametische puzzel alle hoofdletters te vervangen door de corresponderende cijfers (conform de oplossing van de puzzel), ii) het alfabet van de puzzel en iii) een oplossing van de puzzel. De functie moet woord $$w$$ teruggeven.
Schrijf een functie uitkomst waaraan drie argumenten moeten doorgegeven worden: i) de som uit het linkerlid van een alfametische puzzel, ii) het alfabet van de puzzel en iii) een oplossing van de puzzel. De functie moet het woord uit het rechterlid van de puzzel teruggeven.
Schrijf een functie isoplossing waaraan twee argumenten moeten doorgegeven worden: i) een string $$s$$ (str) die enkel bestaat uit cijfers en ii) de opgave van een alfametische puzzel. De functie moet een Booleaanse waarde (bool) teruggeven die aangeeft of $$s$$ een oplossing is van de puzzel.
>>> alfabet('BEAR + RARE + ERE = RHYME')
'ABEHMRY'
>>> alfabet('BRUTUS + STABS = CAESAR')
'ABCERSTU'
>>> getal('BEAR', 'ABEHMRY', '5790813')
7951
>>> getal('RARE', 'ABEHMRY', '5790813')
1519
>>> getal('ERE', 'ABEHMRY', '5790813')
919
>>> getal('RHYME', 'ABEHMRY', '5790813')
10389
>>> getallen('BEAR + RARE + ERE', 'ABEHMRY', '5790813')
(7951, 1519, 919)
>>> getallen('BRUTUS + STABS', 'ABCERSTU', '75638921')
(581219, 92759)
>>> woord(7951, 'ABEHMRY', '5790813')
'BEAR'
>>> woord(1519, 'ABEHMRY', '5790813')
'RARE'
>>> woord(919, 'ABEHMRY', '5790813')
'ERE'
>>> woord(10389, 'ABEHMRY', '5790813')
'RHYME'
>>> uitkomst('BEAR + RARE + ERE', 'ABEHMRY', '5790813')
'RHYME'
>>> uitkomst('BRUTUS + STABS', 'ABCERSTU', '75638921')
'CAESAR'
>>> isoplossing('5790813', 'BEAR + RARE + ERE = RHYME')
True
>>> isoplossing('75638921', 'BRUTUS + STABS = TIBERIUS')
False