F#:どう書く?org - 13日の金曜日を数え上げる
どう書く?org の 13日の金曜日を数え上げる をF#で挑戦です。
.NET Framework の DateTime構造体をつかっています。
get13thList で、13日のシーケンスを作り出し、そこから、filterで 金曜日だけを抜き出し、 takeWhileで、指定した日付までを取得しています。
初めは、ref つかったり、mutableつかったりしましたが、結局、使わずに書けました。
効率無視して、すべての日を調べるコードにすれば、もっと短く簡潔に書けると思います。
今の効率のまま、短くする方法はちょっと考え付きませんでした。
open System
let get13thList(date:DateTime) =
let dt = if date.Day > 13
then (new DateTime(date.Year, date.Month, 13)).AddMonths(1)
else new DateTime(date.Year, date.Month, 13)
seq { for m in 0..(Int32.MaxValue) -> dt.AddMonths(m) }
let friday13th(fromDate:DateTime, toDate:DateTime) =
get13thList(fromDate) |> Seq.filter (fun d -> d.DayOfWeek = DayOfWeek.Friday)
|> Seq.takeWhile(fun d -> d <= toDate)
let Main() =
let list = friday13th(DateTime.Today,new DateTime(2013,12,31))
list |> Seq.iter (fun d -> printfn "%s" (d.ToShortDateString()))
Seq.length(list) |> printfn "%d days"
do Main()