11var sprintf = require ( 'sprintf-js' ) . sprintf ;
22var _ = require ( 'underscore' ) ;
33
4+ var config = require ( '../config' ) ;
45var chalk = require ( '../chalk' ) ;
56var log = require ( '../log' ) ;
67var core = require ( '../core' ) ;
@@ -14,6 +15,13 @@ var cmd = {
1415 type : 'boolean' ,
1516 default : false ,
1617 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 )
1725 }
1826 }
1927} ;
@@ -27,40 +35,49 @@ function bar(c, n) {
2735}
2836
2937function prettyLine ( key , done , all ) {
30- done = done || 0 ;
3138 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 ) ;
3341 return sprintf ( ' %-8s %3d/%-3d (%.2f%%)\t%s%s' ,
34- key , done , all , done * 100 / all ,
42+ key , done , all , 100 * percent ,
3543 chalk . green ( bar ( '█' , x ) ) ,
3644 chalk . red ( bar ( '░' , n - x ) ) ) ;
3745}
3846
3947function 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+ } ;
4258
4359 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 ] ;
5370 } ) ;
5471
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 ) ) ;
5875
5976 log . info ( ) ;
6077 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 ) ) ;
6481}
6582
6683function showGraph ( problems ) {
@@ -83,7 +100,7 @@ function showGraph(problems) {
83100 1 , 10 , 11 , 20 , 21 , 30 , 31 , 40 , 41 , 50 ) ) ;
84101
85102 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 ) {
87104 line . push ( graph [ i ] || ' ' ) ;
88105 if ( i % 10 === 0 ) line . push ( ' ' ) ;
89106 if ( i % 50 === 0 || i === n ) {
@@ -104,6 +121,12 @@ cmd.handler = function(argv) {
104121 core . getProblems ( function ( e , problems ) {
105122 if ( e ) return log . fail ( e ) ;
106123
124+ if ( argv . tag !== 'all' ) {
125+ problems = _ . filter ( problems , function ( x ) {
126+ return x . category === argv . tag ;
127+ } ) ;
128+ }
129+
107130 if ( argv . graph ) {
108131 showGraph ( problems ) ;
109132 } else {
0 commit comments