在 CPE 歷屆試題網頁顯示難度星級及該題 vjudge 連結

難度星級取自官方資料

// ==UserScript==
// @name         在 CPE 歷屆試題網頁顯示難度星級及該題 vjudge 連結
// @namespace    https://github.com/zica87/self-made-userscipts
// @version      1.0
// @description  難度星級取自官方資料
// @author       zica
// @match        https://cpe.cse.nsysu.edu.tw/cpe/test_data/problems
// @grant        none
// @license      GPL-3.0
// ==/UserScript==

(function () {
    "use strict";

    // place main code above the long mapping
    // eliminate the trouble to scroll over it to view the main coden
    function main_code() {
        const tables = document.getElementsByTagName("tbody");
        for (const table of tables) {
            for (let i = 1; i < table.children.length; ++i) {
                const td = table.children[i].firstElementChild;
                if (td.tagName != "TD") {
                    continue;
                }
                const problem_title = td.firstElementChild;
                const number = problem_title.textContent.match(/\d+/)[0];
                const star = document.createElement("span");
                star.textContent =
                    star_table[number] === undefined
                        ? "❓"
                        : star_table[number] +
                          " " +
                          "🌟".repeat(star_table[number]);
                problem_title.before(star);

                const vjudge_a = document.createElement("a");
                Object.assign(vjudge_a, {
                    href: "https://vjudge.net/problem/UVA-" + number,
                    textContent: "vjudge",
                    target: "_blank",
                });
                // copied from the page
                td.append("\n\t\t\t\t\t/\n\t\t\t\t\t");
                td.append(vjudge_a);
            }
        }
    }
    const star_table = {
        100: "1",
        105: "1",
        108: "2",
        118: "1",
        122: "3",
        136: "1",
        141: "1",
        145: "1",
        147: "4",
        151: "2",
        160: "2",
        165: "4",
        166: "4",
        240: "4",
        242: "3",
        245: "2",
        255: "2",
        256: "1",
        263: "1",
        264: "1",
        272: "1",
        288: "4",
        294: "2",
        299: "1",
        300: "2",
        302: "4",
        305: "1",
        315: "3",
        337: "2",
        340: "2",
        374: "2",
        378: "2",
        380: "2",
        382: "1",
        386: "1",
        389: "1",
        397: "2",
        401: "1",
        406: "2",
        409: "1",
        437: "4",
        439: "2",
        455: "1",
        458: "1",
        476: "1",
        481: "4",
        482: "1",
        490: "1",
        494: "1",
        495: "2",
        496: "1",
        499: "1",
        501: "3",
        514: "2",
        516: "2",
        532: "3",
        534: "2",
        536: "2",
        540: "2",
        544: "3",
        572: "2",
        573: "1",
        579: "1",
        580: "3",
        591: "1",
        612: "2",
        615: "2",
        630: "1",
        657: "2",
        674: "3",
        679: "2",
        686: "2",
        696: "2",
        706: "1",
        709: "4",
        714: "4",
        719: "4",
        722: "2",
        725: "1",
        737: "1",
        748: "2",
        753: "4",
        763: "1",
        793: "3",
        798: "3",
        815: "2",
        820: "4",
        821: "2",
        855: "2",
        865: "1",
        900: "2",
        908: "3",
        913: "1",
        924: "2",
        926: "3",
        928: "3",
        929: "3",
        941: "3",
        948: "1",
        967: "2",
        991: "2",
        993: "2",
        997: "2",
        1101: "4",
        1118: "2",
        1200: "2",
        1208: "3",
        1210: "2",
        1225: "1",
        1237: "1",
        1260: "1",
        1262: "2",
        1292: "4",
        1316: "2",
        1339: "1",
        1366: "3",
        1368: "1",
        1513: "4",
        1585: "1",
        1587: "1",
        1632: "3",
        1640: "2",
        1644: "2",
        1650: "4",
        1730: "3",
        1746: "3",
        1753: "2",
        1757: "3",
        10000: "3",
        10001: "2",
        10002: "2",
        10003: "3",
        10004: "2",
        10005: "3",
        10006: "2",
        10007: "3",
        10008: "1",
        10009: "2",
        10010: "2",
        10011: "3",
        10012: "3",
        10013: "2",
        10014: "2",
        10015: "2",
        10016: "2",
        10017: "2",
        10018: "1",
        10019: "1",
        10020: "2",
        10021: "5",
        10022: "3",
        10023: "3",
        10024: "3",
        10025: "3",
        10026: "3",
        10027: "3",
        10028: "2",
        10029: "4",
        10030: "2",
        10031: "3",
        10032: "4",
        10033: "3",
        10034: "2",
        10035: "1",
        10036: "3",
        10037: "3",
        10038: "1",
        10039: "2",
        10040: "2",
        10041: "1",
        10042: "3",
        10043: "3",
        10044: "3",
        10045: "3",
        10047: "3",
        10048: "3",
        10049: "3",
        10050: "1",
        10051: "4",
        10052: "3",
        10053: "3",
        10054: "3",
        10055: "1",
        10056: "1",
        10057: "1",
        10058: "3",
        10059: "5",
        10060: "2",
        10061: "3",
        10062: "1",
        10063: "2",
        10064: "2",
        10065: "4",
        10066: "2",
        10067: "4",
        10068: "4",
        10069: "3",
        10070: "2",
        10071: "1",
        10072: "3",
        10073: "4",
        10074: "3",
        10075: "4",
        10076: "3",
        10077: "2",
        10078: "2",
        10079: "1",
        10080: "4",
        10081: "3",
        10082: "1",
        10083: "3",
        10084: "5",
        10085: "4",
        10086: "4",
        10087: "4",
        10088: "3",
        10089: "4",
        10090: "4",
        10091: "4",
        10092: "4",
        10093: "1",
        10094: "4",
        10095: "4",
        10096: "3",
        10097: "3",
        10098: "2",
        10099: "3",
        10100: "2",
        10101: "1",
        10102: "2",
        10103: "4",
        10104: "2",
        10105: "3",
        10106: "2",
        10107: "1",
        10108: "3",
        10109: "3",
        10110: "2",
        10111: "4",
        10112: "3",
        10113: "3",
        10114: "2",
        10115: "2",
        10116: "2",
        10117: "3",
        10118: "4",
        10119: "5",
        10120: "5",
        10121: "4",
        10123: "3",
        10124: "3",
        10125: "2",
        10126: "1",
        10127: "2",
        10128: "4",
        10129: "3",
        10130: "3",
        10131: "3",
        10132: "3",
        10133: "4",
        10134: "3",
        10135: "3",
        10136: "3",
        10137: "2",
        10138: "2",
        10139: "3",
        10140: "2",
        10141: "2",
        10142: "2",
        10143: "4",
        10144: "3",
        10145: "2",
        10146: "2",
        10147: "3",
        10148: "3",
        10149: "5",
        10150: "3",
        10151: "3",
        10152: "2",
        10153: "3",
        10154: "4",
        10155: "3",
        10156: "1",
        10157: "3",
        10158: "3",
        10159: "3",
        10160: "2",
        10161: "2",
        10162: "4",
        10163: "4",
        10164: "3",
        10165: "3",
        10166: "4",
        10167: "2",
        10168: "4",
        10169: "3",
        10170: "1",
        10171: "3",
        10172: "2",
        10173: "4",
        10174: "2",
        10175: "3",
        10176: "2",
        10177: "3",
        10178: "3",
        10179: "3",
        10180: "2",
        10181: "3",
        10182: "2",
        10183: "3",
        10184: "3",
        10185: "4",
        10186: "3",
        10187: "3",
        10188: "1",
        10189: "1",
        10190: "1",
        10191: "1",
        10192: "2",
        10193: "2",
        10194: "2",
        10195: "2",
        10196: "2",
        10197: "2",
        10198: "3",
        10199: "3",
        10200: "2",
        10201: "3",
        10202: "3",
        10203: "2",
        10204: "4",
        10205: "2",
        10206: "5",
        10207: "3",
        10208: "4",
        10209: "1",
        10210: "3",
        10211: "4",
        10212: "3",
        10213: "3",
        10214: "3",
        10215: "1",
        10216: "3",
        10217: "3",
        10218: "4",
        10219: "3",
        10220: "2",
        10221: "1",
        10222: "1",
        10223: "2",
        10224: "4",
        10225: "2",
        10226: "1",
        10227: "2",
        10228: "3",
        10229: "4",
        10230: "3",
        10231: "3",
        10232: "3",
        10233: "2",
        10234: "3",
        10235: "1",
        10236: "2",
        10237: "4",
        10238: "2",
        10239: "4",
        10240: "3",
        10241: "3",
        10242: "1",
        10243: "3",
        10244: "4",
        10245: "3",
        10246: "3",
        10247: "3",
        10248: "3",
        10249: "4",
        10250: "3",
        10251: "3",
        10252: "2",
        10253: "4",
        10254: "4",
        10255: "3",
        10256: "2",
        10257: "1",
        10258: "1",
        10259: "3",
        10260: "1",
        10261: "3",
        10262: "3",
        10263: "2",
        10264: "2",
        10265: "3",
        10266: "2",
        10267: "2",
        10268: "1",
        10269: "3",
        10270: "5",
        10271: "3",
        10272: "4",
        10273: "3",
        10274: "4",
        10275: "4",
        10276: "3",
        10277: "3",
        10278: "3",
        10279: "1",
        10280: "3",
        10281: "1",
        10282: "1",
        10283: "2",
        10284: "2",
        10285: "3",
        10286: "2",
        10287: "2",
        10288: "3",
        10289: "2",
        10290: "4",
        10291: "4",
        10292: "4",
        10293: "2",
        10294: "4",
        10295: "2",
        10296: "4",
        10297: "2",
        10298: "2",
        10299: "2",
        10300: "1",
        10301: "2",
        10302: "2",
        10303: "3",
        10304: "3",
        10305: "2",
        10306: "3",
        10307: "3",
        10308: "3",
        10309: "4",
        10310: "1",
        10311: "2",
        10312: "3",
        10313: "3",
        10314: "4",
        10315: "2",
        10316: "3",
        10317: "3",
        10318: "4",
        10319: "4",
        10320: "3",
        10321: "4",
        10322: "2",
        10323: "1",
        10324: "1",
        10325: "2",
        10326: "2",
        10327: "2",
        10328: "3",
        10329: "3",
        10330: "5",
        10331: "3",
        10332: "3",
        10333: "2",
        10334: "2",
        10335: "3",
        10336: "2",
        10337: "3",
        10338: "2",
        10339: "2",
        10340: "1",
        10341: "2",
        10342: "3",
        10343: "2",
        10344: "2",
        10345: "2",
        10346: "1",
        10347: "2",
        10348: "2",
        10349: "3",
        10350: "2",
        10351: "3",
        10352: "2",
        10353: "3",
        10354: "3",
        10356: "3",
        10360: "2",
        10364: "4",
        10368: "2",
        10369: "3",
        10370: "1",
        10371: "2",
        10372: "2",
        10373: "3",
        10382: "2",
        10393: "1",
        10394: "3",
        10396: "4",
        10397: "3",
        10400: "3",
        10401: "3",
        10404: "4",
        10405: "2",
        10406: "2",
        10407: "2",
        10408: "2",
        10409: "1",
        10415: "1",
        10418: "5",
        10419: "4",
        10420: "1",
        10424: "1",
        10427: "2",
        10429: "3",
        10432: "2",
        10433: "3",
        10439: "3",
        10440: "2",
        10443: "1",
        10450: "2",
        10465: "3",
        10466: "2",
        10468: "3",
        10469: "1",
        10473: "1",
        10474: "1",
        10478: "3",
        10482: "3",
        10487: "1",
        10489: "2",
        10494: "2",
        10496: "3",
        10497: "2",
        10499: "1",
        10502: "3",
        10504: "2",
        10508: "2",
        10515: "3",
        10520: "3",
        10523: "2",
        10527: "2",
        10533: "2",
        10534: "4",
        10535: "2",
        10539: "3",
        10541: "3",
        10550: "1",
        10555: "3",
        10563: "2",
        10571: "4",
        10573: "1",
        10574: "3",
        10579: "2",
        10583: "2",
        10585: "1",
        10591: "1",
        10596: "2",
        10599: "4",
        10600: "3",
        10606: "3",
        10608: "2",
        10611: "2",
        10615: "5",
        10625: "2",
        10626: "3",
        10627: "4",
        10633: "1",
        10635: "4",
        10637: "3",
        10642: "1",
        10664: "3",
        10666: "2",
        10670: "2",
        10672: "3",
        10673: "2",
        10678: "1",
        10679: "3",
        10684: "2",
        10696: "1",
        10699: "1",
        10700: "2",
        10701: "3",
        10702: "3",
        10703: "1",
        10710: "3",
        10714: "1",
        10718: "2",
        10721: "3",
        10724: "3",
        10730: "2",
        10738: "2",
        10739: "3",
        10763: "2",
        10783: "1",
        10789: "1",
        10791: "3",
        10793: "3",
        10800: "2",
        10801: "3",
        10802: "3",
        10810: "3",
        10812: "1",
        10813: "1",
        10815: "2",
        10819: "3",
        10820: "2",
        10821: "3",
        10856: "3",
        10858: "2",
        10859: "3",
        10862: "4",
        10871: "2",
        10879: "1",
        10881: "2",
        10887: "2",
        10888: "4",
        10891: "3",
        10898: "3",
        10900: "4",
        10901: "2",
        10902: "2",
        10903: "1",
        10904: "5",
        10905: "3",
        10908: "1",
        10909: "4",
        10910: "2",
        10911: "3",
        10912: "3",
        10913: "4",
        10914: "4",
        10915: "2",
        10916: "2",
        10917: "3",
        10918: "3",
        10919: "1",
        10920: "2",
        10921: "1",
        10922: "1",
        10923: "4",
        10924: "2",
        10925: "1",
        10926: "2",
        10927: "3",
        10929: "1",
        10930: "2",
        10931: "1",
        10934: "3",
        10935: "1",
        10936: "2",
        10938: "2",
        10940: "2",
        10942: "1",
        10944: "4",
        10945: "1",
        10949: "4",
        10954: "3",
        10959: "2",
        10963: "3",
        10968: "3",
        10970: "1",
        10978: "1",
        10981: "4",
        10985: "4",
        10986: "3",
        10990: "4",
        10994: "1",
        11000: "1",
        11001: "1",
        11002: "3",
        11003: "4",
        11004: "3",
        11005: "1",
        11006: "3",
        11007: "5",
        11008: "4",
        11010: "4",
        11011: "3",
        11012: "4",
        11013: "2",
        11014: "5",
        11015: "3",
        11018: "3",
        11019: "5",
        11020: "3",
        11021: "3",
        11022: "3",
        11023: "4",
        11024: "3",
        11025: "4",
        11026: "3",
        11027: "3",
        11029: "3",
        11030: "3",
        11031: "3",
        11032: "4",
        11033: "3",
        11034: "1",
        11035: "3",
        11036: "3",
        11037: "4",
        11038: "3",
        11039: "2",
        11040: "2",
        11041: "4",
        11042: "1",
        11043: "2",
        11044: "1",
        11045: "3",
        11046: "5",
        11047: "3",
        11048: "3",
        11049: "3",
        11050: "5",
        11051: "2",
        11052: "3",
        11053: "3",
        11054: "1",
        11055: "3",
        11056: "2",
        11057: "2",
        11058: "1",
        11059: "1",
        11060: "3",
        11061: "4",
        11063: "1",
        11064: "3",
        11066: "3",
        11067: "2",
        11069: "3",
        11071: "4",
        11072: "3",
        11073: "4",
        11076: "2",
        11077: "3",
        11078: "2",
        11080: "3",
        11081: "5",
        11082: "4",
        11083: "4",
        11084: "3",
        11085: "4",
        11086: "2",
        11088: "3",
        11089: "4",
        11092: "3",
        11093: "2",
        11094: "2",
        11095: "3",
        11096: "2",
        11097: "4",
        11098: "5",
        11099: "4",
        11115: "2",
        11121: "2",
        11149: "4",
        11150: "1",
        11151: "3",
        11157: "2",
        11159: "4",
        11166: "3",
        11172: "1",
        11185: "1",
        11192: "1",
        11198: "4",
        11200: "3",
        11204: "1",
        11212: "3",
        11218: "3",
        11219: "1",
        11228: "3",
        11233: "1",
        11235: "2",
        11237: "4",
        11240: "2",
        11241: "2",
        11258: "3",
        11259: "4",
        11264: "2",
        11284: "4",
        11286: "2",
        11287: "2",
        11297: "4",
        11307: "4",
        11308: "2",
        11309: "1",
        11310: "3",
        11311: "3",
        11312: "4",
        11313: "1",
        11314: "3",
        11316: "4",
        11317: "4",
        11319: "3",
        11321: "1",
        11324: "4",
        11326: "2",
        11327: "3",
        11330: "3",
        11331: "4",
        11332: "1",
        11335: "2",
        11336: "3",
        11340: "2",
        11341: "4",
        11342: "1",
        11343: "1",
        11344: "2",
        11345: "1",
        11346: "3",
        11347: "3",
        11348: "2",
        11349: "1",
        11350: "2",
        11351: "3",
        11352: "3",
        11353: "3",
        11354: "3",
        11360: "2",
        11364: "1",
        11367: "3",
        11368: "3",
        11369: "2",
        11377: "3",
        11387: "1",
        11388: "1",
        11389: "1",
        11396: "2",
        11400: "4",
        11401: "4",
        11402: "4",
        11403: "2",
        11404: "4",
        11405: "4",
        11407: "3",
        11408: "4",
        11410: "3",
        11411: "4",
        11412: "2",
        11413: "4",
        11414: "3",
        11415: "4",
        11417: "2",
        11418: "2",
        11419: "5",
        11420: "3",
        11421: "4",
        11422: "4",
        11424: "4",
        11426: "4",
        11427: "4",
        11428: "1",
        11430: "4",
        11436: "4",
        11450: "3",
        11455: "1",
        11456: "4",
        11461: "1",
        11462: "2",
        11463: "3",
        11464: "4",
        11465: "4",
        11466: "3",
        11467: "5",
        11470: "1",
        11471: "4",
        11472: "4",
        11475: "2",
        11479: "1",
        11480: "2",
        11481: "3",
        11482: "1",
        11483: "1",
        11484: "2",
        11485: "4",
        11486: "4",
        11487: "3",
        11488: "3",
        11489: "2",
        11490: "3",
        11494: "1",
        11495: "3",
        11498: "1",
        11502: "4",
        11503: "3",
        11504: "4",
        11505: "2",
        11506: "4",
        11507: "2",
        11508: "2",
        11512: "4",
        11513: "3",
        11515: "2",
        11516: "3",
        11517: "3",
        11518: "2",
        11519: "2",
        11520: "2",
        11523: "3",
        11534: "3",
        11536: "2",
        11538: "2",
        11541: "1",
        11547: "1",
        11550: "2",
        11583: "2",
        11584: "3",
        11585: "3",
        11586: "2",
        11597: "1",
        11603: "3",
        11608: "1",
        11609: "2",
        11614: "2",
        11615: "2",
        11616: "2",
        11617: "4",
        11621: "1",
        11624: "4",
        11629: "2",
        11631: "3",
        11632: "3",
        11633: "3",
        11634: "1",
        11635: "3",
        11636: "1",
        11639: "1",
        11650: "1",
        11654: "3",
        11655: "3",
        11658: "3",
        11659: "4",
        11660: "1",
        11661: "1",
        11677: "1",
        11678: "1",
        11683: "2",
        11689: "1",
        11690: "3",
        11691: "3",
        11692: "2",
        11696: "4",
        11703: "2",
        11713: "1",
        11714: "2",
        11716: "1",
        11726: "3",
        11727: "1",
        11728: "1",
        11729: "2",
        11730: "2",
        11732: "3",
        11733: "3",
        11734: "1",
        11742: "2",
        11743: "1",
        11747: "3",
        11748: "3",
        11764: "1",
        11770: "4",
        11777: "1",
        11782: "3",
        11792: "3",
        11799: "0",
        11824: "1",
        11827: "1",
        11830: "1",
        11838: "3",
        11841: "3",
        11847: "2",
        11849: "2",
        11850: "2",
        11854: "1",
        11871: "4",
        11875: "1",
        11879: "2",
        11898: "2",
        11900: "1",
        11908: "3",
        11909: "1",
        11917: "1",
        11922: "5",
        11933: "1",
        11934: "1",
        11936: "1",
        11942: "1",
        11945: "1",
        11946: "1",
        11953: "2",
        11957: "2",
        11960: "2",
        11965: "1",
        11984: "1",
        11985: "4",
        11987: "3",
        11988: "1",
        11991: "2",
        11995: "2",
        11997: "2",
        12015: "1",
        12019: "1",
        12030: "5",
        12034: "3",
        12041: "4",
        12075: "5",
        12092: "5",
        12136: "1",
        12149: "1",
        12160: "2",
        12195: "1",
        12207: "2",
        12208: "3",
        12218: "2",
        12223: "4",
        12289: "1",
        12293: "3",
        12296: "3",
        12299: "4",
        12319: "3",
        12335: "3",
        12372: "1",
        12376: "3",
        12382: "2",
        12385: "3",
        12390: "3",
        12403: "1",
        12405: "1",
        12406: "2",
        12416: "1",
        12439: "1",
        12455: "2",
        12468: "1",
        12478: "1",
        12503: "1",
        12507: "3",
        12532: "4",
        12544: "3",
        12545: "2",
        12546: "3",
        12578: "1",
        12582: "3",
        12592: "2",
        12602: "1",
        12611: "1",
        12621: "3",
        12626: "1",
        12627: "3",
        12640: "1",
        12650: "1",
        12654: "3",
        12694: "2",
        12705: "2",
        12797: "2",
        12820: "1",
        12821: "4",
        12844: "2",
        12869: "2",
        12875: "3",
        12908: "1",
        12911: "4",
        12918: "2",
        12959: "1",
        12970: "1",
        13055: "1",
        13171: "1",
        13185: "1",
        13190: "1",
        13194: "2",
        13257: "2",
    };
    main_code();
})();