Find the last Sunday of each month: Difference between revisions

m
(Moved Algol 68 to the correct place)
Line 2,230:
 
=={{header|Haskell}}==
<lang Haskell>import Data.Time.CalendarList (find, intercalate, transpose)
(Day, addDays, fromGregorian, gregorianMonthLength, showGregorian)
import Data.Time.Calendar.WeekDate (toWeekDate)
import Data.List (find, intercalate, transpose)
import Data.Maybe (fromJust)
import Data.Time.Calendar
( Day,
addDays,
fromGregorian,
(fromGregorian year <*> gregorianMonthLength year) <$>,
showGregorian,
)
import Data.Time.Calendar.WeekDate (toWeekDate)
 
---------------- LAST SUNDAY OF EACH MONTH ---------------
-- [1 .. 7] for [Mon .. Sun]
findWeekDay :: Int -> Day -> Day
findWeekDay dayOfWeek date =
fromJust $
find
(\x ->
let (_, _, day) = toWeekDate x
in dayOfWeek == day)
((`addDays` date) <$> [-6 .. 0])
 
lastSundayOfEachMonth = lastWeekDayDates 7
weekDayDates :: Int -> Integer -> [String]
weekDayDates dayOfWeek year =
(showGregorian . findWeekDay dayOfWeek) .
(fromGregorian year <*> gregorianMonthLength year) <$>
[1 .. 12]
 
--------------------------- TEST -------------------------
main :: IO ()
main =
mapM_
putStrLn
( intercalate " " <$> transpose (weekDayDates 7 <$> [2013 .. 2017]))</lang>
<$> transpose
(lastSundayOfEachMonth <$> [2013 .. 2017])
)
 
------------------- NEAREST DAY OF WEEK ------------------
 
weekDayDateslastWeekDayDates :: Int -> Integer -> [String]
weekDayDateslastWeekDayDates dayOfWeek year =
(showGregorian . findWeekDaymostRecentWeekday dayOfWeek) .
. (fromGregorian year <*> gregorianMonthLength year)
<$> [1 .. 12]
 
findWeekDaymostRecentWeekday :: Int -> Day -> Day
findWeekDaymostRecentWeekday dayOfWeek date =
fromJust $
(find p ((`addDays` date) <$> [-6 .. 0]))
where
(\p x ->=
let (_, _, day) = toWeekDate x
in dayOfWeek == day)</lang>
{{Out}}
<pre>2018-01-28 2019-01-27 2020-01-26 2021-01-31 2022-01-30 2023-01-29
9,655

edits