AtCoderTags_Helper

AtCoderTagsへのTag投票を、AtCoder問題ページからTagを選ぶだけで投票できるようにします。

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

You will need to install an extension such as Tampermonkey to install this script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         AtCoderTags_Helper
// @version      2.7
// @author       Null_Null
// @match        https://atcoder.jp/contests/*/tasks/*
// @match        https://*/tasks/*
// @grant        none
// @namespace    https://github.com/null-null-programming/AtCoderTags-Helper
// @description  AtCoderTagsへのTag投票を、AtCoder問題ページからTagを選ぶだけで投票できるようにします。
// ==/UserScript==

$('#copyright').append(`
<style>
    #atcoder-tags-helper > select {
        display: inline-block;
        vertical-align: top;
        width: 230px;
        margin: 0px 5px;
    }
</style>

<div id="atcoder-tags-helper" class="form-inline" style="padding-top: 5rem">
    <select id="tag_parent" class="form-control" name="tag" size="18">
        <option data-subgroup="Easy" value="Easy">Easy</option>
        <option data-subgroup="Ad-Hoc" value="Ad-Hoc">Ad-Hoc</option>
        <option data-subgroup="Searching" value="Searching">Searching</option>
        <option data-subgroup="Greedy-Methods" value="Greedy-Methods">Greedy-Methods</option>
        <option data-subgroup="String" value="String">String</option>
        <option data-subgroup="Mathematics" value="Mathematics">Mathematics</option>
        <option data-subgroup="Technique" value="Technique">Technique</option>
        <option data-subgroup="Construct" value="Construct">Construct</option>
        <option data-subgroup="Graph" value="Graph">Graph</option>
        <option data-subgroup="Dynamic-Programming" value="Dynamic-Programming">Dynamic-Programming</option>
        <option data-subgroup="Data-Structure" value="Data-Structure">Data-Structure</option>
        <option data-subgroup="Game" value="Game">Game</option>
        <option data-subgroup="Flow-Algorithms" value="Flow-Algorithms">Flow-Algorithms</option>
        <option data-subgroup="Geometry" value="Geometry">Geometry</option>
        <option data-subgroup="Interactive" value="Interactive">Interactive</option>
        <option data-subgroup="April-Fool" value="April-Fool">April-Fool</option>
        <option data-subgroup="Marathon" value="Marathon">Marathon</option>
        <option data-subgroup="Other" value="Other">Other</option>
    </select>

    <select id="tag_child" class="form-control" name="tag2" size="18">
        <option data-group="Searching" value="Brute-Force">全探索</option>
        <option data-group="Searching" value="Binary-Search">二分探索</option>
        <option data-group="Searching" value="Ternary-Search">三分探索</option>
        <option data-group="Searching" value="DFS">深さ優先探索</option>
        <option data-group="Searching" value="BFS">幅優先探索</option>
        <option data-group="Searching" value="Bit-Brute-Force">bit全探索</option>
        <option data-group="Searching" value="Heuristic">ヒューリスティック</option>
        <option data-group="Searching" value="Other">その他</option>

        <option data-group="String" value="String-Operation">文字列処理</option>
        <option data-group="String" value="Rolling-Hash">ローリングハッシュ</option>
        <option data-group="String" value="Manacher">Manacher</option>
        <option data-group="String" value="Suffix-Array">Suffix-Array</option>
        <option data-group="String" value="Z-Algorithm">Z-Algorithm</option>
        <option data-group="String" value="Trie">Trie</option>
        <option data-group="String" value="Parsing">構文解析</option>
        <option data-group="String" value="Other">その他</option>

        <option data-group="Mathematics" value="Number">整数</option>
        <option data-group="Mathematics" value="Combinatorics">組み合わせ</option>
        <option data-group="Mathematics" value="Enumerate">数え上げ</option>
        <option data-group="Mathematics" value="Probability">確率</option>
        <option data-group="Mathematics" value="Expected-Value">期待値</option>
        <option data-group="Mathematics" value="Matrix">行列</option>
        <option data-group="Mathematics" value="XOR">XOR</option>
        <option data-group="Mathematics" value="Other">その他</option>

        <option data-group="Technique" value="Sort">ソート</option>
        <option data-group="Technique" value="Simulation">シミュレーション</option>
        <option data-group="Technique" value="Cumulative-Sum">累積和</option>
        <option data-group="Technique" value="imos">imos法</option>
        <option data-group="Technique" value="Two-Pointers">尺取り法</option>
        <option data-group="Technique" value="Recursion">再帰関数</option>
        <option data-group="Technique" value="Compress">座標圧縮</option>
        <option data-group="Technique" value="Split-And-List">半分全列挙</option>
        <option data-group="Technique" value="Square-Division">平方分割</option>
        <option data-group="Technique" value="Divide-And-Conquer">分割統治法</option>
        <option data-group="Technique" value="Doubling">ダブリング</option>
        <option data-group="Technique" value="Randomized-Algorithm">乱択アルゴリズム</option>
        <option data-group="Technique" value="Other">その他</option>

        <option data-group="Graph" value="Shortest-Path">最短経路</option>
        <option data-group="Graph" value="Minimum-Spanning-Tree">最小全域木</option>
        <option data-group="Graph" value="LCA">最小共通祖先</option>
        <option data-group="Graph" value="Strongly-Connected-Components">強連結成分分解</option>
        <option data-group="Graph" value="Topological-Sort">トポロジカルソート</option>
        <option data-group="Graph" value="Euler-Tour">オイラーツアー</option>
        <option data-group="Graph" value="Euler-Path-and-Hamilton-Path">オイラーパス・ハミルトンパス</option>
        <option data-group="Graph" value="HL-Decomposition">HL分解</option>
        <option data-group="Graph" value="Centroid-Decomposition">重心分解</option>
        <option data-group="Graph" value="Check-Tree">木の同型判定</option>
        <option data-group="Graph" value="Kirchhoff">行列木定理</option>
        <option data-group="Graph" value="Two-Edge-Connected-Components">二重辺連結成分分解</option>
        <option data-group="Graph" value="Bi-Connected-Components">二重頂点連結成分分解</option>
        <option data-group="Graph" value="Cycle-Basis">サイクル基底</option>
        <option data-group="Graph" value="dfs-tree">dfs木</option>
        <option data-group="Graph" value="Erdesh">エルデシュガライの定理</option>
        <option data-group="Graph" value="Other">その他</option>

        <option data-group="Dynamic-Programming" value="Simple-DP">基礎DP</option>
        <option data-group="Dynamic-Programming" value="Restore-DP">戻すDP</option>
        <option data-group="Dynamic-Programming" value="String-DP">文字列DP</option>
        <option data-group="Dynamic-Programming" value="Section-DP">区間DP</option>
        <option data-group="Dynamic-Programming" value="Digit-DP">桁DP</option>
        <option data-group="Dynamic-Programming" value="Tree-DP">木DP</option>
        <option data-group="Dynamic-Programming" value="Every-Direction-DP">全方位木DP</option>
        <option data-group="Dynamic-Programming" value="Bit-DP">bitDP</option>
        <option data-group="Dynamic-Programming" value="Probability-DP">確率DP</option>
        <option data-group="Dynamic-Programming" value="Expected-Value-DP">期待値DP</option>
        <option data-group="Dynamic-Programming" value="Insert-DP">挿入DP</option>
        <option data-group="Dynamic-Programming" value="Link-DP">連結DP</option>
        <option data-group="Dynamic-Programming" value="Inline-DP">インラインDP</option>
        <option data-group="Dynamic-Programming" value="Matrix-Power">行列累乗</option>
        <option data-group="Dynamic-Programming" value="CHT">Convex-Hull-Trick</option>
        <option data-group="Dynamic-Programming" value="Monge-DP">Monge-DP</option>
        <option data-group="Dynamic-Programming" value="Alien-DP">Alien-DP</option>
        <option data-group="Dynamic-Programming" value="Kitamasa">きたまさ法</option>
        <option data-group="Dynamic-Programming" value="Other">その他</option>

        <option data-group="Data-Structure" value="stack">stack</option>
        <option data-group="Data-Structure" value="queue">queue</option>
        <option data-group="Data-Structure" value="set">set</option>
        <option data-group="Data-Structure" value="map">map</option>
        <option data-group="Data-Structure" value="deque">deque</option>
        <option data-group="Data-Structure" value="multiset">multiset</option>
        <option data-group="Data-Structure" value="priority_queue">priority_queue</option>
        <option data-group="Data-Structure" value="Union-Find-Tree">Union-Find-Tree</option>
        <option data-group="Data-Structure" value="BIT">Binary-Indexed-Tree</option>
        <option data-group="Data-Structure" value="Segment-Tree">Segment-Tree</option>
        <option data-group="Data-Structure" value="Lazy-Segment-Tree">Lazy-Segment-Tree</option>
        <option data-group="Data-Structure" value="Sparse-Table">Sparse-Table</option>
        <option data-group="Data-Structure" value="WaveletMatrix">WaveletMatrix</option>
        <option data-group="Data-Structure" value="Persistent-Data-Structures">永続データ構造</option>
        <option data-group="Data-Structure" value="Balanced-Tree">平衡二分探索木</option>
        <option data-group="Data-Structure" value="Other">その他</option>

        <option data-group="Game" value="Nim">Nim</option>
        <option data-group="Game" value="Grundy">Grundy数</option>
        <option data-group="Game" value="Backtrack">後退解析</option>
        <option data-group="Game" value="Mini-Max">ミニマックス法</option>
        <option data-group="Game" value="unique">特殊な性質</option>
        <option data-group="Game" value="Other">その他</option>

        <option data-group="Flow-Algorithms" value="Max-Flow">最大流問題</option>
        <option data-group="Flow-Algorithms" value="Min-Cost-Flow">最小費用流問題</option>
        <option data-group="Flow-Algorithms" value="Bipartite-Matching">二部マッチング</option>
        <option data-group="Flow-Algorithms" value="Min-Cut">最小カット</option>
        <option data-group="Flow-Algorithms" value="Burn">燃やす埋める</option>
        <option data-group="Flow-Algorithms" value="Other">その他</option>

        <option data-group="Geometry" value="Convex-Hull">凸包</option>
        <option data-group="Geometry" value="Declination-Sorting">偏角ソート</option>
        <option data-group="Geometry" value="Voronoi-Diagram">ボロノイ図</option>
        <option data-group="Geometry" value="Three-D">三次元</option>
        <option data-group="Geometry" value="Other">その他</option>
    </select>
    <br>
    <br>

    <input id="atcoder_tag_vote" type="submit" value="Submit" class="btn btn-primary">
</div>
`);

function getContestName() {
  const contestURL = location.href;
  const contestArray = contestURL.split('/');
  return contestArray[contestArray.length - 1];
}

function enableNestedChoice(parentSelect, childSelect) {
  $(parentSelect).change(function () {
    var subgroup = $(this).find('option:selected').attr('data-subgroup');

    $(childSelect).find("option").each(function (index, element) {
      var group = $(element).attr('data-group');

      if (subgroup === group) {
        $(element).show();
      } else {
        $(element).hide();
      }
    });

    $(childSelect).val('').change();
  });
}

$('#atcoder_tag_vote').click(function () {
  const parent_tag = $('#tag_parent').val();
  const child_tag = $('#tag_child').val();
  const problem_id = getContestName();

  const url = `https://atcoder-tags.herokuapp.com/vote_result?problem_id=${problem_id}&tag=${parent_tag}&tag2=${child_tag}`;
  window.open(url);
});

enableNestedChoice('#tag_parent', '#tag_child');

$('#tag_parent').val('').change();
$('#tag_child').val('').change();