CF解题数据可视化

显示某人Codeforces每个难度过了多少题,每个标签占比

目前为 2023-04-30 提交的版本。查看 最新版本

// ==UserScript==
// @name         CF解题数据可视化
// @name:en      codeforces analytics
// @namespace    https://codeforces.com/profile/tongwentao
// @version      1.1.0
// @description  显示某人Codeforces每个难度过了多少题,每个标签占比
// @description:en Analyse Codeforces profiles
// @author       tongwentao
// @match        https://codeforces.com/profile/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/echarts.min.js
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    function drawChart(res){
        var div='<div class="roundbox userActivityRoundBox borderTopRound borderBottomRound" id="twtschart1" style="height:400px;"></div>';
        document.getElementById('pageContent').insertAdjacentHTML('beforeend',div);

        var chartDom = document.getElementById('twtschart1');
        var myChart = echarts.init(chartDom);
        var option;
        var key;

        var xData1=[];
        var yData1=[];
        xData1=Object.keys(res.rating);
        for(key in xData1){
            yData1.push(res.rating[xData1[key]]);
        }
        option = {
            tooltip: {
                trigger: 'axis',
                axisPointer: {
                  type: 'shadow'
                }
              },
              grid: {
                left: '3%',
                right: '4%',
                bottom: '3%',
                containLabel: true
              },
              xAxis: [
                {
                  type: 'category',
                  data: xData1,
                  axisTick: {
                    alignWithLabel: true
                  }
                }
              ],
              yAxis: [
                {
                  type: 'value'
                }
              ],
              series: [
                {
                  name: 'solved',
                  type: 'bar',
                  barWidth: '60%',
                  data: yData1
                }
              ]
        };

        option && myChart.setOption(option);

        div='<div class="roundbox userActivityRoundBox borderTopRound borderBottomRound" id="twtschart2" style="height:400px;"></div>';
        document.getElementById('pageContent').insertAdjacentHTML('beforeend',div);
        chartDom = document.getElementById('twtschart2');
        myChart = echarts.init(chartDom);
        var data2=[];
        for(key in res.tags){
          var tag=res.tags[key];
          data2.push({value:tag,name:key});
        }
        option = {
          tooltip: {
            trigger: 'item',
            formatter: '{a} <br/>{b} : {c} ({d}%)'
          },
          legend: {
            type: 'scroll',
            orient: 'vertical',
            right: 10,
            top: 20,
            bottom: 20,
            data: Object.keys(res.tags)
          },
          series: [
            {
              name: 'tag',
              type: 'pie',
              radius: '55%',
              center: ['40%', '50%'],
              data: data2,
              emphasis: {
                itemStyle: {
                  shadowBlur: 10,
                  shadowOffsetX: 0,
                  shadowColor: 'rgba(0, 0, 0, 0.5)'
                }
              }
            }
          ]
        };

        option && myChart.setOption(option);
    }

    var pathname = window.location.pathname;
    var handle = pathname.substring(pathname.lastIndexOf('/') + 1, pathname.length);
    var httpRequest = new XMLHttpRequest();
        httpRequest.open('GET', 'https://codeforces.com/api/user.status?handle='+handle, true);
        httpRequest.send();
        httpRequest.onreadystatechange = function () {
            if (httpRequest.readyState == 4 && httpRequest.status == 200) {
                var json=JSON.parse(httpRequest.responseText);
                var result=[];
                result=json.result;;
                var res={rating:{},tags:{}};
                for(var key in result){
                    if(result[key].verdict==="OK"){
                        var rating=result[key].problem.rating;
                        var tags=result[key].problem.tags;
                        if(rating in res.rating){
                            res.rating[rating]++;
                        }
                        else{
                            res.rating[rating]=1;
                        }
                        for(var key2 in tags){
                          var tag=tags[key2];
                          if(tag in res.tags){
                            res.tags[tag]++;
                          }
                          else{
                            res.tags[tag]=1;
                          }
                        }
                    }
                }
                console.log(res);
                drawChart(res);
            }
        };


})();