Standings atCoderColor

正解率を表示します.コンテスト参加者の色(Rating)別の

  1. // ==UserScript==
  2. // @name Standings atCoderColor
  3. // @namespace http://tampermonkey.net/
  4. // @version 2.1
  5. // @description 正解率を表示します.コンテスト参加者の色(Rating)別の
  6. // @author Shobonvip
  7. // @match https://atcoder.jp/*standings*
  8. // @exclude https://atcoder.jp/*standings/json
  9. // @grant none
  10. // @license MIT
  11. // ==/UserScript==
  12. $(function () {
  13. // RGBからカラーコードに変換する
  14. function rgb2hex ( rgb ) {
  15. return "#" + rgb.map( function ( value ) {
  16. return ( "0" + value.toString( 16 ) ).slice( -2 ) ;
  17. }).join( "" ) ;
  18. }
  19. // 詳細か否か
  20. let detailmode = 0;
  21. // 表を先頭に追加
  22. $("#vue-standings").prepend(`<div><button class="btn btn-default" id="colorstanding-detail">詳細に切り替え</button><button class="btn btn-default" id="colorstanding-off">非表示</button><table id="accs-table" class="table table-bordered table-hover th-center td-middle"><thead></thead><tbody></tbody></table></div>`);
  23. // 表の更新
  24. function update () {
  25. vueStandings.$watch("standings", function (new_val, old_val) {
  26. if (!new_val) {
  27. return;
  28. }
  29. let task = new_val.TaskInfo;
  30. let data = new_val.StandingsData;
  31. let ratecolor = ["#000000", "#666666", "#663300", "#006600", "#009999", "#0000cc", "#cc9900", "#ff9900", "#ff3333"];
  32. let ratename = ["黒", "灰", "茶", "緑", "水", "青", "黄", "橙", "赤"]
  33. let ratelist = [1, 400, 800, 1200, 1600, 2000, 2400, 2800, 9999];
  34. if (detailmode == 1){
  35. ratelist = [1, 33, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200, 3300, 3400, 3500, 3600, 9999];
  36. ratename = ["0", "1", "33", "100", "200", "300", "400", "500", "600", "700", "800", "900", "1000", "1100", "1200", "1300", "1400", "1500", "1600", "1700", "1800", "1900", "2000", "2100", "2200", "2300", "2400", "2500", "2600", "2700", "2800", "2900", "3000", "3100", "3200", "3300", "3400", "3500", "金"];
  37. ratecolor = ["#000000", "#666666", "#666666", "#666666", "#666666", "#666666", "#663300", "#663300", "#663300", "#663300", "#006600", "#006600", "#006600", "#006600", "#009999", "#009999", "#009999", "#009999", "#0000cc", "#0000cc", "#0000cc", "#0000cc", "#cc9900", "#cc9900", "#cc9900", "#cc9900", "#ff9900", "#ff9900", "#ff9900", "#ff9900", "#ff3333", "#ff3333", "#ff3333", "#ff3333", "#990000", "#990000", "#990000", "#990000", "#461900"];
  38. }
  39. // コンテスト前とコンテスト後ではjsonの挙動が違う
  40. let ratingmode = 0;
  41. for (let cnt = 0; cnt < data.length; cnt++) {
  42. if (data[cnt]["TotalResult"]["Count"] >= 1) {
  43. if (data[cnt]["OldRating"] > 0) {
  44. ratingmode = 1;
  45. break;
  46. }
  47. }
  48. }
  49. let nowrating = "Rating";
  50. if (ratingmode == 1) {
  51. nowrating = "OldRating"
  52. }
  53. // 参加者一覧の表を作る
  54. let contestant = [];
  55. for (let i = 0; i < ratelist.length; i++) {
  56. contestant.push([]);
  57. }
  58. // 参加者カウント
  59. for (let cnt = 0; cnt < data.length; cnt++) {
  60. for (let color = 0; color < ratelist.length; color++){
  61. if (data[cnt]["TotalResult"]["Count"] >= 1) {
  62. if (data[cnt][nowrating] < ratelist[color]) {
  63. contestant[color].push(cnt);
  64. break;
  65. }
  66. }
  67. }
  68. }
  69. // 配列の用意
  70. var colordata = [];
  71. for (let i = 0; i < task.length; i++) {
  72. colordata.push([]);
  73. for (let j = 0; j < ratelist.length; j++) {
  74. colordata[i].push(0);
  75. }
  76. }
  77. var colornum = [];
  78. for (let i = 0; i < ratelist.length; i++) {
  79. colornum[i] = contestant[i].length;
  80. }
  81. // 色別の正解数を取得
  82. for (let colors = 0; colors < contestant.length; colors++) {
  83. for (let cnt = 0; cnt < task.length; cnt++) {
  84. let probid = task[cnt].TaskScreenName;
  85. for (let player = 0; player < contestant[colors].length; player++) {
  86. try {
  87. if (data[contestant[colors][player]]["TaskResults"][probid]["Status"] === 1) {
  88. colordata[cnt][colors] += 1;
  89. }
  90. } catch {
  91. null;
  92. }
  93. }
  94. }
  95. }
  96. // 表の先頭
  97. let t = `<tr style="font-weight: bold;"><td align="center">Rate</td><td align="center">参加者数</td>`;
  98. for (let i = 0; i < task.length; i++) {
  99. t += `<td align="center">` + task[i].Assignment + `</td>`;
  100. }
  101. t += `</tr>`;
  102. // 表の途中
  103. for (let colors = 0; colors < ratecolor.length; colors++) {
  104. t += `<tr><td align="center" style="padding: 2px;"><font color="` + ratecolor[colors] + `"><b>` + ratename[colors] + `</b></td><td align="right">` + colornum[colors] + `</td>`;
  105. for (let i = 0; i < task.length; i++) {
  106. // 正解率を求める
  107. let dat = 0;
  108. if (colornum[colors] != 0) {
  109. dat = colordata[i][colors] / colornum[colors];
  110. }
  111. // 正解率によって背景色を定める
  112. let targ = 0;
  113. let cr = 0;
  114. let cg = 0;
  115. let cb = 0;
  116. if (dat >= 0.9) {
  117. targ = (1-dat)*1000;
  118. cr = Math.floor(255-targ);
  119. cg = 255;
  120. cb = Math.floor(155+targ);
  121. } else if (dat >= 0.75) {
  122. targ = (0.9-dat)/1.5*1000;
  123. cr = 155;
  124. cg = 255;
  125. cb = Math.floor(255-targ);
  126. } else if (dat >= 0.5) {
  127. targ = (0.75-dat)/2.5*1000;
  128. cr = Math.floor(155+targ);
  129. cg = Math.floor(255-targ*0.5);
  130. cb = 155;
  131. } else if (dat >= 0.25) {
  132. targ = (0.5-dat)/2.5*1000;
  133. cr = Math.floor(255-targ*0.5);
  134. cg = 205;
  135. cb = Math.floor(155+targ*0.5);
  136. } else if (dat >= 0.05) {
  137. targ = (0.25-dat)/2*1000;
  138. cr = Math.floor(205-targ*0.5);
  139. cg = Math.floor(205-targ*0.5);
  140. cb = Math.floor(205-targ*0.5);
  141. } else {
  142. targ = (0.05-dat)/0.5*1000;
  143. cr = Math.floor(155-targ*0.2);
  144. cg = Math.floor(155-targ*0.2);
  145. cb = Math.floor(155-targ*0.2);
  146. }
  147. t += `<td align="right" bgcolor="` + rgb2hex( [cr, cg, cb] ) + `">` + (dat*100).toFixed(2) + `%</td>`;
  148. }
  149. t += `</tr>`;
  150. }
  151. $("#accs-table > tbody").empty();
  152. $("#accs-table > tbody").append(t);
  153. }, { deep: true, immediate: true });
  154. }
  155. update();
  156. document.getElementById("colorstanding-detail").addEventListener("click", () => {
  157. detailmode = 1 - detailmode
  158. update();
  159. });
  160. document.getElementById("colorstanding-off").addEventListener("click", () => {
  161. $("#accs-table > tbody").empty();
  162. });
  163. });

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址