diff --git a/aufgaben/src/Pflichtuebung_01/Date.elm b/aufgaben/src/Pflichtuebung_01/Date.elm index fb8240f..5f11b8c 100644 --- a/aufgaben/src/Pflichtuebung_01/Date.elm +++ b/aufgaben/src/Pflichtuebung_01/Date.elm @@ -46,21 +46,49 @@ toString (a,b,c) = (if a < 10 then "0" ++ String.fromInt(a) else String.fromInt( else if c < 100 then "00" ++ String.fromInt(c) else if c < 1000 then "0" ++ String.fromInt(c) else String.fromInt(c)) --- TT.MM.YYYY + + +-- https://web.archive.org/web/20170507133619/https://alcor.concordia.ca/~gpkatch/gdate-algorithm.html + +convertDateToDayNumber : Date -> Int +convertDateToDayNumber (a, b, c) = + let m = (modBy 12 (b + 9)) + y = c - m // 10 + in 365 * y + y // 4 - y // 100 + y // 400 + (m * 306 + 5) // 10 + ( a - 1 ) + +convertDayNumberToDate : Int -> Date +convertDayNumberToDate g = + let y = (10000 * g + 14780) // 3652425 + ddd = g - (365 * y + y // 4 - y // 100 + y // 400) + in + if (ddd < 0) then + let y2 = y - 1 -- y = y2 + ddd2 = g - (365 * y2 + y2 // 4 - y2 // 100 + y2 // 400) -- ddd = ddd2 + mi = (100 * ddd2 + 52) // 3060 + mm = (modBy (12) (mi + 2)) + 1 + y3 = y2 + (mi + 2) // 12 -- y = y3 + dd = ddd2 - (mi * 306 + 5) // 10 + 1 + in (dd, mm, y3) + else + let mi = (100 * ddd + 52) // 3060 + mm = (modBy (12) (mi + 2)) + 1 + y2 = y + (mi + 2) // 12 -- y = y2 + dd = ddd - (mi * 306 + 5) // 10 + 1 + in (dd, mm, y2) + +-- 1 Punkt: +leapyear : Year -> Bool +leapyear y = ((modBy 4 y == 0) && (modBy 100 y /= 0)) || (modBy 400 y == 0) -- 2 Punkte: next : Date -> Date -next date = (1, 1, 1) +next date = convertDayNumberToDate ((convertDateToDayNumber date) + 1) -- 2 Punkte: prev : Date -> Date -prev date = (1, 1, 1) - --- 1 Punkt: -leapyear : Year -> Bool -leapyear y = False +prev date = convertDayNumberToDate ((convertDateToDayNumber date) - 1) -- 2 Punkte: sub : Date -> Date -> Int -sub date1 date2 = 0 +sub date1 date2 = convertDateToDayNumber date1 - convertDateToDayNumber date2 diff --git a/aufgaben/tests/Pflichtuebung_01/DateTests.elm b/aufgaben/tests/Pflichtuebung_01/DateTests.elm index e70a25d..23a24c6 100644 --- a/aufgaben/tests/Pflichtuebung_01/DateTests.elm +++ b/aufgaben/tests/Pflichtuebung_01/DateTests.elm @@ -155,10 +155,6 @@ leapYearTest = Expect.equal False (leapyear 2022) ] --- sub a b soll die Anzahl der Tage liefern, die zwischen den Daten a und b liegt. Wenn a --- vor b liegt, soll das Ergebnis negativ sein, sonst positiv (außer a und b sind gleich, dann soll --- das Ergebnis 0 sein). - subTest : Test subTest = describe "sub test"