Skip to content

Commit f8f1aa7

Browse files
authored
Merge pull request aylei#9 from yue2388253/master
add feature - generate random problem
2 parents 5def24c + c6847a5 commit f8f1aa7

File tree

2 files changed

+104
-38
lines changed

2 files changed

+104
-38
lines changed

src/main.rs

Lines changed: 99 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -9,53 +9,114 @@ 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 = &args[1];
20-
let id = id.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+
}
41+
}
2142

22-
let problem = problem::get_problem(id)
23-
.expect(&format!("problem #{} not found", id));
24-
let code = problem.code_definition.iter()
25-
.filter(|&d| { d.value == "rust" })
26-
.next()
27-
.expect("problem has no rust support yet");
43+
let problem = problem::get_problem(id)
44+
.expect(&format!("Error: failed to get problem #{} \
45+
(The problem may be paid-only or may not be exist).",
46+
id));
47+
let code = problem.code_definition.iter()
48+
.filter(|&d| { d.value == "rust" })
49+
.next();
50+
if code.is_none() {
51+
println!("Problem {} has no rust version.", &id);
52+
solved_ids.push(id);
53+
continue;
54+
}
55+
let code = code.unwrap();
2856

29-
let file_name = format!("n{:04}_{}", id, problem.title_slug.replace("-", "_"));
30-
let file_path = Path::new("./src").join(format!("{}.rs", file_name));
31-
if file_path.exists() {
32-
panic!("problem already initialized");
33-
}
57+
let file_name = format!("n{:04}_{}", id, problem.title_slug.replace("-", "_"));
58+
let file_path = Path::new("./src").join(format!("{}.rs", file_name));
59+
if file_path.exists() {
60+
panic!("problem already initialized");
61+
}
62+
63+
let template = fs::read_to_string("./template.rs").unwrap();
64+
let source = template
65+
.replace("__PROBLEM_TITLE__", &problem.title)
66+
.replace("__PROBLEM_DESC__", &build_desc(&problem.content))
67+
.replace("__PROBLEM_DEFAULT_CODE__", &code.default_code)
68+
.replace("__PROBLEM_ID__", &format!("{}", id))
69+
.replace("__EXTRA_USE__", &parse_extra_use(&code.default_code));
70+
71+
let mut file = fs::OpenOptions::new()
72+
.write(true)
73+
.create(true)
74+
.truncate(true)
75+
.open(&file_path)
76+
.unwrap();
77+
78+
file.write_all(source.as_bytes()).unwrap();
79+
drop(file);
3480

35-
let template = fs::read_to_string("./template.rs").unwrap();
36-
let source = template
37-
.replace("__PROBLEM_TITLE__", &problem.title)
38-
.replace("__PROBLEM_DESC__", &build_desc(&problem.content))
39-
.replace("__PROBLEM_DEFAULT_CODE__", &code.default_code)
40-
.replace("__PROBLEM_ID__", &format!("{}", id))
41-
.replace("__EXTRA_USE__", &parse_extra_use(&code.default_code));
81+
let mut lib_file = fs::OpenOptions::new()
82+
.write(true)
83+
.append(true)
84+
.open("./src/lib.rs")
85+
.unwrap();
86+
writeln!(lib_file, "mod {};", file_name);
87+
break;
88+
}
89+
}
4290

43-
let mut file = fs::OpenOptions::new()
44-
.write(true)
45-
.create(true)
46-
.truncate(true)
47-
.open(&file_path)
48-
.unwrap();
91+
fn generate_random_id(except_ids : &Vec<u32>) -> u32 {
92+
use std::fs;
93+
use rand::Rng;
94+
let mut rng = rand::thread_rng();
95+
loop {
96+
let res :u32 = rng.gen_range(1, 1106);
97+
if !except_ids.contains(&res) {
98+
return res;
99+
}
100+
println!("Generate a random num ({}), but it is invalid (the problem may have been solved \
101+
or may have no rust version). Regenerate..", res);
102+
}
103+
}
49104

50-
file.write_all(source.as_bytes()).unwrap();
51-
drop(file);
105+
fn get_solved_ids() -> Vec<u32> {
106+
let paths = fs::read_dir("./src").unwrap();
107+
let mut solved_ids = Vec::new();
52108

53-
let mut lib_file = fs::OpenOptions::new()
54-
.write(true)
55-
.append(true)
56-
.open("./src/lib.rs")
57-
.unwrap();
58-
writeln!(lib_file, "mod {};", file_name);
109+
for path in paths {
110+
let path = path.unwrap().path();
111+
let s = path.to_str().unwrap();
112+
if s.chars().next().unwrap() != 'n' {
113+
continue;
114+
}
115+
let id = &s[7..11];
116+
let id = id.parse::<u32>().unwrap();
117+
solved_ids.push(id);
118+
}
119+
solved_ids
59120
}
60121

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

src/problem.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ pub fn get_problem(id: u32) -> Option<Problem> {
2121
let problems = get_problems().unwrap();
2222
for problem in problems.stat_status_pairs.iter() {
2323
if problem.stat.question_id == id {
24+
25+
if problem.paid_only {
26+
return None
27+
}
28+
2429
let client = reqwest::Client::new();
2530
let resp: RawProblem = client.post(GRAPHQL_URL)
2631
.json(&Query::question_query(problem.stat.question_title_slug.as_ref().unwrap()))

0 commit comments

Comments
 (0)