作ったもの
競技プログラミングサイトAtCoderのコンテストの一種であるAtCoder Heuristic Contestのレーティング予測計算機を作りました。
https://github.com/3w36zj6/atcoder-rating-estimator
https://atcoder-rating-estimator.pages.dev/
過去のコンテストの出場記録を元に、次回のコンテストでどれくらいのパフォーマンスを得るとどれくらいのレーティングに到達できるかをグラフで確認できます。

(よろしければstarを頂けると幸いです)
このWebアプリの開発にはSvelteKitというフレームワークを使用しています。技術面に興味のある方は公式サイトをご覧ください。
https://svelte.jp/
Rating計算について
Ver. 1
https://www.dropbox.com/s/ne358pdixfafppm/AHC_rating.pdf
まずi回目(1\leq i \leq N)のコンテストのパフォーマンスをP_iとします。このときに1\leq i\leq Nを満たす全ての整数iと1\leq j\leq 100を満たす全ての整数jに対してP_i-724.4744301\ln{j}を計算し、これらを降順にソートしたものを数列Qとします。
このときQは少なくとも100個の要素を持ち、補正前のRatingであるrは以下の式で与えられます。
r = \frac{\sum_{i=1}^{100}Q_i \times 0.8271973364^i}{\sum_{i=1}^{100}0.8271973364^i}
そして補正後のRatingであるr'は以下の式で与えられます。
r'=
\begin{cases}
r & r\geq 400 \\
\frac{400}{\exp{\frac{400-r}{400}}} & r < 400
\end{cases}
Ver. 2
https://img.atcoder.jp/file/AHC_rating_v2.pdf
Ver. 2では、レーティングの時間減衰と、コンテストごとの重みが導入されました。
あるRatedのコンテストでのパフォーマンスをp'としたとき、減衰パフォーマンスpは、そのコンテストの終了日から最新のRatedコンテストの終了日までの経過日数 (UTC+9 における終了日を基準とする)dを用いて以下の式で与えられます。
p = p' + 150 - 100 \times \frac{d}{365}
また、Ver. 1と同様にソートされた数列Qのi番目の要素に対応するコンテストの重みをw_i、この累積和をs_i=w_1 + \cdots + w_i(ただしs_0=0)、Qの要素数をmとします。このとき、補正前のRatingであるrは以下の式で与えられます。
r = \sum_{i=1}^{m} Q_i \times (0.8271973364^{s_{i-1}} - 0.8271973364^{s_i})
rに対するRatingの補正はVer. 1と同様です。
おわりに
不具合や機能面での要望があれば、お気軽にIssueやPull Requestをお寄せください。また、この記事がAtCoder関連のWebアプリの開発を検討されている方の参考になれば幸いです。
Discussion