かんプリンの学習記録

勉強したことについてメモしています. 主に競技プログラミングの問題の解説やってます.

競プロ用のツールを作ってみた

この記事は競プロ Advent Calendar 2023 16日目 のために作成されました。

ランダム生成ツール

作ったものはこちらです。
https://kanpurin.github.io/RandomGenerator/

使用する場面としては、コンテスト中などで適当なランダムデータが欲しいときなどに自分でランダムケースを作成するのが面倒な場合など?
APIとかはないのでプログラムに組み込んで実験するとかはできません。机上での実験や大きいサイズの入力例などで用いてください。
サーバにデータを送って計算してるわけではないので何度も生成しても大丈夫です。


生成するデータは以下のものになっています。

数列 (下限)以上(上限)以下の整数を一様ランダムに {N} 個生成(重複を許すか指定可能)
{1\leq N\leq 5\times 10^5}
{-10^{18}\leq} (下限) {\leq} (上限) {\leq 10^{18}}
単調増加数列 (下限)以上(上限)以下の整数からなる長さ{N} の単調増加数列を一様ランダムに生成
{1\leq N\leq 3\times 10^5}
括弧列 長さ {2N} の括弧列を一様ランダムに生成
{1\leq N\leq 10^5}
ラベル付き木 頂点数 {N} のラベル付き木を一様ランダムに生成
{1\leq N\leq 2\times 10^5}
単純グラフ 頂点数 {N} 辺数 {M} の単純グラフを一様ランダムに生成
{1\leq N\leq 2\times 10^5}
{0\leq M\leq \min(2\times 10^5,N(N-1)/2)}
単純連結グラフ 頂点数 {N} 辺数 {M} の単純連結グラフをランダムに生成
{1\leq N\leq 2\times 10^5}
{N-1\leq M\leq \min(2\times 10^5,N(N-1)/2)}
素数 (下限)以上(上限)以下の素数を一様ランダムに生成
{2\leq} (下限) {\leq} (上限) {\leq 10^{18}}

生成手法は以下の記事にまとめています。

kanpurin.hatenablog.com

使い方

  • "N M"を先頭に付ける:頂点数N、辺数Mを先頭に付けます。競プロでよく見るデータの与えられ方です。
  • Seed値を設定する:通常は毎回ランダムにデータが生成されますが、これをONにするとSeed値ごとに生成されるデータが決まります。
  • グラフを描画する:グラフを可視化します。頂点が多いときはONにしないでください。

N, Mに適切な値を入れて生成ボタンを押すと下のtextareaにデータが生成されます。
値が適切でない場合は生成ボタンがクリックできません。
textareaの右上にあるボタンをクリックするとコピーすることもできます。

Mが大きくとも生成を高速に行うため、textareaに表示するデータ量に制限を付けています。
末尾が`...`となっていますが、コピーボタンによりデータ全体をクリップボードにコピーできます。

グラフ可視化ツール

作ったものはこちらです。
https://kanpurin.github.io/GraphVisualizer/

使用する場面としては入力例として与えられたグラフがどのような形なのか見たいとき、可視化されたグラフを編集したいときなど。
グラフ可視化アプリは結構ありますが、図とテキストの相互変換アプリは知らないので作りました。図→テキストはリアルタイムに変換します。

機能としては以下のものがあります。

  • ネットワークグラフの可視化:テキストデータを可視化します。
  • ネットワークグラフの編集:可視化したグラフに頂点や辺を追加します。
  • 二次元グラフの可視化:テキストデータを可視化します。
  • 二次元グラフの編集:可視化したグラフに点を追加します。

使い方

詳しくはアプリに説明があるので触ってみたほうが早いです。

分かりづらい機能として「頂点固定」がありますが、描画されたグラフは物理モデルによってプルプルしながらいい感じにの見た目に収束するのですが、頂点を固定することによりその頂点は動かなくなります。
これにより物理モデルの影響を受けない直線のグラフなどが作れるようになります。

二次元グラフの可視化は格子点をクリックすると点が打てるというだけです。

開発者募集

GraphVisualizerは開発者を募集してます。バグや追加したい機能がかなりあるので手伝ってください。
「READMEに従ってローカルでGraphVisualizerを動かすことができる」ならどなたでも構いません。

GitやJavaScriptに関して全然わからないので教えあいながらやっていけると嬉しいです。
参加したい方は何か適当に機能提案やバグ報告などのIssueを立てるか、既にあるIssueにコメントするか、私のTwitterにメッセージ飛ばすか、この記事にコメントするか、この記事のURLをTwitterで投稿して「興味ある/参加したい」など言ってください。