2014年07月20日

C#で13日の金曜日を数え上げる

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その26

■問題 (出題者:takano32 さん)
今日から2013年12月31日までの、13日の金曜日とその総数を表示してください。 余力のあるものはこのプログラムを短くしてみたり、短くしてみたり、短くしてください。
オリジナル:http://ll.jus.or.jp/2008/program/doukaku.html


最後の「余力のあるものは...」の部分は無視しています。
引き数ひとつのEnumFriday13は、指定日以降の13日の金曜日を無限に列挙しています。これを呼び出す引き数2つのメソッドで、TakeWhileを使い有限個にしています。
なお、もう2013年12月31日は過ぎてしまったので、2015年12月31日までとしています。
ついでに、引き数ひとつのEnumFriday13を利用し、2014年1月1日以降の 13日の金曜日を10個まで求めています。

結果は載せませんので、答えが知りたい方は是非実行してみてください。

■C#で書いたコード
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            var list = EnumFriday13(DateTime.Today, new DateTime(2015, 12, 31)).ToList();           
            foreach (var d in list)
                Console.WriteLine(d.ToShortDateString());
            Console.WriteLine("{0} days", list.Count());
            Console.ReadLine();

            var list2 = EnumFriday13(new DateTime(2014, 1, 1)).Take(10).ToList();
            foreach (var d in list2)
                Console.WriteLine(d.ToShortDateString());
            Console.WriteLine("{0} days", list2.Count());
            Console.ReadLine();
       
        }

        // 引き数 fromDateからtoDateの間の 13日の金曜日を列挙する
        static IEnumerable<DateTime> EnumFriday13(DateTime fromDate, DateTime toDate) {
            return EnumFriday13(fromDate).TakeWhile(d => d <= toDate);
        }

        // 引き数 date以降の 13日の金曜日を列挙する
        static IEnumerable<DateTime> EnumFriday13(DateTime date) {
            if (date.Day > 13)
                date = date.AddMonths(1);
            date = new DateTime(date.Year, date.Month, 13);
            while (true) {
                if (date.DayOfWeek == DayOfWeek.Friday) {
                    yield return date;
                }
                date = date.AddMonths(1);
            }
        }
    }
}



 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52377890