Skip to content

Commit 62d8a8c

Browse files
committed
[ProblemSet] Refactor stat command.
* '-t': show statistics by tag. * '-g': fixes graph display bug. Signed-off-by: Eric Wang <[email protected]>
1 parent e1a82b6 commit 62d8a8c

File tree

1 file changed

+44
-21
lines changed

1 file changed

+44
-21
lines changed

lib/commands/stat.js

+44-21
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
var sprintf = require('sprintf-js').sprintf;
22
var _ = require('underscore');
33

4+
var config = require('../config');
45
var chalk = require('../chalk');
56
var log = require('../log');
67
var 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

2937
function 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

3947
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+
};
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

6683
function 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

Comments
 (0)