-
Notifications
You must be signed in to change notification settings - Fork 1
/
test-last.html
77 lines (74 loc) · 3.18 KB
/
test-last.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<html>
<title>AtCoder Rating Estimator</title>
<body>
<script language="javascript" src="atcoder_rating.js"></script>
<script language="javascript">
function calc(last, n, goal_rating) {
goal_rating = unpositivize_rating(goal_rating);
last = unpositivize_rating(last);
if (n == 0) {
return goal_rating + 1200.0; // corner case
}
// binary search
var lo = -10000.0;
var hi = 10000.0;
for (var i = 0; i < 100; ++i) {
var mid = (hi + lo) / 2;
var r = calc_rating_from_last(last, mid, n);
if (r >= goal_rating) {
hi = mid;
} else {
lo = mid;
}
}
return hi;
}
function keydown_enter() {
if(window.event.keyCode == 13) {
document.getElementById("calculate").click();
}
}
function calculatePerformance() {
var last_rating = document.getElementById("last_rating").value;
last_rating = parseInt(last_rating);
var n = document.getElementById("num_rated").value;
n = parseInt(n, 10);
var goal_rating = document.getElementById("goal_rating").value;
goal_rating = parseInt(goal_rating, 10);
document.getElementById("goal_performance").textContent =
calc(last_rating, n, goal_rating).toString();
document.getElementById("delta_last_rating").textContent =
(-f(n)).toString();
document.getElementById("delta_goal_rating").textContent =
(-f(n + 1)).toString();
document.getElementById("raw_last_rating").textContent =
(last_rating + f(n)).toString();
document.getElementById("raw_goal_rating").textContent =
(goal_rating + f(n + 1)).toString();
}
</script>
<h1>AtCoder Rating Estimator</h1>
<p>現在のレート<input type="text" id="last_rating" onkeydown="keydown_enter();">
補正: <span id="delta_last_rating">???</span>
補正前: <span id="raw_last_rating">???</span>
</p>
<p>これまでの参加回数<input type="text" id="num_rated" onkeydown="keydown_enter();"></p>
<p>目標レーティング<input type="text" id="goal_rating" onkeydown="keydown_enter();">
補正: <span id="delta_goal_rating">???</span>
補正前: <span id="raw_goal_rating">???</span>
</p>
<p>必要なパフォーマンス<div id="goal_performance">5000兆</div>
<button type="submit" id="calculate" onclick="calculatePerformance();">計算する</button>
</p>
<div>
<h1>使い方</h1>
AtCoderでの現在のレート、これまでの参加回数、目標レーティングを入力すると、それを次回のコンテストで実現するために必要なパフォーマンスを計算します。
<h2>注意</h2>
数学的には、コンテスト後のレーティングは(1)コンテスト前のレーティング (2)コンテストの参加回数 (3)コンテストでのパフォーマンス の3個のみによって決まり、今までのパフォーマンスの履歴は関係ありません(証明してみよう!)が、実際は丸め誤差が多少入ることになります。
レーティング400以上ならこの誤差は最大で3程度ですが、レーティング400未満の場合はもっと大きな誤差が出ます。誤差が気になる場合は<a href="./test.html">コンテストの履歴を使用して計算する正確な方</a>を使いましょう。
</div>
<div>
作者: koba-e964 (Twitter: <a href="https://twitter.com/kobae964">@kobae964</a>)
</div>
</body>
</html>