@@ -356,26 +356,55 @@ nv.addGraph(function() {
356
356
// x-axis is contest time
357
357
// y axis is # of submissions
358
358
359
+ var max_submissions_per_minute = 0 ;
360
+
359
361
var submission_stats = [
360
362
{% for result in [' correct' , ' wrong-answer' , ' timelimit' , ' run-error' , ' compiler-error' , ' no-output' ] %}
361
363
{
362
364
key: " {{result}}" ,
363
365
color: " {{colors[result]}}" ,
364
- values: [
365
- {# TODO : make sure these are actually ordered by submittime #}
366
- {# TODO : also make sure these submissions are in the same contest #}
367
- [0 ,0 ],
368
- {% set count = 0 % }
369
- {% for submission in submissions | filter (submission => submission .result ) % }
370
- {% if submission .result == result % }{% set count = count + 1 % }{% endif % }
371
- [ {{ (submission .submittime - current_contest .starttime )/ 60.0 }},
372
- {{ count }}
373
- ],
374
- {% endfor % }
375
- ]
366
+ values: []
376
367
},
377
368
{% endfor %}
378
369
];
370
+
371
+ var submissions = [
372
+ {% for submission in submissions %}
373
+ {
374
+ result: " {{ submission.result }}" ,
375
+ submittime: {{ submission .submittime }},
376
+ starttime: {{ current_contest .starttime }}
377
+ }{{ loop .last ? ' ' : ' ,' }}
378
+ {% endfor %}
379
+ ];
380
+
381
+ var contest_duration_minutes = Math .ceil (({{ current_contest .endtime }} - {{ current_contest .starttime }}) / 60 );
382
+
383
+ submission_stats .forEach (stat => {
384
+ stat .values = Array .from ({ length: contest_duration_minutes }, (_ , i ) => [i, 0 ]);
385
+ });
386
+
387
+ const statMap = submission_stats .reduce ((map , stat ) => {
388
+ map[stat .key ] = stat;
389
+ return map;
390
+ }, {});
391
+
392
+ submissions .forEach (submission => {
393
+ let submission_minute = Math .floor ((submission .submittime - submission .starttime ) / 60 );
394
+ let stat = statMap[submission .result ];
395
+ if (stat && submission_minute >= 0 && submission_minute < contest_duration_minutes) {
396
+ stat .values [submission_minute][1 ]++ ;
397
+ }
398
+ });
399
+
400
+ for (let minute = 0 ; minute < contest_duration_minutes; minute++ ) {
401
+ let this_minute_submission_nums = 0 ;
402
+ submission_stats .forEach (stat => {
403
+ this_minute_submission_nums += stat .values [minute][1 ];
404
+ });
405
+ max_submissions_per_minute = Math .max (max_submissions_per_minute, this_minute_submission_nums);
406
+ }
407
+
379
408
nv .addGraph (function () {
380
409
var chart = nv .models .stackedAreaChart ()
381
410
// .margin({left: 100}) //Adjust chart margins to give the x-axis some breathing room.
@@ -388,7 +417,7 @@ nv.addGraph(function() {
388
417
.showYAxis (true ) // Show the y-axis
389
418
.showXAxis (true ) // Show the x-axis
390
419
.forceX ([0 , {{ (current_contest .endtime - current_contest .starttime ) / 60 }}])
391
- .forceY ([0 , {{ submissions | length * 1.10 }} ])
420
+ .forceY ([0 , max_submissions_per_minute * 1.1 ])
392
421
;
393
422
chart .xAxis // Chart x-axis settings
394
423
.axisLabel (' Contest Time(minutes)' )
0 commit comments