Eén van de UGent nieuwjaarskaarten1 leert ons dat we in 2019 de kalenders van 2013, 2002 of 1991 konden hergebruiken.
Maar hoelang moeten we de kalender van 2018 eigenlijk bewaren vooraleer we die opnieuw kunnen gebruiken? Daarvoor is het wachten tot 2029. Wie dat te lang vindt, kan alvast de kalender van 2018 hergebruiken tijdens de eerste twee maanden van 2024 (een schrikkeljaar).
We kunnen de kalender van jaar $$j_1$$ hergebruiken in jaar $$j_2$$ als alle corresponderende dagen op dezelfde datum (dag en maand) en weekdag vallen bij het dag per dag aflopen van de twee kalenders. Gevraagd wordt:
Schrijf een functie eerste_verschil waaraan twee jaartallen $$j_1$$ (int) en $$j_2$$ (int) moeten doorgegeven worden. De functie moet de eerste dag van jaar $$j_2$$ teruggeven (datetime.date) die verschilt van de corresponderende dag van jaar $$j_1$$ als we de kalenders van $$j_1$$ en $$j_2$$ dag per dag aflopen vanaf 1 januari. Twee dagen verschillen als ze niet op dezelfde datum (dag en maand) of niet op dezelfde weekdag vallen. Als de twee gegeven jaartallen geen verschillende dagen hebben, dan moet de functie de waarde None teruggeven.
Schrijf een functie hergebruik_kalender waaraan een jaartal $$j$$ (int) moet doorgegeven worden. De functie heeft ook nog een tweede optionele parameter vorig waaraan een Booleaanse waarde kan doorgegeven worden (bool, standaardwaarde: False). Als de waarde False wordt doorgegeven aan de parameter vorig dan moet de functie het eerstvolgende jaar (int) teruggeven waarin we de kalender van jaar $$j$$ kunnen hergebruiken. Als de waarde True wordt doorgegeven aan de parameter vorig dan moet de functie het meest recente jaar (int) teruggeven waarvan we de kalender kunnen hergebruiken in jaar $$j$$.
Schrijf een functie hergebruik_kalenders waaraan een jaartal $$j$$ (int) en een getal $$n \in \mathbb{N}_0$$ (int) moeten doorgegeven worden. De functie heeft ook nog een derde optionele parameter vorig waaraan een Booleaanse waarde kan doorgegeven worden (bool, standaardwaarde: False). Als de waarde False wordt doorgegeven aan de parameter vorig dan moet de functie een lijst (list) teruggeven met de $$n$$ volgende jaren (int, in chronologische volgorde) waarin we de kalender van jaar $$j$$ kunnen hergebruiken. Als de waarde True wordt doorgegeven aan de parameter vorig dan moet de functie een lijst (list) teruggeven met de $$n$$ vorige jaren (int, in omgekeerde chronologische volgorde) waarvan we de kalender kunnen hergebruiken in jaar $$j$$.
>>> eerste_verschil(2018, 2019)
datetime.date(2019, 1, 1)
>>> eerste_verschil(2018, 2024)
datetime.date(2024, 2, 29)
>>> eerste_verschil(2018, 2029)
>>> hergebruik_kalender(2018)
2029
>>> hergebruik_kalender(2018, True)
2007
>>> hergebruik_kalender(2019, vorig=False)
2030
>>> hergebruik_kalender(2019, vorig=True)
2013
>>> hergebruik_kalenders(2018, 10)
[2029, 2035, 2046, 2057, 2063, 2074, 2085, 2091, 2103, 2114]
>>> hergebruik_kalenders(2018, 10, True)
[2007, 2001, 1990, 1979, 1973, 1962, 1951, 1945, 1934, 1923]
>>> hergebruik_kalenders(2019, 10, vorig=False)
[2030, 2041, 2047, 2058, 2069, 2075, 2086, 2097, 2109, 2115]
>>> hergebruik_kalenders(2019, 10, vorig=True)
[2013, 2002, 1991, 1985, 1974, 1963, 1957, 1946, 1935, 1929]
Blijkbaar hebben we deze eeuw slechts 14 kalenders nodig:
kalender | te hergebruiken in |
---|---|
2001 | 2007, 2018, 2029, 2035, 2046, 2057, 2063, 2074, 2085, 2091 |
2002 | 2013, 2019, 2030, 2041, 2047, 2058, 2069, 2075, 2086, 2097 |
2003 | 2014, 2025, 2031, 2042, 2053, 2059, 2070, 2081, 2087, 2098 |
2004 | 2032, 2060, 2088 |
2005 | 2011, 2022, 2033, 2039, 2050, 2061, 2067, 2078, 2089, 2095 |
2006 | 2017, 2023, 2034, 2045, 2051, 2062, 2073, 2079, 2090 |
2008 | 2036, 2064, 2092 |
2009 | 2015, 2026, 2037, 2043, 2054, 2065, 2071, 2082, 2093, 2099 |
2010 | 2021, 2027, 2038, 2049, 2055, 2066, 2077, 2083, 2094, 2100 |
2012 | 2040, 2068, 2096 |
2016 | 2044, 2072 |
2020 | 2048, 2076 |
2024 | 2052, 2080 |
2028 | 2056, 2084 |