1
1
var sprintf = require ( 'sprintf-js' ) . sprintf ;
2
2
var _ = require ( 'underscore' ) ;
3
3
4
+ var config = require ( '../config' ) ;
4
5
var chalk = require ( '../chalk' ) ;
5
6
var log = require ( '../log' ) ;
6
7
var core = require ( '../core' ) ;
@@ -14,6 +15,13 @@ var cmd = {
14
15
type : 'boolean' ,
15
16
default : false ,
16
17
describe : 'Show graphic statistics'
18
+ } ,
19
+ tag : {
20
+ alias : 't' ,
21
+ type : 'string' ,
22
+ default : 'all' ,
23
+ describe : 'Show statistics on given tag' ,
24
+ choices : [ 'all' ] . concat ( config . CATEGORIES )
17
25
}
18
26
}
19
27
} ;
@@ -27,40 +35,49 @@ function bar(c, n) {
27
35
}
28
36
29
37
function prettyLine ( key , done , all ) {
30
- done = done || 0 ;
31
38
var n = 30 ;
32
- var x = Math . ceil ( n * done / all ) ;
39
+ var percent = ( all > 0 ) ? done / all : 0 ;
40
+ var x = Math . ceil ( n * percent ) ;
33
41
return sprintf ( ' %-8s %3d/%-3d (%.2f%%)\t%s%s' ,
34
- key , done , all , done * 100 / all ,
42
+ key , done , all , 100 * percent ,
35
43
chalk . green ( bar ( '█' , x ) ) ,
36
44
chalk . red ( bar ( '░' , n - x ) ) ) ;
37
45
}
38
46
39
47
function showSummary ( problems ) {
40
- var stats = { } ;
41
- var statsNoLock = { } ;
48
+ var stats = {
49
+ easy : { all : 0 , ac : 0 } ,
50
+ medium : { all : 0 , ac : 0 } ,
51
+ hard : { all : 0 , ac : 0 }
52
+ } ;
53
+ var statsNoLock = {
54
+ easy : { all : 0 , ac : 0 } ,
55
+ medium : { all : 0 , ac : 0 } ,
56
+ hard : { all : 0 , ac : 0 }
57
+ } ;
42
58
43
59
problems . forEach ( function ( problem ) {
44
- var keyAll = 'all' + problem . level ;
45
- var keyAC = problem . state + problem . level ;
46
- stats [ keyAll ] = ( stats [ keyAll ] || 0 ) + 1 ;
47
- stats [ keyAC ] = ( stats [ keyAC ] || 0 ) + 1 ;
48
-
49
- if ( ! problem . locked ) {
50
- statsNoLock [ keyAll ] = ( statsNoLock [ keyAll ] || 0 ) + 1 ;
51
- statsNoLock [ keyAC ] = ( statsNoLock [ keyAC ] || 0 ) + 1 ;
52
- }
60
+ var level = problem . level . toLowerCase ( ) ;
61
+ var state = problem . state . toLowerCase ( ) ;
62
+
63
+ if ( ! ( level in stats ) ) return ;
64
+ ++ stats [ level ] . all ;
65
+ if ( ! problem . locked ) ++ statsNoLock [ level ] . all ;
66
+
67
+ if ( ! ( state in stats [ level ] ) ) return ;
68
+ ++ stats [ level ] [ state ] ;
69
+ if ( ! problem . locked ) ++ statsNoLock [ level ] [ state ] ;
53
70
} ) ;
54
71
55
- log . info ( prettyLine ( 'Easy' , stats . acEasy , stats . allEasy ) ) ;
56
- log . info ( prettyLine ( 'Medium' , stats . acMedium , stats . allMedium ) ) ;
57
- log . info ( prettyLine ( 'Hard' , stats . acHard , stats . allHard ) ) ;
72
+ log . info ( prettyLine ( 'Easy' , stats . easy . ac , stats . easy . all ) ) ;
73
+ log . info ( prettyLine ( 'Medium' , stats . medium . ac , stats . medium . all ) ) ;
74
+ log . info ( prettyLine ( 'Hard' , stats . hard . ac , stats . hard . all ) ) ;
58
75
59
76
log . info ( ) ;
60
77
log . info ( 'Without Locked:' ) ;
61
- log . info ( prettyLine ( 'Easy' , statsNoLock . acEasy , statsNoLock . allEasy ) ) ;
62
- log . info ( prettyLine ( 'Medium' , statsNoLock . acMedium , statsNoLock . allMedium ) ) ;
63
- log . info ( prettyLine ( 'Hard' , statsNoLock . acHard , statsNoLock . allHard ) ) ;
78
+ log . info ( prettyLine ( 'Easy' , statsNoLock . easy . ac , statsNoLock . easy . all ) ) ;
79
+ log . info ( prettyLine ( 'Medium' , statsNoLock . medium . ac , statsNoLock . medium . all ) ) ;
80
+ log . info ( prettyLine ( 'Hard' , statsNoLock . hard . ac , statsNoLock . hard . all ) ) ;
64
81
}
65
82
66
83
function showGraph ( problems ) {
@@ -83,7 +100,7 @@ function showGraph(problems) {
83
100
1 , 10 , 11 , 20 , 21 , 30 , 31 , 40 , 41 , 50 ) ) ;
84
101
85
102
var line = [ sprintf ( ' %03d ' , 1 ) ] ;
86
- for ( var i = 1 , n = graph . length ; i < n ; ++ i ) {
103
+ for ( var i = 1 , n = graph . length ; i <= n ; ++ i ) {
87
104
line . push ( graph [ i ] || ' ' ) ;
88
105
if ( i % 10 === 0 ) line . push ( ' ' ) ;
89
106
if ( i % 50 === 0 || i === n ) {
@@ -104,6 +121,12 @@ cmd.handler = function(argv) {
104
121
core . getProblems ( function ( e , problems ) {
105
122
if ( e ) return log . fail ( e ) ;
106
123
124
+ if ( argv . tag !== 'all' ) {
125
+ problems = _ . filter ( problems , function ( x ) {
126
+ return x . category === argv . tag ;
127
+ } ) ;
128
+ }
129
+
107
130
if ( argv . graph ) {
108
131
showGraph ( problems ) ;
109
132
} else {
0 commit comments