Skip to content

Commit d683d19

Browse files
committed
Regenerate an id in case the previous generated id is invalide.
Now that using "cargo run" is ok! Then the user could follow the guide of the system output to do what he/she wants to do (e.g., generate a random problem or select a particular problem).
1 parent 0a47fcb commit d683d19

File tree

1 file changed

+80
-57
lines changed

1 file changed

+80
-57
lines changed

src/main.rs

Lines changed: 80 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -9,67 +9,98 @@ use std::env;
99
use std::fs;
1010
use std::path::{Path};
1111
use std::io::Write;
12+
use std::io;
1213

1314
/// main() helps to generate the submission template .rs
1415
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+
}
2941
}
30-
}
3142

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();
3854

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+
}
4460

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));
5268

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();
5975

60-
file.write_all(source.as_bytes()).unwrap();
61-
drop(file);
76+
file.write_all(source.as_bytes()).unwrap();
77+
drop(file);
6278

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+
}
6987
}
7088

71-
fn get_random_id() -> u32 {
89+
fn generate_random_id(except_ids : &Vec<u32>) -> u32 {
7290
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> {
73104
let paths = fs::read_dir("./src").unwrap();
74105
let mut solved_ids = Vec::new();
75106

@@ -83,15 +114,7 @@ fn get_random_id() -> u32 {
83114
let id = id.parse::<u32>().unwrap();
84115
solved_ids.push(id);
85116
}
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
95118
}
96119

97120
fn parse_extra_use(code: &str) -> String {

0 commit comments

Comments
 (0)