In aanloop naar de feestdagen publiceerde Charles Trigg het volgende raadsel in het tijdschrift The American Mathemematical Monthly1, editie december 1956.

kerstraadsel
Dit raadsel bestaat uit een zin waarvan de woorden gevormd worden door tien verschillende hoofdletters, en die van elkaar gescheiden worden door spaties. Als elke letter de unieke voorstelling is van een cijfer, en elk woord is een kwadraatgetal, wat zijn dan de vier getallen?

Deze zin bevat tien verschillende letters. Als elke letter de unieke voorstelling van een cijfer is, en elk woord is een kwadraatgetal2, wat zijn dan de vier getallen?

Dit raadsel bleek twee verschillende oplossingen te hebben. Onderstaande tabel toont door welke cijfers je de letters moet vervangen om deze twee oplossingen te bekomen.

letter oplossing 1 oplossing 2
M 2 3
E 7 4
R 5 2
Y 6 5
X 3 7
A 4 9
S 9 6
T 8 8
O 1 1
L 0 0

De vier kwadraatgetallen van de eerste oplossing zijn dus.

oplossing
Een van de twee mogelijke oplossingen van het raadsel.

De kwadraatgetallen van de tweede oplossing zijn 34225 7396 81 900. Als we het raadsel zouden aanpassen tot MERRY XMAS TO YA ALL, dan wordt YA vervangen door 59 in de tweede oplossing, en dat is geen kwadraatgetal. De eerste oplossing blijft echter wel nog correct, en levert de volgende kwadraatgetallen op: 27556 3249 81 64 400.

Opgave

Los een raadsel op waarbij er een zin (str) gegeven wordt waarvan de woorden bestaan uit tien verschillende hoofdletters. De woorden van deze zin worden telkens van elkaar gescheiden door één enkele spatie.

Een oplossing van het raadsel bestaat uit een één-op-één afbeelding (een bijectie3) van de tien hoofdletters uit de zin op de tien cijfers. De oplossing is enkel correct als elk woord van de zin een kwadraatgetal4 wordt wanneer je alle letters van de zin vervangt door hun overeenkomstig cijfer. We gebruiken twee voorstellingen voor een oplossing.

De woordenboekvoorstelling van een oplossing bestaat uit een dictionary (dict) die tien verschillende hoofdletters (str) afbeeldt op tien verschillende cijfers (int).

De stringvoorstelling van een oplossing bestaat uit twee strings (str). De eerste string bestaat uit tien verschillende hoofdletters. De tweede string bestaat uit tien verschillende cijfers, waarbij elke hoofdletter uit de eerste string wordt afgebeeld op het cijfer op de overeenkomstige positie in de tweede string. Deze tweede string hoeft niet expliciet vermeld te worden als de tien letters uit de eerste string worden afgebeeld op de cijfers 0, 1, 2, …, 9.

Gevraagd wordt:

De functies oplossing en iscorrect moeten een AssertionError opwerpen met de boodschap ongeldige oplossing indien het eerste argument van de gegeven oplossing geen string is die bestaat uit tien verschillende hoofdletters of indien het tweede argument van de gegeven oplossing geen string is die bestaat uit tien verschillende cijfers.

De functies vervangen en iscorrect moeten een AssertionError opwerpen met de boodschap ongeldig raadsel indien de woorden van de gegeven zin niet gevormd worden door de hoofdletters uit de gegeven oplossing of niet van elkaar gescheiden worden door spaties.

Voorbeeld

>>> oplossing('LOMXARYETS')
{'L': 0, 'O': 1, 'M': 2, 'X': 3, 'A': 4, 'R': 5, 'Y': 6, 'E': 7, 'T': 8, 'S': 9}
>>> oplossing('AELMORSTXY', '4702159836')
{'L': 0, 'O': 1, 'M': 2, 'X': 3, 'A': 4, 'R': 5, 'Y': 6, 'E': 7, 'T': 8, 'S': 9}
>>> oplossing('MERYXASTOL', '2765349810')
{'L': 0, 'O': 1, 'M': 2, 'X': 3, 'A': 4, 'Y': 5, 'R': 6, 'E': 7, 'T': 8, 'S': 9}
>>> oplossing('BANANARAMA')
Traceback (most recent call last):
AssertionError: ongeldige oplossing

>>> l2c = oplossing('LOMXARYETS')
>>> vervangen('MERRY XMAS TO ALL', l2c)
'27556 3249 81 400'
>>> vervangen('MERRY XMAS TO YA ALL', l2c)
'27556 3249 81 64 400'

>>> l2c = oplossing('LORMEYSXTA')
>>> vervangen('MERRY XMAS TO ALL', l2c)
'34225 7396 81 900'
>>> vervangen('HAPPY NEWYEAR', l2c)
Traceback (most recent call last):
AssertionError: ongeldig raadsel

>>> iskwadraat(27556)
True
>>> iskwadraat(34225)
True
>>> iskwadraat(12345)
False

>>> iscorrect('MERRY XMAS TO ALL', 'LOMXARYETS')
True
>>> iscorrect('MERRY XMAS TO ALL', 'LORMEYSXTA')
True
>>> iscorrect('MERRY XMAS TO YA ALL', 'AELMORSTXY', '4702159836')
True
>>> iscorrect('MERRY XMAS TO YA ALL', 'MERYXASTOL', '2765349810')
False
>>> iscorrect('MERRY XMAS TO ALL', 'BANANARAMA')
Traceback (most recent call last):
AssertionError: ongeldige oplossing
>>> iscorrect('HAPPY NEWYEAR', 'LOMXARYETS')
Traceback (most recent call last):
AssertionError: ongeldig raadsel

Epiloog

L.A. Ringenberg van het Eastern Illinois State College was de eerste die de twee oplossingen voor het oorspronkelijke raadsel vond. Hij omschreef op de volgende manier hoe hij tot die oplossingen gekomen was.

Uit een lijst met kwadraatgetallen kunnen we afleiden dat ALL moet vervangen worden door 100, 144, 400 of 900. Als het één van de eerste twee is, dan moet XMAS vervangen worden door 2916 of 9216, en dan kan TO geen kwadraatgetal zijn. Als ALL vervangen wordt door 400, dan moet XMAS vervangen worden door 1849, 3249, 6241 of 8649. We bekijken deze vier mogelijkheden nu één voor één:

  1. als ALL = 400 en XMAS = 1849, dan is M = 8, MERRY = 81225, waardoor E en X beide vervangen worden door 1, want niet correct is

  2. als ALL = 400 en XMAS = 3249, dan is M = 2, MERRY = 27556, en TO = 81, wat een correcte oplossing oplevert: 27556 3249 81 400

  3. als ALL = 400 en XMAS = 6241, dan is TO geen kwadraatgetal

  4. als ALL = 400 en XMAS = 8649, dan is M = 6 en is L = 0 en bestaat er geen oplossing voor MERRY

Als we nu teruggaan naar de oplossing ALL = 900, dan moet XMAS in dit geval vervangen worden door 1296 of 7396:

  1. als ALL = 900 en XMAS = 1296, dan is TO geen kwadraatgetal

  2. als ALL = 900 en XMAS = 7396, dan is M = 3, MERRY = 34225, en TO = 81, wat een tweede correcte oplossing oplevert: 34225 7396 81 900

Bronnen