CF解题数据可视化

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

目前為 2023-04-30 提交的版本,檢視 最新版本

// ==UserScript==
// @name         CF解题数据可视化
// @name:en      codeforces analytics
// @namespace    https://codeforces.com/profile/tongwentao
// @version      1.1.1
// @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});
      }
      data2.sort(function(nextValue,currentValue){
        if(nextValue.value<currentValue.value)
          return 1;
        else if(nextValue.value>currentValue.value)
          return -1;
        return 0;
      });
      var data22=[];
      for(key in data2){
        data22.push(data2[key].name);
      }
      option = {
        tooltip: {
          trigger: 'item',
          formatter: '{a} <br/>{b} : {c} ({d}%)'
        },
        legend: {
          type: 'scroll',
          orient: 'vertical', 
          right: 10,
          top: 20,
          bottom: 20,
          data: data22
        },
        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);
          }
      };


})();