AtCoder Submission Status

AtCoderで提出した解答がいくつのテストケースでACか, WAか...が一目でわかるように表示する

2019-05-30 يوللانغان نەشرى. ئەڭ يېڭى نەشرىنى كۆرۈش.

  1. // ==UserScript==
  2. // @name AtCoder Submission Status
  3. // @name:en AtCoder Submission Status
  4. // @namespace https://github.com/9sako6/atcoder-userscripts
  5. // @version 0.4
  6. // @description AtCoderで提出した解答がいくつのテストケースでACか, WAか...が一目でわかるように表示する
  7. // @description:en This script shows submission's statuses clearly!
  8. // @author 9sako6
  9. // @match https://atcoder.jp/contests/*/submissions/*
  10. // @exclude https://atcoder.jp/contests/*/submissions/me
  11. // @require http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js
  12. // @license MIT
  13. // @supportURL https://github.com/9sako6/atcoder-userscripts/issues
  14. // ==/UserScript==
  15.  
  16. function makeTable() {
  17. 'use strict';
  18. /**
  19. * count each status
  20. */
  21. const statusPanel = document.getElementsByClassName('panel-default')[2];
  22. const cases = $(statusPanel).find('tr');
  23. const statusCodes = [];
  24. let countAll = -1;
  25. let counter = {};
  26. // initialize counter
  27. statusCodes.forEach((val) => {
  28. counter[val] = 0;
  29. });
  30. cases.each((_, elem)=>{
  31. let texts = $(elem).find('td');
  32. texts.each((i, tdElem)=>{
  33. if (i == 1) { // if tdElem is status code
  34. const statusCode = $($(tdElem).find('span')[0]).text();
  35. if (!statusCodes.includes(statusCode)){
  36. statusCodes.push(statusCode);
  37. }
  38. (counter[statusCode] === undefined ? counter[statusCode] = 1 : counter[statusCode] += 1);
  39. }
  40. });
  41. countAll += 1;
  42. });
  43. statusCodes.sort();
  44.  
  45. /**
  46. * make result table
  47. */
  48. // a wrapper element of table
  49. let wrapElem = document.createElement('div');
  50. wrapElem.id = 'added-result-panel';
  51. wrapElem.classList.add('panel', 'panel-default');
  52. var newContent = document.createTextNode('');
  53. wrapElem.appendChild(newContent);
  54. statusPanel.parentNode.insertBefore(wrapElem, statusPanel);
  55.  
  56. // table
  57. let trElem = '<tr>';
  58. statusCodes.forEach((status, i) => {
  59. const ACflag = (status === 'AC' ? true : false);
  60. const label = `<span
  61. class="label label-${ACflag ? 'success' : 'warning'}"
  62. aria-hidden="true"
  63. data-toggle="tooltip"
  64. data-placement="top"
  65. title=""
  66. >${status}</span>`;
  67.  
  68. trElem += `<td style="line-height: 1.2em; text-align: center"><span>${label}</span></td>`;
  69. });
  70.  
  71. trElem += '</tr><tr>';
  72. statusCodes.forEach((statusCode, i) => {
  73. trElem += `<td style="line-height: 1.2em; text-align: center">
  74. <span>${counter[statusCode]}/${countAll}</span></td>`;
  75. });
  76. trElem += '</tr>';
  77. const resultTable = `<table class="table table-bordered table-striped th-center">
  78. <tbody>${trElem}</tbody>
  79. </table>`;
  80. $('#added-result-panel').append(resultTable);
  81. }
  82.  
  83. (function() {
  84. try {
  85. makeTable();
  86. }catch(e){
  87. console.error();
  88. }
  89. })();