Multiple choice: welke van de volgende vergelijkingen zijn juist?
$$6 \times 9 = 54$$
$$6 \times 9 = 46$$
$$6 \times 9 = 42$$
$$6 \times 9 = 39$$
Je zal misschien vreemd opkijken als we zeggen dat elk van deze vergelijkingen correct is, op voorwaarde dat je rekent in het juiste talstelsel. In de westerse wereld wordt voornamelijk gerekend in het decimale talstelsel, waarin de cijfers van een getal een getalwaarde hebben die een macht van tien is. In dit talstelsel wordt een getal $$abc$$ geïnterpreteerd als $$c$$ + $$10 \times b$$ + $$10^2 \times a$$ en worden de tien cijfers $$0\ldots 9$$ gebruikt. Bij het binair talstelsel zijn de getalwaarden machten van twee, en wordt enkel gewerkt met de cijfers $$0$$ en $$1$$. Een getal $$abc$$ wordt dan in het binair talstelsel (grondtal 2) geïnterpreteerd als $$c$$ + $$2 \times b$$ + $$2^2 \times a$$. In talstelsels met grondtal $$10 < b \leq 36$$ worden naast de arabische cijfers $$0, 1, \ldots, 9$$ ook de letters $$A, B, \ldots, Z$$ gebruikt als cijfers. Deze laatste corresponderen dan met de waarden $$10, 11, \ldots, 35$$. Hierbij wordt geen onderscheid gemaakt tussen hoofdletters en kleine letters.
Als we met deze kennis terugkijken naar de bovenstaande vergelijkingen, dan gaat de tweede vergelijking bijvoorbeeld op in het talstelsel met grondtal 12, de derde in het talstelsel met grondtal 13 en de vierde in het talstelsel met grondtal 15.
Het feit dat $$6 \times 9 = 42$$ een geldige vergelijking is in het talstelsel met grondtal 13 is een algemeen bekend bij science fiction fanaten die de boeken uit de reeks "The Hitchhiker's Guide to the Galaxy" gelezen hebben (of de films hebben bekeken). In deze komische reeks van Douglas Adams bouwen hyperintelligente wezens een supercomputer die het antwoord op de ultieme vraag over het leven, het universum en alles moet berekenen. Na 7½ miljoen jaar rekenen gaf deze supercomputer het antwoord $$42$$. Dit resultaat had natuurlijk geen betekenis omdat ze niet wisten wat de ultieme vraag was. Dus werd er een tweede computer gebouwd die de vraag moest berekenen. Deze computer was de planeet aarde en het berekenen zou 10 miljoen jaar duren, maar vijf minuten voordat de aarde de vraag had berekend, werd ze vernietigd. Daarmee was de ultieme vraag van het leven nog altijd niet gekend. Aangezien de hyperintelligente wezens niet nog eens zo lang wilden wachten, besloten ze om een van de overlevende mensen van de planeet aarde, die dus deel was van de supercomputer, willekeurige letters uit een zak te laten trekken. Deze letters vormden de zin: "Wat krijg je als je zes met negen vermenigvuldigd?". Natuurlijk is $$6 \times 9$$ decimaal gelijk aan $$54$$, maar het talstelsel met grondtal $$13$$ is $$6 \times 9$$ wel degelijk gelijk aan $$42$$. Slimme lezers van de boekenreeks hadden dit al snel opgemerkt, waarop de auteur spottend liet weten dat hij geen grappen maakte met grondtal 13. Volgens hem was er iets misgelopen in de berekening waardoor de vraag nog altijd niet geweten was.
Bij deze opgave is het de bedoeling om voor een gegeven vergelijking de kleinste basis $$b \leq 36$$ te bereken waarin de vergelijking opgaat. Je mag ervan uit gaan dat de vergelijkingen alleen cijfers, haakjes, + en * bevatten. Hiervoor ga je als volgt te werk:
Schrijf een functie evaluatie waaraan twee argumenten moeten doorgegeven worden. Het eerste argument is een string die een wiskundige uitdrukking omschrijft (bijvoorbeeld 14 * 3). Het tweede argument geeft het grondtal aan van het talstelsel waarin de uitdrukking moet berekend worden. De functie moet het decimaal resultaat teruggeven van de evaluatie van de expressie, waarbij ieder getal in de expressie in het talstelsel met het gegeven grondtal geïnterpreteerd moet worden.
Gebruik de functie evaluatie om een functie talstelsel te schrijven waaraan de stringvoorstelling van een vergelijking moet doorgegeven worden. De expressies in het linkerlid en rechterlid van deze vergelijking bestaat telkens uit een reeks optellingen en vermenigvuldigingen. De functie moet een geheel getal $$b \leq 36$$ teruggeven dat het kleinste grondtal vormt van een talstelsel waarvoor de vergelijking opgaat.
In Python kan je gebruikmaken van de ingebouwde functie eval om de waarde te bepalen van een expressie die als een stringargument aan de functie wordt doorgegeven. Deze evaluatiefunctie werkt altijd in het decimale talselsel. De ingebouwde functie int kan dan weer gebruikt worden om de stringvoorstelling van een getal in een talstelsel met grondtal $$b$$ om te zetten naar het corresponderende gehele getal in het decimale talstelsel. Gebruik het optionele tweede argument (base) van de functie int, om het grondtal van het talstelsel op te geven.
>>> eval('12 * 3 + 6')
42
>>> int('2C', base=15)
42
>>> evaluatie('6 * 9', 13)
54
>>> evaluatie('42', 13)
54
>>> evaluatie('17 + 33 * 56', 23)
8742
>>> evaluatie('41 * 42', 23)
8742
>>> talstelsel('6 * 9 = 42')
13
>>> talstelsel('17 + 33 * 56 = 41 * 42')
23