カウンター F#:どう書く?org - 13日の金曜日を数え上げる - Gushwell's F# Programming Diary

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()
Published 2010年7月28日 21:23 gushwell

コメント

このBlogに対するコメントはありません

コメントを残す

(必須) 
(必須) 
(オプション)
(必須)