Op de maan werken de optelling en de vermenigvuldiging cijfer per cijfer. Hetzelfde dus als optellen en vermenigvuldigen op aarde, behalve dan dat de plus- en maaltafels nogal ongebruikelijk zijn. Optellen doe je door het grootste van de twee cijfers te nemen, dus $$1 + 3 = 3$$ en $$7 + 4 = 7$$. Vermenigvuldigen doe je door het kleinste van de twee cijfers te nemen, dus $$1 \times 3 = 1$$ en $$7 \times 4 = 4$$. We krijgen dan:

      3 5 7          3 5 7
    +   6 4      *     6 4
    -------      ---------
      3 6 7          3 4 4
                 + 3 5 6
                 ---------
                   3 5 6 4

Er is geen "overdracht" zoals bij het optellen op aarde1. Op de maan bestaat er ook geen aftrekking of deling, aangezien de resultaten niet uniek zouden zijn. De machtverheffing $$a^b$$ bestaat wel, en is net als op aarde gedefinieerd in functie van de vermenigvuldiging: $$a^b = a \times a \times a \times \ldots \times a$$ ($$b$$ factoren).

Opgave

Definieer een klasse Maan waarmee maangetallen kunnen voorgesteld worden: natuurlijke getallen waarvoor de optelling, de vermenigvuldiging en de machtsverheffing werken zoals op de maan. Bij het aanmaken van een maangetal (Maan) moet een waarde doorgegeven worden die met de ingebouwde functie int kan omgezet worden naar de waarde van het maangetal. Als die omzetting niet kan gebeuren of als het resultaat een negatief getal oplevert, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige waarde.

Als een maangetal (Maan) wordt doorgegeven aan de ingebouwde functies int of str dan moet hetzelfde resultaat teruggegeven worden als wanneer de waarde van het maangetal (int) zou doorgegeven worden. Als een maangetal (Maan) wordt doorgegeven aan de ingebouwde functie repr dan moet een stringvoorstelling (str) teruggegeven worden die leest als een Python expressie waarmee een maangetal aangemaakt wordt met dezelfde waarde (int) als het doorgegeven maangetal.

Zorg ervoor dat de binaire operatoren voor de optelling (+), de vermenigvuldiging (*) en de machtsverheffing (**) telkens een nieuw maangetal (Maan) opleveren als beide operandi maangetallen (Maan) zijn of als één van beide operandi een maangetal (Maan) is en het ander een integer (int). Deze bewerkingen moeten berekend worden zoals op de maan.

Voorbeeld

>>> Maan(3.14)
Maan(3)
>>> Maan(-3)
Traceback (most recent call last):
AssertionError: ongeldige waarde
>>> Maan('spam')
Traceback (most recent call last):
AssertionError: ongeldige waarde

>>> Maan(7) + Maan(8)
Maan(8)
>>> Maan(5) + 4
Maan(5)
>>> 3 + Maan(6)
Maan(6)
>>> Maan(738) + Maan(8452)
Maan(8758)

>>> Maan(7) * Maan(8)
Maan(7)
>>> Maan(5) * 4
Maan(4)
>>> 3 * Maan(6)
Maan(3)
>>> Maan(738) * Maan(8452)
Maan(748452)

>>> Maan(27) ** Maan(8)
Maan(222222227)
>>> Maan(35) ** 4
Maan(33335)
>>> 321 ** Maan(6)
Maan(3222222111111)

Bronnen

Epiloog

Bij Numberphile3 praat Neil Sloane over maanrekenen, een "buitenaardse" manier om eenvoudige wiskunde te bedrijven: