Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /