Greasy Fork is available in English.

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.3
  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. // ==/UserScript==
  14.  
  15. function makeTable() {
  16. 'use strict';
  17. /**
  18. * count each status
  19. */
  20. const statusPanel = document.getElementsByClassName('panel-default')[2];
  21. const cases = $(statusPanel).find('tr');
  22. const statusCodes = [];
  23. let countAll = -1;
  24. let counter = {};
  25. // initialize counter
  26. statusCodes.forEach((val) => {
  27. counter[val] = 0;
  28. });
  29. cases.each((_, elem)=>{
  30. let texts = $(elem).find('td');
  31. texts.each((i, tdElem)=>{
  32. if (i == 1) { // if tdElem is status code
  33. const statusCode = $($(tdElem).find('span')[0]).text();
  34. if (!statusCodes.includes(statusCode)){
  35. statusCodes.push(statusCode);
  36. }
  37. (counter[statusCode] === undefined ? counter[statusCode] = 1 : counter[statusCode] += 1);
  38. }
  39. });
  40. countAll += 1;
  41. });
  42. statusCodes.sort();
  43.  
  44. /**
  45. * make result table
  46. */
  47. // a wrapper element of table
  48. let wrapElem = document.createElement('div');
  49. wrapElem.id = 'added-result-panel';
  50. wrapElem.classList.add('panel', 'panel-default');
  51. var newContent = document.createTextNode('');
  52. wrapElem.appendChild(newContent);
  53. statusPanel.parentNode.insertBefore(wrapElem, statusPanel);
  54.  
  55. // table
  56. let trElem = '<tr>';
  57. statusCodes.forEach((status, i) => {
  58. const ACflag = (status === 'AC' ? true : false);
  59. const label = `<span
  60. class="label label-${ACflag ? 'success' : 'warning'}"
  61. aria-hidden="true"
  62. data-toggle="tooltip"
  63. data-placement="top"
  64. title=""
  65. >${status}</span>`;
  66.  
  67. trElem += `<td style="line-height: 1.2em; text-align: center"><span>${label}</span></td>`;
  68. });
  69.  
  70. trElem += '</tr><tr>';
  71. statusCodes.forEach((statusCode, i) => {
  72. trElem += `<td style="line-height: 1.2em; text-align: center">
  73. <span>${counter[statusCode]}/${countAll}</span></td>`;
  74. });
  75. trElem += '</tr>';
  76. const resultTable = `<table class="table table-bordered table-striped th-center">
  77. <tbody>${trElem}</tbody>
  78. </table>`;
  79. $('#added-result-panel').append(resultTable);
  80. }
  81.  
  82. (function() {
  83. try {
  84. makeTable();
  85. }catch(e){
  86. console.error();
  87. }
  88. })();