Kalendersystemen werken doorgaans met cyclische tijdsperiodes om datums voor te stellen die specifieke dagen in de kalender aanduiden. Onze Gregoriaanse kalender gebruikt bijvoorbeeld dagen, maanden en jaren als tijdsperiodes.
De lange telling van de Mayakalender werkt daarentegen niet met drie maar vijf tijdsperiodes. Een dag wordt een kin genoemd, en een tijdsperiode van 20 kin is een uinal. Verder gaan er 18 uinals in een tun, 20 tun in een katun, en 20 katun in een baktun. Er zit geen bovengrens op het aantal baktun, net zoals er in de Gregoriaanse kalender geen bovengrens zit op het aantal jaren.
Verder worden tijdsperiodes van een datum uit de Gregoriaanse kalender van kort naar lang (dagen, maanden, jaren) weergegeven, terwijl die van de Mayakalender van lang naar kort (baktuns, katuns, tuns, uinals, kins) weergegeven worden. Ten slotte nummert de Gregoriaanse kalender individuele waarden voor tijdsperiodes vanaf 1, en de Mayakalender vanaf 0.
Druk een dag weergegeven als datum in de Gregoriaanse kalender uit als de corresponderende datum in de Mayakalender. Zo komt de Gregoriaanse datum 12/12/2012 bijvoorbeeld overeen met de datum 12.19.19.17.11 in de Mayakalender. Datums worden altijd voorgesteld als een string die de individuele waarden voor elk van de tijdsperiodes oplijst. De individuele waarden worden hierbij telkens van elkaar gescheiden door eenzelfde karakter. Elk karakter kan als scheidingsteken gebruikt worden, zolang het maar geen cijfer is. De individuele waarden zijn natuurlijke getallen, maar kunnen weergegeven worden met een willekeurig aantal voorloopnullen die verder geen betekenis hebben. We houden bovendien enkel rekening met dagen vanaf de Gregoriaanse datum 01/01/1970. Hiervoor ga je als volgt te werk:
Schrijf een functie dmj waaraan een datum uit de Gregoriaanse kalender moet doorgegeven worden. Deze functie moet een tuple met drie integers teruggeven: de dag, de maand en het jaar van de gegeven datum.
Gebruik de functie dmj om een functie verstreken te schrijven waaraan een datum uit de Gregoriaanse kalender moet doorgegeven worden. De functie verstreken moet het aantal dagen teruggeven dat verstreken is sinds 1 januari 1970 (Gregoriaanse datum).
Gebruik de functie verstreken om een functie mayadatum te schrijven. De functie mayadatum heeft twee parameters: een parameter datum waaraan een Gregoriaanse datum moet doorgegeven worden, en een optionele parameter scheidingsteken waaraan een string bestaande uit één enkel karakter kan doorgegeven worden. De functie moet de datum uit de Mayakalender teruggeven, die correspondeert met de gegeven datum uit de Gregoriaanse kalender. Om die datum te bepalen, kan je uitgaan van het feit dat de datum 01/01/1970 uit de Gregoriaanse kalender correspondeert met de datum 12.17.16.7.5 uit de Mayakalender. Tel vanaf deze referentiedatum het aantal verstreken dagen, totdat je de gevraagde datum bekomt. De individuele waarden voor de tijdsperiodes van de Mayakalender moeten uitgeschreven worden zonder voorloopnullen, en worden van elkaar gescheiden door het gegeven scheidingsteken. Indien geen scheidingsteken aan de functie wordt doorgegeven, dan moet de functie hetzelfde scheidingsteken hanteren dat gebruikt wordt in de gegeven datum uit de Gregoriaanse kalender.
>>> dmj('01/01/1970')
(1, 1, 1970)
>>> dmj('20-7-1988')
(20, 7, 1988)
>>> dmj('00012+00012+02012')
(12, 12, 2012)
>>> dmj('21 12 2012')
(21, 12, 2012)
>>> dmj('26.03.2407')
(26, 3, 2407)
>>> verstreken('01/01/1970')
0
>>> verstreken('20-7-1988')
6775
>>> verstreken('00012+00012+02012')
15686
>>> verstreken('21 12 2012')
15695
>>> verstreken('26.03.2407')
159695
>>> mayadatum('01/01/1970')
'12/17/16/7/5'
>>> mayadatum('20-7-1988', scheidingsteken='/')
'12/18/15/4/0'
>>> mayadatum('00012+00012+02012', scheidingsteken='-')
'12-19-19-17-11'
>>> mayadatum('21 12 2012', scheidingsteken='+')
'13+0+0+0+0'
>>> mayadatum('26.03.2407')
'14.0.0.0.0'