@@ -9,67 +9,98 @@ use std::env;
9
9
use std:: fs;
10
10
use std:: path:: { Path } ;
11
11
use std:: io:: Write ;
12
+ use std:: io;
12
13
13
14
/// main() helps to generate the submission template .rs
14
15
fn main ( ) {
15
- let args: Vec < String > = env:: args ( ) . collect ( ) ;
16
- if args. len ( ) < 2 {
17
- panic ! ( "problem id must be provided" ) ;
18
- }
19
- let id_arg = & args[ 1 ] ;
20
- let mut id : u32 = 0 ;
21
- match id_arg. as_ref ( ) {
22
- "random" => {
23
- println ! ( "You select random mode." ) ;
24
- id = get_random_id ( ) ;
25
- println ! ( "Generate random problem: {}" , & id) ;
26
- } ,
27
- _ => {
28
- id = id_arg. parse :: < u32 > ( ) . expect ( & format ! ( "not a number: {}" , id) ) ;
16
+ println ! ( "Welcome to leetcode-rust system." ) ;
17
+ let mut solved_ids = get_solved_ids ( ) ;
18
+ loop {
19
+ println ! ( "Please enter a problem id, or enter \" random\" to generate a random problem." ) ;
20
+ let mut is_random = false ;
21
+ let mut id : u32 = 0 ;
22
+ let mut id_arg = String :: new ( ) ;
23
+ io:: stdin ( ) . read_line ( & mut id_arg)
24
+ . expect ( "Failed to read line" ) ;
25
+ let id_arg = id_arg. trim ( ) ;
26
+ match id_arg {
27
+ "random" => {
28
+ println ! ( "You select random mode." ) ;
29
+ id = generate_random_id ( & solved_ids) ;
30
+ is_random = true ;
31
+ println ! ( "Generate random problem: {}" , & id) ;
32
+ } ,
33
+ _ => {
34
+ id = id_arg. parse :: < u32 > ( ) . expect ( & format ! ( "not a number: {}" , id_arg) ) ;
35
+ if solved_ids. contains ( & id) {
36
+ println ! ( "The problem you chose is invalid (the problem may have been solved \
37
+ or may have no rust version).") ;
38
+ continue ;
39
+ }
40
+ }
29
41
}
30
- }
31
42
32
- let problem = problem:: get_problem ( id)
33
- . expect ( & format ! ( "problem #{} not found" , id) ) ;
34
- let code = problem. code_definition . iter ( )
35
- . filter ( |& d| { d. value == "rust" } )
36
- . next ( )
37
- . expect ( "problem has no rust support yet" ) ;
43
+ let problem = problem:: get_problem ( id)
44
+ . expect ( & format ! ( "problem #{} not found" , id) ) ;
45
+ let code = problem. code_definition . iter ( )
46
+ . filter ( |& d| { d. value == "rust" } )
47
+ . next ( ) ;
48
+ if code. is_none ( ) {
49
+ println ! ( "Problem {} has no rust version." , & id) ;
50
+ solved_ids. push ( id) ;
51
+ continue ;
52
+ }
53
+ let code = code. unwrap ( ) ;
38
54
39
- let file_name = format ! ( "n{:04}_{}" , id, problem. title_slug. replace( "-" , "_" ) ) ;
40
- let file_path = Path :: new ( "./src" ) . join ( format ! ( "{}.rs" , file_name) ) ;
41
- if file_path. exists ( ) {
42
- panic ! ( "problem already initialized" ) ;
43
- }
55
+ let file_name = format ! ( "n{:04}_{}" , id, problem. title_slug. replace( "-" , "_" ) ) ;
56
+ let file_path = Path :: new ( "./src" ) . join ( format ! ( "{}.rs" , file_name) ) ;
57
+ if file_path. exists ( ) {
58
+ panic ! ( "problem already initialized" ) ;
59
+ }
44
60
45
- let template = fs:: read_to_string ( "./template.rs" ) . unwrap ( ) ;
46
- let source = template
47
- . replace ( "__PROBLEM_TITLE__" , & problem. title )
48
- . replace ( "__PROBLEM_DESC__" , & build_desc ( & problem. content ) )
49
- . replace ( "__PROBLEM_DEFAULT_CODE__" , & code. default_code )
50
- . replace ( "__PROBLEM_ID__" , & format ! ( "{}" , id) )
51
- . replace ( "__EXTRA_USE__" , & parse_extra_use ( & code. default_code ) ) ;
61
+ let template = fs:: read_to_string ( "./template.rs" ) . unwrap ( ) ;
62
+ let source = template
63
+ . replace ( "__PROBLEM_TITLE__" , & problem. title )
64
+ . replace ( "__PROBLEM_DESC__" , & build_desc ( & problem. content ) )
65
+ . replace ( "__PROBLEM_DEFAULT_CODE__" , & code. default_code )
66
+ . replace ( "__PROBLEM_ID__" , & format ! ( "{}" , id) )
67
+ . replace ( "__EXTRA_USE__" , & parse_extra_use ( & code. default_code ) ) ;
52
68
53
- let mut file = fs:: OpenOptions :: new ( )
54
- . write ( true )
55
- . create ( true )
56
- . truncate ( true )
57
- . open ( & file_path)
58
- . unwrap ( ) ;
69
+ let mut file = fs:: OpenOptions :: new ( )
70
+ . write ( true )
71
+ . create ( true )
72
+ . truncate ( true )
73
+ . open ( & file_path)
74
+ . unwrap ( ) ;
59
75
60
- file. write_all ( source. as_bytes ( ) ) . unwrap ( ) ;
61
- drop ( file) ;
76
+ file. write_all ( source. as_bytes ( ) ) . unwrap ( ) ;
77
+ drop ( file) ;
62
78
63
- let mut lib_file = fs:: OpenOptions :: new ( )
64
- . write ( true )
65
- . append ( true )
66
- . open ( "./src/lib.rs" )
67
- . unwrap ( ) ;
68
- writeln ! ( lib_file, "mod {};" , file_name) ;
79
+ let mut lib_file = fs:: OpenOptions :: new ( )
80
+ . write ( true )
81
+ . append ( true )
82
+ . open ( "./src/lib.rs" )
83
+ . unwrap ( ) ;
84
+ writeln ! ( lib_file, "mod {};" , file_name) ;
85
+ break ;
86
+ }
69
87
}
70
88
71
- fn get_random_id ( ) -> u32 {
89
+ fn generate_random_id ( except_ids : & Vec < u32 > ) -> u32 {
72
90
use std:: fs;
91
+ use rand:: Rng ;
92
+ let mut rng = rand:: thread_rng ( ) ;
93
+ loop {
94
+ let res : u32 = rng. gen_range ( 1 , 1106 ) ;
95
+ if !except_ids. contains ( & res) {
96
+ return res;
97
+ }
98
+ println ! ( "Generate a random num ({}), but it is invalid (the problem may have been solved \
99
+ or may have no rust version). Regenerate..", res) ;
100
+ }
101
+ }
102
+
103
+ fn get_solved_ids ( ) -> Vec < u32 > {
73
104
let paths = fs:: read_dir ( "./src" ) . unwrap ( ) ;
74
105
let mut solved_ids = Vec :: new ( ) ;
75
106
@@ -83,15 +114,7 @@ fn get_random_id() -> u32 {
83
114
let id = id. parse :: < u32 > ( ) . unwrap ( ) ;
84
115
solved_ids. push ( id) ;
85
116
}
86
- use rand:: Rng ;
87
- let mut rng = rand:: thread_rng ( ) ;
88
- loop {
89
- let res : u32 = rng. gen_range ( 1 , 1106 ) ;
90
- if !solved_ids. contains ( & res) {
91
- return res;
92
- }
93
- println ! ( "Generate a random num ({}), but it is solved. Regenerate.." , res) ;
94
- }
117
+ solved_ids
95
118
}
96
119
97
120
fn parse_extra_use ( code : & str ) -> String {
0 commit comments