You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
187 lines
6.5 KiB
187 lines
6.5 KiB
<% |
|
this.title = '统计'; |
|
let types = { |
|
fastest: problem.type === 'submit-answer' ? null : '最快', |
|
slowest: problem.type === 'submit-answer' ? null : '最慢', |
|
shortest: problem.type === 'submit-answer' ? null : '最短', |
|
longest: problem.type === 'submit-answer' ? null : '最长', |
|
earliest: '最早', |
|
min: problem.type === 'submit-answer' ? '最小' : '最小内存', |
|
max: problem.type === 'submit-answer' ? '最大' : '最大内存' |
|
}; |
|
%> |
|
<% include header %> |
|
<script src="<%- lib('raphael/2.2.7/raphael.min.js') %>"></script> |
|
<script src="<%- lib('morris.js/0.5.1/morris.min.js') %>"></script> |
|
<script> |
|
function getColorOfScore(score) { |
|
var color = []; |
|
color[0] = 'red'; |
|
color[1] = '#ff4b00'; |
|
color[2] = '#ff6200'; |
|
color[3] = '#ffa900'; |
|
color[4] = '#ffd800'; |
|
color[5] = '#c8ff00'; |
|
color[6] = '#a5ff00'; |
|
color[7] = '#52ff00'; |
|
color[8] = '#41f741'; |
|
color[9] = '#34d034'; |
|
color[10] = 'forestgreen'; |
|
return color[parseInt(score / 10)]; |
|
} |
|
</script> |
|
<div class="padding"> |
|
<h1 style="text-align: center; margin-bottom: 30px; "> |
|
满分提交 |
|
<span class="ui header" style="margin-left: 10px; "> |
|
<div class="ui compact menu"> |
|
<div class="ui simple dropdown item"> |
|
<%= types[statistics.type] %> |
|
<i class="dropdown icon"></i> |
|
<div class="menu"> |
|
<% for (let type in types) { %> |
|
<% if (type !== statistics.type && types[type] !== null) { %> |
|
<a class="item" href="<%= syzoj.utils.makeUrl(['problem', problem.id, 'statistics', type]) %>"><%= types[type] %></a> |
|
<% } %> |
|
<% } %> |
|
</div> |
|
</div> |
|
</div> |
|
</span> |
|
</h1> |
|
<table class="ui very basic center aligned table" style="white-space: nowrap; "> |
|
<thead> |
|
<tr> |
|
<th>编号</th> |
|
<th>题目</th> |
|
<th>状态</th> |
|
<th>分数</th> |
|
<% if (problem.type !== 'submit-answer') { %> |
|
<th>总时间</th> |
|
<th>内存</th> |
|
<th>代码</th> |
|
<% } else { %> |
|
<th>答案文件</th> |
|
<% } %> |
|
<th>提交者</th> |
|
<th>提交时间</th> |
|
</tr> |
|
</thead> |
|
<tbody> |
|
<% for (let judge of statistics.judge_state) { %> |
|
<% include util %> |
|
<tr> |
|
<td><a href="<%= syzoj.utils.makeUrl(['submission', judge.id]) %>"><b>#<%= judge.id %></b></a></td> |
|
<td><a href="<%= syzoj.utils.makeUrl(['problem', judge.problem_id]) %>"><b>#<%= judge.problem_id %>.</b> <%= judge.problem.title %></a></td> |
|
<td><a href="<%= syzoj.utils.makeUrl(['submission', judge.id]) %>"> |
|
<b> |
|
<span class="status <%= getStatusMeta(judge.status).toLowerCase().split(' ').join('_') %>"> |
|
<i class="<%= icon[getStatusMeta(judge.status)] || 'remove' %> icon"></i> |
|
<%= judge.status %> |
|
</span> |
|
</b> |
|
</a></td> |
|
<td><a href="<%= syzoj.utils.makeUrl(['submission', judge.id]) %>"><span class="score score_<%= parseInt(judge.score / 10) || 0 %>"><%= judge.score %></span></a></td> |
|
<% if (problem.type !== 'submit-answer') { %> |
|
<td><%= judge.total_time %> ms</td> |
|
<td><%= parseInt(judge.max_memory) || 0 %> K</td> |
|
<td><a href="<%= syzoj.utils.makeUrl(['submission', judge.id]) %>"><b><%= syzoj.languages[judge.language].show %></b></a> / <%= syzoj.utils.formatSize(judge.code.length) %></td> |
|
<% } else { %> |
|
<td><%= syzoj.utils.formatSize(judge.max_memory) %></td> |
|
<% } %> |
|
<td><a href="<%= syzoj.utils.makeUrl(['user', judge.user_id]) %>"><%= judge.user.username %></a><% if (judge.user.nameplate) { %><%- judge.user.nameplate %><% } %></td> |
|
<td><%= syzoj.utils.formatDate(judge.submit_time) %></td> |
|
</tr> |
|
<% } %> |
|
</tbody> |
|
</table> |
|
<br> |
|
<% include page %> |
|
<br> |
|
<h1 style="text-align: center; "> |
|
得分分布 |
|
</h1> |
|
<div id="score-distribution-chart" style="height: 250px;"></div> |
|
<script type="text/javascript"> |
|
new Morris.Bar({ |
|
element: 'score-distribution-chart', |
|
data: <%- serializejs(statistics.scoreDistribution) %>, |
|
barColors: function(r, s, type) { |
|
return getColorOfScore(r.label); |
|
}, |
|
xkey: 'score', |
|
ykeys: ['count'], |
|
labels: ['number'], |
|
hoverCallback: function(index, options, content, row) { |
|
var scr = row.score; |
|
return '<div class="morris-hover-row-label">分数:' + scr + '</div><div class="morris-hover-point">数量:' + row.count + '</div>'; |
|
}, |
|
resize: true |
|
}); |
|
</script> |
|
<h1 style="text-align: center; "> |
|
前缀和 |
|
</h1> |
|
<div id="score-distribution-chart-pre" style="height: 250px;"></div> |
|
<script type="text/javascript"> |
|
<% |
|
for (let i in statistics.prefixSum) { |
|
statistics.prefixSum[i].score *= 100; |
|
} |
|
%> |
|
new Morris.Line({ |
|
element: 'score-distribution-chart-pre', |
|
data: <%- serializejs(statistics.prefixSum) %>, |
|
xkey: 'score', |
|
ykeys: ['count'], |
|
labels: ['number'], |
|
lineColors: function(row, sidx, type) { |
|
if (type == 'line') { |
|
return '#0b62a4'; |
|
} |
|
return getColorOfScore(row.src.score / 100); |
|
}, |
|
xLabelFormat: function(x) { |
|
return (x.getTime() / 100).toString(); |
|
}, |
|
hoverCallback: function(index, options, content, row) { |
|
var scr = row.score / 100; |
|
return '<div class="morris-hover-row-label">分数:≤ ' + scr + '</div><div class="morris-hover-point">数量:' + row.count + '</div>'; |
|
}, |
|
resize: true |
|
}); |
|
</script> |
|
<h1 style="text-align: center; "> |
|
后缀和 |
|
</h1> |
|
<div id="score-distribution-chart-suf" style="height: 250px;"></div> |
|
<script type="text/javascript"> |
|
<% |
|
for (let i in statistics.suffixSum) { |
|
statistics.suffixSum[i].score *= 100; |
|
} |
|
%> |
|
new Morris.Line({ |
|
element: 'score-distribution-chart-suf', |
|
data: <%- serializejs(statistics.suffixSum) %>, |
|
xkey: 'score', |
|
ykeys: ['count'], |
|
labels: ['number'], |
|
lineColors: function(row, sidx, type) { |
|
if (type == 'line') { |
|
return '#0b62a4'; |
|
} |
|
return getColorOfScore(row.src.score / 100); |
|
}, |
|
xLabelFormat: function(x) { |
|
return (x.getTime() / 100).toString(); |
|
}, |
|
hoverCallback: function(index, options, content, row) { |
|
var scr = row.score / 100; |
|
return '<div class="morris-hover-row-label">分数:≥ ' + scr + '</div><div class="morris-hover-point">数量:' + row.count + '</div>'; |
|
}, |
|
resize: true |
|
}); |
|
</script> |
|
</div> |
|
<% include footer %>
|
|
|