Five weekends: Difference between revisions

m
Line 3,177:
 
====Using Data.Time====
<lang haskell>import Data.TimeList (Day, fromGregorian, gregorianMonthLengthintercalate)
import Data.Time.Calendar.WeekDate (toWeekDate)
import Data.List.Split (chunksOf)
import Data.ListTime (intercalateDay, fromGregorian, gregorianMonthLength)
import Data.Time.Calendar.WeekDate (toWeekDate)
 
---------------- MONTHS WITH FIVE WEEKENDS ---------------
 
-- MONTHS WITH FIVE WEEKENDS --------------------------------------------------
fiveFridayMonths :: Integer -> [(Integer, Int)]
fiveFridayMonths y =
[1 .. 12] >>=
>>= \m ->
[ (y, m)
| isFriday (fromGregorian y m 1) ,
, gregorianMonthLength y m 31 == 31gregorianMonthLength ]y m
xs]
 
isFriday :: Day -> Bool
isFriday d = 5 == day
where
let (_, _, day) = toWeekDate d
in (_, _, day) == 5toWeekDate d
 
-- TEST ---------------------------------------------- TEST -------------------------
main :: IO ()
main = do
Line 3,205:
lean =
concat $
zipWith
(\months year -> [year | null months])
[ yearxs
| null months ])years
xs
years
n = (length . concat) xs
(putStrLn . intercalate "\n\n")
[ "How many five-weekend months 1900-2100 ?",
, '\t' : show n,
, "First five ?",
, '\t' : show (concat (take 5 xs)),
, "Last five ?",
, '\t' : show (concat (drop (n - 5) xs)),
, "How many lean years ? (No five-weekend months)",
, '\t' : show (length lean),
, "Which years are lean ?",
unlines
, unlines (('\t' :) <$> fmap (unwords . fmap show) (chunksOf 5 lean))
( ('\t' :)
<$> fmap
, unlines (('\t' :) <$> fmap (unwords . fmap show) (chunksOf 5 lean))
(chunksOf 5 lean)
years)
]</lang>
{{Out}}
9,655

edits