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 (Engels: alphametic): 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 de letters staan 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.
Schrijf een bash shell script alphametic waarmee kan bepaald worden of een gegeven reeks cijfers een oplossing vormt van een alfametische puzzel. Aan het shell script moeten vier of meer argumenten doorgegeven worden: een mogelijke oplossing van een alfametische puzzel, één of meer woorden die de termen zijn in het linkerlid van de vergelijking en het woord uit het rechterlid van de vergelijking.
Het shell script moet drie regels naar stdout schrijven:
het alfabet van de puzzel, gevolgd door de karakters -> (voorafgegaan en gevolgd door een spatie) en de mogelijke oplossing
de opgave van de alfametische puzzel (opgemaakt met plustekens en een gelijkteken)
de opgave van de alfametische puzzel waarin alle hoofdletters vervangen zijn door de corresponderende cijfers, conform de mogelijke oplossing van de puzzel
Als de vergelijking opgaat (en dus als de mogelijke oplossing effectief ook een oplossing van de puzzel blijkt te zijn) dan moet het shell script eindigen met exit status 0. Anders moet het shell script eindigen met exit status 1.
Het shell script mag ervan uitgaan dat de argumenten die eraan doorgegeven worden voldoen aan de volgende voorwaarden, zonder dat dit expliciet moet gecontroleerd worden:
er zijn minstens vier argumenten
het eerste argument bestaat enkel uit cijfers die allemaal verschillend zijn
de overige argumenten bestaan enkel uit hoofdletters
het aantal cijfers in de mogelijk oplossing (eerste argument) is gelijk aan het aantal letters in het alfabet van de alfametische puzzel
er is geen enkel woord waarvan de eerste letter correspondeert (conform de mogelijke oplossing van de puzzel) met het cijfer 0
$ alphametic 5790813 BEAR RARE ERE RHYME
ABEHMRY -> 5790813
BEAR + RARE + ERE = RHYME
7951 + 1519 + 919 = 10389
$ echo $?
0
$ alphametic 75638921 BRUTUS STABS TIBERIUS
ABEIRSTU -> 75638921
BRUTUS + STABS = TIBERIUS
581219 + 92759 = 23568319
$ echo $?
1
$ alphametic 872015349 QUI GON JINN JEDI
DEGIJNOQU -> 872015349
QUI + GON + JINN = JEDI
490 + 235 + 1055 = 1780
$ echo $?
0