AtCoder Sample Downloader

AtCoderのサンプルをダウンロードするボタンを追加

  1. // ==UserScript==
  2. // @name AtCoder Sample Downloader
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.2
  5. // @description AtCoderのサンプルをダウンロードするボタンを追加
  6. // @author y-i
  7. // @match https://atcoder.jp/contests/*/tasks/*
  8. // @grant none
  9. // @require https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.0/FileSaver.min.js
  10. // @require https://cdnjs.cloudflare.com/ajax/libs/jszip/3.6.0/jszip.min.js
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. 'use strict';
  15.  
  16. const problemName = location.href.split('/').pop();
  17.  
  18. const titleElem = document.querySelector('.row > div > .h2');
  19. if (!titleElem) return;
  20.  
  21. const dlBtn = document.createElement('a');
  22. dlBtn.classList.add('btn', 'btn-default', 'btn-sm');
  23. dlBtn.textContent = 'Sample DL';
  24. titleElem.appendChild(dlBtn);
  25.  
  26. dlBtn.addEventListener('click', async e => {
  27. e.preventDefault();
  28.  
  29. const samples = Array.from(document.querySelectorAll('[id^="pre-sample"]')).map(el => el.innerText);
  30. const n = samples.length;
  31.  
  32. const zip = new JSZip();
  33.  
  34. for (let i = 0; i < n; ++i) {
  35. const sampleNum = (i - i % 2) / 2;
  36. const inOut = i % 2 ? 'out' : 'in';
  37. const filename = `sample-${sampleNum}.${inOut}`;
  38.  
  39. zip.file(filename, samples[i]);
  40. }
  41.  
  42. const content = await zip.generateAsync({type:"blob"});
  43. saveAs(content,`${problemName}.zip`);
  44. });
  45. })();

QingJ © 2025

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