「個人戦績検索」の編集履歴(バックアップ)一覧はこちら
「個人戦績検索」(2016/01/20 (水) 02:31:58) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
#divclass(ao){レーティング個人戦績検索}
このページはjavascriptを用いてwikiのページを解析することによってレーティング個人戦績を検索します。
何も表示されない場合、javascriptをONにしてください。
#divclass(simulation){
}
※検索名は完全一致のみ対応
#divclass(rating){
}
#js(){{
var ratingMap = {};
var testHistory = {};
var initCharacter = function(map, name) {
if (!map[name]) {
map[name] = {
rate: 1500,
matches: 0
};
}
return map;
};
var calc = function(map, winner, looser) {
map = initCharacter(map, winner.name);
map = initCharacter(map, looser.name);
// 浮動小数点数の計算誤差のため整数計算する
winner.c = looser.c = 5; // 収束係数(c) *10
var dc;
if (map[winner.name].matches < 4) {
dc = (4 - map[winner.name].matches);
winner.c += dc;
looser.c -= dc;
}
if (map[looser.name].matches < 4) {
dc = (4 - map[looser.name].matches);
winner.c -= dc;
looser.c += dc;
}
// 浮動小数点数に戻す
winner.c /= 10;
looser.c /= 10;
if (winner.point != 50) {
winner.c = 1 - Math.pow(1 - winner.c, winner.point / 50.0);
looser.c = 1 - Math.pow(1 - looser.c, winner.point / 50.0);
}
// レート変動幅(d)
var weight = 20;
// 変動幅係数(e)
var length = winner.point == 50 ? 1 : 50.0 / winner.point;
// (-A + B + d*(n-m)*e)
winner.balance =
-map[winner.name].rate +
map[looser.name].rate +
weight * (winner.point - looser.point) * length
;
looser.balance =
-map[looser.name].rate +
map[winner.name].rate +
weight * (looser.point - winner.point) * length
;
// レート増減分: c * (-A + B + d*(n-m)*e) / 2
winner.charge = winner.c * winner.balance / 2.0;
looser.charge = looser.c * looser.balance / 2.0;
map[winner.name].rate += winner.charge;
map[looser.name].rate += looser.charge;
map[winner.name].matches++;
map[looser.name].matches++;
return map;
};
var display = function(map, target) {
if (!target) {
target = ".rating";
}
var displayMap = [];
var displayMapIndex = 0;
$.each(map, function(name, data) {
displayMap[displayMapIndex] = data;
displayMap[displayMapIndex++].name = name;
});
displayMap.sort(function(a, b) {
if (a.rate > b.rate) {
return -1;
} else if(a.rate < b.rate) {
return 1;
}
return 0;
});
var html = "<table><thead><tr><th>HN</th><th>レーティング</th><th>対戦回数</th></tr></thead><tbody id=\"ratings\">";
for(var i = 0; i < displayMap.length; i++) {
var data = displayMap[i];
html +=
"<tr><th>" +
data.name +
"</th><th>" +
parseInt(data.rate) +
"</th><th>" +
data.matches +
"</th></th>"
;
}
html += "</tbody></table>";
$(target).html(html);
};
var searchName = location.search ? decodeURI(location.search).substr(1) : "";
var searchForm = function() {
var testForm = $("<form>"),
table = $("<table>"),
header = $("<thead>"),
body = $("<tbody>"),
container = $(".simulation")
;
container.empty();
header.append($("<tr><th>名前</th><th> </th></tr>"));
var row = $("<tr>");
var addCol = function(colBody) {
var col = $("<td>");
col.append(colBody);
row.append(col);
}
var addInput = function(id, length) {
var input = $("<input>");
input
.attr("type", "text")
.attr("size", length)
.attr("id", id)
;
addCol(input);
};
addInput("test-search-name", 10);
addCol($("<input>").attr("type", "submit").attr("value", "検索"));
body
.attr("id", "test-rows")
.append(row)
;
table
.append(header)
.append(body)
;
testForm
.attr("id", "test-form")
.append(table)
.submit(function() {
searchName = $("#test-search-name").val();
loadRatingMap();
if ($("#test-clear-inputs").is(':checked')) {
$("#test-search-name").val("");
}
$("#test-search-name").focus();
return false;
})
;
container.append(testForm);
};
var ajaxHandler = function() {
$("#test-search-name").val(searchName);
loadRatingMap();
};
// pjax用
$(function(){
var popped = ('state' in window.history);
var initialURL = document.URL;
if(window.history && window.history.pushState) {
$(window).bind("popstate", function(){
var initialPop = (!popped && document.URL == initialURL);
var popped = true;
if (!initialPop) {
ajaxHandler();
}
return false
});
}
});
var linkify = function(name) {
if (searchName == name) {
return name;
}
var url = document.URL.replace(/\?.*$/, "") + "?" + encodeURI(name);
return $("<a>")
.text(name)
.attr("href", url)
.click(function() {
if (window.history && window.history.pushState) {
window.history.pushState("", "", this.href);
searchName = name;
ajaxHandler();
return false;
}
})
;
}
var loadRatingMap = function() {
if (searchName == "") {
searchForm();
return;
}
$.ajax({
type: "GET",
url : "17.html",
beforeSend: function(XMLHttpRequest) {
$(".rating").html("過去の戦跡読み込み中...");
},
error: function() {
$(".rating").html("戦跡の読み込みに失敗しました");
},
success: function(backupdata) {
$.ajax({
type: "GET",
//url : "27.html",
beforeSend: function(XMLHttpRequest) {
$(".rating").html("戦跡読み込み中...");
},
error: function() {
$(".rating").html("戦跡の読み込みに失敗しました");
},
success: function(data) {
$(".rating").html("計算中...");
data = "<div>" + $(backupdata).find("#wikibody").html() + $(data).find(".senseki").html() + "</div>";
ratingMap = {};
testHistory = {};
var playerMap = $("<table><thead><tr><th>勝者</th><th>敗者</th><th>勝敗</th><th>試合日</th><th>レーティング遷移</th></tr></thead></table>");
var tbody = $("<tbody>").attr("id", "ratings");
$(data).find("table").each(function(elemIndex, elem) {
// #region(トグル用@wikiコマンド)のtableを無視する
if ($(elem).attr("style") != undefined) {
return;
}
$(elem).find("tr").each(function(rowIndex, row) {
var cols = $(row).children("th");
var winner = {
name: cols[0] ? $(cols[0]).text() : "",
point: cols[2] ? parseInt($(cols[2]).text()) : 0
};
var looser = {
name: cols[1] ? $(cols[1]).text() : "",
point: cols[3] ? parseInt($(cols[3]).text()) : 0
};
if (!isNaN(winner.point) && winner.name != "" && winner.name != "勝者" && winner.name != "(・∀・)") {
ratingMap = calc(ratingMap, winner, looser);
}
if (winner.name == searchName || looser.name == searchName) {
tbody.append($("<tr>")
.append($("<th>").append(linkify(winner.name)))
.append($("<th>").append(linkify(looser.name)))
.append($("<th>").append($(cols[2]).text() + "-" + $(cols[3]).text()))
.append($("<th>").append($(cols[4]).text() + "/" + $(cols[5]).text() + "/" + $(cols[6]).text()))
.append($("<th>").append(parseInt(ratingMap[searchName].rate)))
);
}
});
});
searchForm();
$("#test-search-name").val(searchName)
playerMap.append(tbody);
$(".rating").html(playerMap);
$(".rating").prepend("プレイヤー名:" + searchName + "<br>");
//$(".simulated-rating").empty();
}
});
}
});
};
var reloadButton = $("<button type=\"button\">更新</button>");
reloadButton.click(loadRatingMap);
$(".rating").before(reloadButton);
loadRatingMap();
}}
#divclass(ao){レーティング個人戦績検索}
このページはjavascriptを用いてwikiのページを解析することによってレーティング個人戦績を検索します。
何も表示されない場合、javascriptをONにしてください。
#divclass(simulation){
}
※検索名は完全一致のみ対応
#divclass(rating){
}
#js(){{
var ratingMap = {};
var testHistory = {};
var initCharacter = function(map, name) {
if (!map[name]) {
map[name] = {
rate: 1500,
matches: 0
};
}
return map;
};
var calc = function(map, winner, looser) {
map = initCharacter(map, winner.name);
map = initCharacter(map, looser.name);
// 浮動小数点数の計算誤差のため整数計算する
winner.c = looser.c = 5; // 収束係数(c) *10
var dc;
if (map[winner.name].matches < 4) {
dc = (4 - map[winner.name].matches);
winner.c += dc;
looser.c -= dc;
}
if (map[looser.name].matches < 4) {
dc = (4 - map[looser.name].matches);
winner.c -= dc;
looser.c += dc;
}
// 浮動小数点数に戻す
winner.c /= 10;
looser.c /= 10;
if (winner.point != 50) {
winner.c = 1 - Math.pow(1 - winner.c, winner.point / 50.0);
looser.c = 1 - Math.pow(1 - looser.c, winner.point / 50.0);
}
// レート変動幅(d)
var weight = 20;
// 変動幅係数(e)
var length = winner.point == 50 ? 1 : 50.0 / winner.point;
// (-A + B + d*(n-m)*e)
winner.balance =
-map[winner.name].rate +
map[looser.name].rate +
weight * (winner.point - looser.point) * length
;
looser.balance =
-map[looser.name].rate +
map[winner.name].rate +
weight * (looser.point - winner.point) * length
;
// レート増減分: c * (-A + B + d*(n-m)*e) / 2
winner.charge = winner.c * winner.balance / 2.0;
looser.charge = looser.c * looser.balance / 2.0;
map[winner.name].rate += winner.charge;
map[looser.name].rate += looser.charge;
map[winner.name].matches++;
map[looser.name].matches++;
return map;
};
var display = function(map, target) {
if (!target) {
target = ".rating";
}
var displayMap = [];
var displayMapIndex = 0;
$.each(map, function(name, data) {
displayMap[displayMapIndex] = data;
displayMap[displayMapIndex++].name = name;
});
displayMap.sort(function(a, b) {
if (a.rate > b.rate) {
return -1;
} else if(a.rate < b.rate) {
return 1;
}
return 0;
});
var html = "<table><thead><tr><th>HN</th><th>レーティング</th><th>対戦回数</th></tr></thead><tbody id=\"ratings\">";
for(var i = 0; i < displayMap.length; i++) {
var data = displayMap[i];
html +=
"<tr><th>" +
data.name +
"</th><th>" +
parseInt(data.rate) +
"</th><th>" +
data.matches +
"</th></th>"
;
}
html += "</tbody></table>";
$(target).html(html);
};
var searchName = location.search ? decodeURI(location.search).substr(1) : "";
var searchForm = function() {
var testForm = $("<form>"),
table = $("<table>"),
header = $("<thead>"),
body = $("<tbody>"),
container = $(".simulation")
;
container.empty();
header.append($("<tr><th>名前</th><th> </th></tr>"));
var row = $("<tr>");
var addCol = function(colBody) {
var col = $("<td>");
col.append(colBody);
row.append(col);
}
var addInput = function(id, length) {
var input = $("<input>");
input
.attr("type", "text")
.attr("size", length)
.attr("id", id)
;
addCol(input);
};
addInput("test-search-name", 10);
addCol($("<input>").attr("type", "submit").attr("value", "検索"));
body
.attr("id", "test-rows")
.append(row)
;
table
.append(header)
.append(body)
;
testForm
.attr("id", "test-form")
.append(table)
.submit(function() {
searchName = $("#test-search-name").val();
loadRatingMap();
if ($("#test-clear-inputs").is(':checked')) {
$("#test-search-name").val("");
}
$("#test-search-name").focus();
return false;
})
;
container.append(testForm);
};
var ajaxHandler = function() {
$("#test-search-name").val(searchName);
loadRatingMap();
};
// pjax用
$(function(){
var popped = ('state' in window.history);
var initialURL = document.URL;
if(window.history && window.history.pushState) {
$(window).bind("popstate", function(){
var initialPop = (!popped && document.URL == initialURL);
var popped = true;
if (!initialPop) {
ajaxHandler();
}
return false
});
}
});
var linkify = function(name) {
if (searchName == name) {
return name;
}
var url = document.URL.replace(/\?.*$/, "") + "?" + encodeURI(name);
return $("<a>")
.text(name)
.attr("href", url)
.click(function() {
if (window.history && window.history.pushState) {
window.history.pushState("", "", this.href);
searchName = name;
ajaxHandler();
return false;
}
})
;
}
var loadRatingMap = function() {
if (searchName == "") {
searchForm();
return;
}
$.ajax({
type: "GET",
url : "24.html",
beforeSend: function(XMLHttpRequest) {
$(".rating").html("2013年の戦跡読み込み中...");
},
error: function() {
$(".rating").html("戦跡の読み込みに失敗しました");
},
success: function(data2013) {
$.ajax({
type: "GET",
url : "25.html",
beforeSend: function(XMLHttpRequest) {
$(".rating").html("2014年の戦跡読み込み中...");
},
error: function() {
$(".rating").html("戦跡の読み込みに失敗しました");
},
success: function(data2014) {
$.ajax({
type: "GET",
url : "26.html",
beforeSend: function(XMLHttpRequest) {
$(".rating").html("2015年前半の戦跡読み込み中...");
},
error: function() {
$(".rating").html("戦跡の読み込みに失敗しました");
},
success: function(data2015_1) {
$.ajax({
type: "GET",
url : "27.html",
beforeSend: function(XMLHttpRequest) {
$(".rating").html("2015年後半の戦跡読み込み中...");
},
error: function() {
$(".rating").html("戦跡の読み込みに失敗しました");
},
success: function(data2015_2) {
$.ajax({
type: "GET",
url : "29.html",
beforeSend: function(XMLHttpRequest) {
$(".rating").html("2016年の戦跡読み込み中...");
},
error: function() {
$(".rating").html("戦跡の読み込みに失敗しました");
},
success: function(data2016) {
$(".rating").html("計算中...");
data2016 = "<div>" + $(data2013).find("#wikibody").html() + $(data2014).find("#wikibody").html() + $(data2015_1).find("#wikibody").html() + $(data2015_2).find("#wikibody").html() + $(data2016).find("#wikibody").html() + "</div>";
ratingMap = {};
testHistory = {};
var playerMap = $("<table><thead><tr><th>勝者</th><th>敗者</th><th>勝敗</th><th>試合日</th><th>レーティング遷移</th></tr></thead></table>");
var tbody = $("<tbody>").attr("id", "ratings");
$(data2016).find("table").each(function(elemIndex, elem) {
// #region(トグル用@wikiコマンド)のtableを無視する
if ($(elem).attr("style") != undefined) {
return;
}
$(elem).find("tr").each(function(rowIndex, row) {
var cols = $(row).children("th");
var winner = {
name: cols[0] ? $(cols[0]).text() : "",
point: cols[2] ? parseInt($(cols[2]).text()) : 0
};
var looser = {
name: cols[1] ? $(cols[1]).text() : "",
point: cols[3] ? parseInt($(cols[3]).text()) : 0
};
if (!isNaN(winner.point) && winner.name != "" && winner.name != "勝者" && winner.name != "(・∀・)") {
ratingMap = calc(ratingMap, winner, looser);
}
if (winner.name == searchName || looser.name == searchName) {
tbody.append($("<tr>")
.append($("<th>").append(linkify(winner.name)))
.append($("<th>").append(linkify(looser.name)))
.append($("<th>").append($(cols[2]).text() + "-" + $(cols[3]).text()))
.append($("<th>").append($(cols[4]).text() + "/" + $(cols[5]).text() + "/" + $(cols[6]).text()))
.append($("<th>").append(parseInt(ratingMap[searchName].rate)))
);
}
});
});
searchForm();
$("#test-search-name").val(searchName)
playerMap.append(tbody);
$(".rating").html(playerMap);
$(".rating").prepend("プレイヤー名:" + searchName + "<br>");
//$(".simulated-rating").empty();
}
});
}
});
}
});
}
});
}
});
};
var reloadButton = $("<button type=\"button\">更新</button>");
reloadButton.click(loadRatingMap);
$(".rating").before(reloadButton);
loadRatingMap();
}}