Пример #1
0
 /// <summary>
 /// コンテスト情報を更新するか
 /// </summary>
 /// <param name="old">前の情報のコンテスト</param>
 /// <returns>更新するべきか</returns>
 public bool ShouldUpdate(Contest old)
 {
     return((Name == old.Name) && (old.StartTime != StartTime || old.EndTime != EndTime));
 }
Пример #2
0
        /// <summary>
        /// Atcoderのコンテスト情報を取得する
        /// </summary>
        /// <returns>新しいAtcoderのコンテスト</returns>
        public List <Contest> GetAtcoderNewContests(List <Contest> OldContests)
        {
            List <Contest> contests = new List <Contest>();

            HomePage = Scraping("https://atcoder.jp/?lang=ja", "utf-8");

            //予定されたコンテスト部分の情報を取得
            if (HomePage != null)
            {
                var nodes = HomePage.DocumentNode.SelectNodes("//div[2]/table[@class='table table-default table-striped table-hover table-condensed']/tbody/tr/td[2]/small/a")
                            .Select(a => new
                {
                    Link = a.Attributes["href"].Value.Trim(),
                    Name = a.InnerText.Trim(),
                });

                //予定されたコンテスト部が存在するか確認
                string title = HomePage.DocumentNode.SelectSingleNode("//h4[2]").InnerText;
                if (!title.Contains("終了"))
                {
                    Contest con = new Contest();
                    foreach (var node in nodes.Take(nodes.Count()))
                    {
                        con = new Contest();

                        // リンクと名前を追加
                        con.Link = node.Link;
                        con.Name = node.Name;


                        // 開始時間と終了時間を取得
                        ContestPage = new HtmlDocument();

                        string html = "";
                        try
                        {
                            WebClient wc = new WebClient();
                            html = wc.DownloadString(con.Link);
                            ContestPage.LoadHtml(html);
                        }
                        catch
                        {
                            Console.WriteLine("--- URLが正しく読み取ることが出来ませんでした\a");
                        }

                        try
                        {
                            var StartTime = ContestPage.DocumentNode.SelectSingleNode(@"//*[@id='contest-start-time']");
                            var EndTime   = ContestPage.DocumentNode.SelectSingleNode(@"//*[@id='contest-end-time']");

                            // 開始時間と終了時間を追加
                            con.StartTime = DateTime.Parse(StartTime.InnerText);
                            con.EndTime   = DateTime.Parse(EndTime.InnerText);

                            // 新しいコンテストを追加
                            contests.Add(con);

                            // それっぽく
                            Console.Write(".");
                        }
                        catch (NullReferenceException)
                        {
                            Console.WriteLine("コンテストを追加できませんでした。");
                            Console.WriteLine(" ------- " + con.Name);
                            Console.WriteLine(" ------- " + con.Link);
                            Console.WriteLine(" ------- " + con.StartToEnd);
                        }
                    }
                }
            }
            else
            {
                Console.WriteLine(" ---- コンテストを取得できませんでした。");
            }

            Console.WriteLine();

            Dictionary <string, string> Names = new Dictionary <string, string>();

            Names.Add("AtCoder Beginner Contest", "ABC");
            Names.Add("AtCoder Regular Contest", "ARC");
            Names.Add("AtCoder Grand Contest", "AGC");

            // コンテスト名をABC,ARC,AGCに短縮
            for (int i = 0; i < contests.Count(); i++)
            {
                string name = contests[i].Name;

                foreach (var ShortName in Names)
                {
                    name = name.Replace(ShortName.Key, ShortName.Value);
                }

                contests[i].Name = name;
            }

            // コンテストをまとめる
            contests = SumContest(contests);

            // 既存のコンテストなら追加しない
            for (int i = 0; i < OldContests.Count; i++)
            {
                contests.Remove(OldContests[i]);
            }

            return(contests);
        }