PROG0312 - Long count
A calendar system works with cyclic time periods to represent dates that identify the specific days in the calendar. Our Gregorian calendar, for example, uses days, months and years as time periods. The long count of the Maya calendar, on the other hand, works with five time periods instead of three. Every day is called a kin, and every time period of 20 kin is a uinal. 18 uinals are called a tun, 20 tun a katun, and 20 katun are a baktun. There is no upper limit to the amount of baktun, just like there is no upper limit to the amount of years in the Gregorian calendar. Furthermore time periods of a date in the Gregorian calendar are represented from shorter to longer (days, months, years), while those of the Maya calendar go from longer to shorter (baktuns, katuns, tuns, uinals, kins). At last, the Gregorian calendar numbers off the values for the time periods from 1, and the Maya calendar from 0.
Assignment
Express a day that is represented as a date in the Gregorian calendar as its corresponding date from the Maya calendar. For example, the Gregorian date 12/12/2012 corresponds with the date 12.19.19.17.11 from the Maya calendar. A date is always represented as a string that lists the individual values for each of the time periods. The individual values are always separate by the same character. Every character can be used for the separation, as long as it is not a digit. The individual values are integers, but can be represented with a random number of leading zeroes that don't have any further meaning. Moreover, we only take into account the days from 01/01/1970 (Gregorian date). Work as follows:
- Write a function dmy to which a date from the Gregorian calendar must be given. This function must print a tuple with three integers as a result. These represent the day, month and year of the given date.
- Use the function dmy to write a function expired to which a date from the Gregorian calendar must be given. The function must print the number of days that have passed since 1 January 1970 (Gregorian date).
- Use the function expired to write a function mayadate. This function has two parameters: a parameter date to which a Gregorian date must be given, and an optional parameter seperationtoken to which a string consisting of a single character must be given. The function must print the date from the Maya calendar, that corresponds with the given date from the Gregorian calendar. To determine the date, you may assume that the date 01/01/1970 from the Gregorian calendar corresponds with the date 12.17.16.7.5 from the Maya calendar. Count the amount of passed days from this reference date, until you reach the date asked. The individual values for the time periods from the Maya calendar must be written without leading zeroes, and are separated from one another by the given character. If no character was given to the function, the function should use the same character that is used to separate the numbers in the Gregorian date.
Example
>>> dmy('01/01/1970') (1, 1, 1970) >>> dmy('20-7-1988') (20, 7, 1988) >>> dmy('00012+00012+02012') (12, 12, 2012) >>> dmy('21 12 2012') (21, 12, 2012) >>> dmy('26.03.2407') (26, 3, 2407) >>> expired('01/01/1970') 0 >>> expired('20-7-1988') 6775 >>> expired('00012+00012+02012') 15686 >>> expired('21 12 2012') 15695 >>> expired('26.03.2407') 159695 >>> mayadate('01/01/1970') '12/17/16/7/5' >>> mayadate('20-7-1988',seperationtoken='/') '12/18/15/4/0' >>> mayadate('00012+00012+02012',seperationtoken='-') '12-19-19-17-11' >>> mayadate('21 12 2012',seperationtoken='+') '13+0+0+0+0' >>> mayadate('26.03.2407') '14.0.0.0.0'
Een kalendersysteem werkt met cyclische tijdsperiodes om datums voor te stellen die specifieke dagen in de kalender identificeren. 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 geen bovengrens op het aantal jaren zit in de Gregoriaanse kalender. 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. Tenslotte nummert de Gregoriaanse kalender individuele waarden voor tijdsperiodes vanaf 1, en de Mayakalender vanaf 0.
Opgave
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. Een datum wordt steeds 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 01/01/1970 (Gregoriaanse datum). 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 als resultaat teruggeven. Deze stellen respectievelijk de dag, de maand en het jaar van de gegeven datum voor.
- Gebruik de functie dmj om een functie verstreken te schrijven waaraan een datum uit de Gregoriaanse kalender moet doorgegeven worden. De functie moet het aantal dagen teruggeven dat verstreken is sinds 1 januari 1970 (Gregoriaanse datum).
- Gebruik de functie verstreken om een functie mayadatum te schrijven. Deze functie 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.
Voorbeeld
>>> 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'
Added by: | Peter Dawyndt |
Date: | 2013-01-25 |
Time limit: | 10s-20s |
Source limit: | 50000B |
Memory limit: | 1536MB |
Cluster: | Cube (Intel G860) |
Languages: | PY_NBC |
Resource: | None |