public static Round ParseRoundWithXML(XmlNode node) { Round round = new Round(); Dictionary<string, string> dict = XmlHelper.ParseXml(node); round.roundID = dict["round_id"]; round.name = dict["short_name"]; round.name = Regex.Replace(round.name, "Single Round Match", "SRM"); round.type = dict["round_type_desc"]; round.fullname = dict["full_name"]; round.date = dict["date"]; round.roundIndex = ind++; return round; }
/*static List<Round> ReadRounds(Dictionary<String, Round> roundInfo) { string roundsFileName = "NewRounds.txt"; List<Round> rounds = new List<Round>(); StreamReader reader = new StreamReader(roundsFileName); while (!reader.EndOfStream) { string s = reader.ReadLine(); rounds.Add(roundInfo[s]); } reader.Close(); return rounds; }*/ static void UpdateRound(Round round, Dictionary<String, String> ZJUers, List<Round> tour, List<Round> srm, Dictionary<String, CoderStat> stats, List<Record> ratingRecordList, List<Record> challengeInfoList, List<Record> volRecordList, List<Record> divWinnerList, List<Record> onsiteList, Dictionary<CoderStat, List<Record>> coderInfo) { string URL = "http://www.topcoder.com/tc?module=BasicData&c=dd_round_results&rd=" + round.roundID; XmlDocument xml = XmlHelper.LoadXML(URL, round.roundID + ".xml"); if (xml == null) { return; } XmlNode rootNode = xml.LastChild; List<Coder> div1 = new List<Coder>(), div2 = new List<Coder>(); foreach (XmlNode node in rootNode.ChildNodes) { Coder coder = Coder.ParseCoderWithXML(node); if (coder != null && ZJUers.Keys.Contains(coder.handle)) { coder.id = ZJUers[coder.handle]; CoderStat coderStat = null; Record record = new Record(); record.coder = coder; record.round = round; if (stats.Keys.Contains(coder.id)) { coderStat = stats[coder.id]; coderStat.UpdateStat(coder, round); coderInfo[coderStat].Add(record); } else { coderStat = CoderStat.NewCoderStat(coder, round); stats.Add(coder.id, coderStat); coderInfo[coderStat] = new List<Record>(); coderInfo[coderStat].Add(record); } if (coder.division == 1) { foreach (Coder other in div1) { coderStat.DualWith(coder, other); stats[other.id].DualWith(other, coder); } div1.Add(coder); } else { foreach (Coder other in div2) { coderStat.DualWith(coder, other); stats[other.id].DualWith(other, coder); } div2.Add(coder); } if (Convert.ToDouble(coder.challengePoints) > 0) { challengeInfoList.Add(record); } if (ratingRecordList.Count == 0 || coder.newRating > ratingRecordList.Last().coder.newRating) { ratingRecordList.Add(record); } if (coder.vol >= 600) { volRecordList.Add(record); } if (coder.divRank == 1) { divWinnerList.Add(record); } if (IsOnsite(round.name)) { onsiteList.Add(record); } } } if (div1.Count != 0 || div2.Count != 0) { div1.Sort(new Comparison<Coder>(Coder.CompareByRank)); div2.Sort(new Comparison<Coder>(Coder.CompareByRank)); HTMLGenerator.GenerateHTMLForRound(round, div1, div2); if (round.type.Equals("Single Round Match")) { srm.Add(round); } else { tour.Add(round); } } }
public void UpdateStat(Coder coder, Round round) { total_challenges += coder.fail_challenges + coder.succ_challenges; succ_challenges += coder.succ_challenges; rating = coder.newRating; maxrating = Math.Max(maxrating, coder.newRating); vol = coder.vol; chaPoints += Convert.ToDouble(coder.challengePoints); myLastDate = round.date; ++events; if (!HTMLGenerator.RatingToString(coder.oldRating, coder.newCoder).Equals(HTMLGenerator.RatingToString(coder.newRating, false))) { ++colorChangeTimes; } if (DateTime.Parse(round.date).AddYears(1) >= DateTime.Now) { ++eventsLastYear; } for (int i = 0; i < 3; ++i) { if (coder.problemStatus[i].Equals("Challenge Succeeded") || coder.problemStatus[i].Equals("Failed System Test")) { ++submits; } else if (coder.problemStatus[i].Equals("Passed System Test")) { ++submits; ++solves; } } }
public static void GenerateHTMLForRound(Round round, List<Coder> div1, List<Coder> div2) { string dire = Directory.GetCurrentDirectory(); string rankFile = dire + "\\rank\\" + round.roundID + ".html"; FileStream stream = new FileStream(rankFile, FileMode.Create); StreamWriter writer = new StreamWriter(stream); writer.WriteLine("<html><body>"); writer.WriteLine("<head><meta http-equiv=Content-Type content=\"text/html; charset=utf-8\">"); writer.WriteLine("<title>" + round.name + "</title><link rel=\"stylesheet\" href=\"rank.css\" type=\"text/css\" /></head>"); writer.WriteLine("<h1><a href=\"http://www.topcoder.com/stat?c=round_stats&rd=" + round.roundID + "\" class=\"eventText\">" + round.name + "</a></h1>"); if (div1.Count != 0) { writer.WriteLine("<div>"); writer.WriteLine("<h2>Div 1</h2>"); writer.WriteLine("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tbody>"); writer.WriteLine("\t<tr class=\"titleLine\">"); writer.WriteLine("\t\t<td><span>Rank</span></td>"); writer.WriteLine("\t\t<td><span>Handle</span></td>"); writer.WriteLine("\t\t<td><span>Points</span></td>"); if (!round.type.Equals("Single Round Match")) writer.WriteLine("\t\t<td><span>Advanced</span></td>"); writer.WriteLine("\t\t<td><span>Level 1</span></td>"); writer.WriteLine("\t\t<td><span>Level 2</span></td>"); writer.WriteLine("\t\t<td><span>Level 3</span></td>"); writer.WriteLine("\t\t<td><span>Challenge</span></td>"); writer.WriteLine("\t\t<td><span>Challenge Points</span></td>"); writer.WriteLine("\t\t<td><span>Old Rating</span></td>"); writer.WriteLine("\t\t<td><span>New Rating</span></td>"); writer.WriteLine("\t\t<td><span>Rating Change</span></td>"); writer.WriteLine("\t\t<td><span>Volatility</span></td>"); writer.WriteLine("\t</tr>"); foreach (Coder coder in div1) { writer.WriteLine("\t<tr>"); writer.WriteLine("\t\t<td><a href=\"http://www.topcoder.com/stat?c=coder_room_stats&rd=" + round.roundID + "&cr=" + coder.id + "\">" + coder.divRank + "</a></td>"); writer.WriteLine("\t\t<td><a href=\"../member/" + coder.id + ".html\" class=\"" + ColorToString(coder.colortype) + "\">" + coder.handle + "</a></td>"); writer.WriteLine("\t\t<td><span>" + coder.finalPoints + "</span></td>"); if (!round.type.Equals("Single Round Match")) writer.WriteLine("\t\t<td><span>" + coder.advanced + "</span></td>"); writer.WriteLine("\t\t<td><span class=\"" + StatusToString(coder.problemStatus[0]) + "\">" + (coder.problemStatus[0].Equals("Passed System Test") ? coder.problemPoints[0] : coder.problemStatus[0]) + "</span></td>"); writer.WriteLine("\t\t<td><span class=\"" + StatusToString(coder.problemStatus[1]) + "\">" + (coder.problemStatus[1].Equals("Passed System Test") ? coder.problemPoints[1] : coder.problemStatus[1]) + "</span></td>"); writer.WriteLine("\t\t<td><span class=\"" + StatusToString(coder.problemStatus[2]) + "\">" + (coder.problemStatus[2].Equals("Passed System Test") ? coder.problemPoints[2] : coder.problemStatus[2]) + "</span></td>"); writer.WriteLine("\t\t<td><span>" + (coder.succ_challenges > 0 ? "+" : "") + coder.succ_challenges + "/" + (coder.fail_challenges > 0 ? "-" : "") + coder.fail_challenges + "</span></td>"); writer.WriteLine("\t\t<td><span class=\"" + ChallengeScoreToString(coder.challengePoints) + "\">" + coder.challengePoints + "</span></td>"); writer.WriteLine("\t\t<td><span class=\"" + RatingToString(coder.oldRating, coder.newCoder) + "\">" + coder.oldRating + "</span></td>"); writer.WriteLine("\t\t<td><span class=\"" + RatingToString(coder.newRating, false) + "\">" + coder.newRating + "</span></td>"); writer.WriteLine("\t\t<td><span class=\"" + RatingChangeToString(coder.newRating - coder.oldRating) + "\">" + RatingChangeToImage(coder.newRating - coder.oldRating) + Math.Abs(coder.newRating - coder.oldRating) + "</span></td>"); writer.WriteLine("\t\t<td><span>" + coder.vol + "</span></td>"); writer.WriteLine("\t</tr>"); } writer.WriteLine("</tbody></table></div>"); } if (div2.Count != 0) { writer.WriteLine("<div>"); writer.WriteLine("<h2>Div 2</h2>"); writer.WriteLine("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tbody>"); writer.WriteLine("\t<tr class=\"titleLine\">"); writer.WriteLine("\t\t<td><span>Rank</span></td>"); writer.WriteLine("\t\t<td><span>Handle</span></td>"); writer.WriteLine("\t\t<td><span>Points</span></td>"); if (!round.type.Equals("Single Round Match")) writer.WriteLine("\t\t<td><span>Advanced</span></td>"); writer.WriteLine("\t\t<td><span>Level 1</span></td>"); writer.WriteLine("\t\t<td><span>Level 2</span></td>"); writer.WriteLine("\t\t<td><span>Level 3</span></td>"); writer.WriteLine("\t\t<td><span>Challenge</span></td>"); writer.WriteLine("\t\t<td><span>Challenge Points</span></td>"); writer.WriteLine("\t\t<td><span>Old Rating</span></td>"); writer.WriteLine("\t\t<td><span>New Rating</span></td>"); writer.WriteLine("\t\t<td><span>Rating Change</span></td>"); writer.WriteLine("\t\t<td><span>Volatility</span></td>"); writer.WriteLine("\t</tr>"); foreach (Coder coder in div2) { writer.WriteLine("\t<tr>"); writer.WriteLine("\t\t<td><a href=\"http://www.topcoder.com/stat?c=coder_room_stats&rd=" + round.roundID + "&cr=" + coder.id + "\">" + coder.divRank + "</a></td>"); writer.WriteLine("\t\t<td><a href=\"../member/" + coder.id + ".html\" class=\"" + ColorToString(coder.colortype) + "\">" + coder.handle + "</a></td>"); writer.WriteLine("\t\t<td><span>" + coder.finalPoints + "</span></td>"); if (!round.type.Equals("Single Round Match")) writer.WriteLine("\t\t<td><span>" + coder.advanced + "</span></td>"); writer.WriteLine("\t\t<td><span class=\"" + StatusToString(coder.problemStatus[0]) + "\">" + (coder.problemStatus[0].Equals("Passed System Test") ? coder.problemPoints[0] : coder.problemStatus[0]) + "</span></td>"); writer.WriteLine("\t\t<td><span class=\"" + StatusToString(coder.problemStatus[1]) + "\">" + (coder.problemStatus[1].Equals("Passed System Test") ? coder.problemPoints[1] : coder.problemStatus[1]) + "</span></td>"); writer.WriteLine("\t\t<td><span class=\"" + StatusToString(coder.problemStatus[2]) + "\">" + (coder.problemStatus[2].Equals("Passed System Test") ? coder.problemPoints[2] : coder.problemStatus[2]) + "</span></td>"); writer.WriteLine("\t\t<td><span>" + (coder.succ_challenges > 0 ? "+" : "") + coder.succ_challenges + "/" + (coder.fail_challenges > 0 ? "-" : "") + coder.fail_challenges + "</span></td>"); writer.WriteLine("\t\t<td><span class=\"" + ChallengeScoreToString(coder.challengePoints) + "\">" + coder.challengePoints + "</span></td>"); writer.WriteLine("\t\t<td><span class=\"" + RatingToString(coder.oldRating, coder.newCoder) + "\">" + coder.oldRating + "</span></td>"); writer.WriteLine("\t\t<td><span class=\"" + RatingToString(coder.newRating, false) + "\">" + coder.newRating + "</span></td>"); writer.WriteLine("\t\t<td><span class=\"" + RatingChangeToString(coder.newRating - coder.oldRating) + "\">" + RatingChangeToImage(coder.newRating - coder.oldRating) + Math.Abs(coder.newRating - coder.oldRating) + "</span></td>"); writer.WriteLine("\t\t<td><span>" + coder.vol + "</span></td>"); writer.WriteLine("\t</tr>"); } writer.WriteLine("</tbody></table></div>"); } writer.WriteLine("<div class=\"backDiv\">"); writer.WriteLine("<h3><a href=\"../ZJUerXTCer.html\" class=\"backLink\">Back to homepage</h3>"); writer.WriteLine("</div>"); writer.WriteLine("</body></html>"); writer.Close(); stream.Close(); }
public static CoderStat NewCoderStat(Coder coder, Round round) { CoderStat coderStat = new CoderStat(); coderStat.handle = coder.handle; coderStat.id = coder.id; coderStat.win = new Dictionary<string, int>(); coderStat.lose = new Dictionary<string, int>(); coderStat.deuce = new Dictionary<string, int>(); coderStat.UpdateStat(coder, round); return coderStat; }